อันนี้เป็นผลงานร่วมระหว่างผมกับน้องบุ๊ค (@hybridknight) นะครับ จริงๆมีความคิดเรื่องแนวๆนี้ผ่านเข้ามาในหัวเรื่อยๆบ้างตั้งแต่ตอนเรียนวิชาเกมแล้วขี้เกียดลอกอิน เพราะว่าบางทีก็พิมพ์รหัสนิสิตผิด พิมพ์เกินบ้าง ขาดบ้าง บางทีก็พิมพ์ password ตัวเองลงไปผิดช่อง คนอื่นมาเห็นก็แย่เลย บางทีพิมพ์ครบหมดก็ลืมกดยอมรับข้อตกลงอีก ..'' ก็เลยเป็นเรื่องที่ ... annoying พอสมควรครับ
ไอเดียเริ่มต้นคงอธิบายได้ด้วย Conversation ชุดนี้
ปัญหาอย่างเดียวของการลอกอินอัตโนมัติก็คือเจ้า "Captcha" นี่เอง แต่เนื่องจาก captcha ที่เราเจอในเคสนี้ยังไม่หนักหนาสาหัสถึงขั้นจะแกะไม่ได้ครับ มีลักษณะคร่าวๆดังนี้
- ประกอบด้วยสีมากมาย
- มีเส้นพาดไปพาดมามากมายในฉากหลัง
- แต่ละตัวอักษรหมุนเอียงไปในทิศทวนเข็มนาฬิกา (เท่านั้น) ด้วยองศาไม่เท่ากัน
ก็เลยได้ไอเดียที่ว่าจะอ่านตัวอักษรในภาพได้ต้องทำดังต่อไปนี้
แยกเฉพาะตัวอักษรออกมาก่อน ทำโดยการแยกส่วนของภาพที่มีสีของตัวอักษรเท่านั้นออกมา ทำได้โดยการวิเคราะห์ Histogram หากสังเกตดูดีๆก็จะพบว่า สีของตัวอักษรนั้นจะเป็นสีที่ครอบครองพื้นที่ในรูปมากเป็นอันดับสองเสมอ (อันดับหนึ่งคือสี Background) ก็สามารถแยกออกมาได้โดยง่าย
ทำ OCR บนตัวอักษรที่แยกออกมา เลิกคิดเรื่องเขียนเองไปได้เลย หลังจากควานหา library ดูซักพักก็พบ tesseract-ocr ที่ดูแลอยู่โดยพี่ Google แต่เนื่องจากตัว library มันเป็น C/C++ ดังนั้นถ้าจะเอามาใช้กับ .NET ก็จะวุ่นวายพอสมควร จะให้ไปเขียน C/C++ ก็คงมากไปสำหรับโปรเจคเขียนเล่นเอามัน ควานไปเรื่อยๆเจอคนใจดีทำ wrapper ไว้ให้ คือ Tessnet .NET Tesseract wrapper ทำให้ OCR ง่ายไปเลย (โค้ดตัวอย่างจากเว็บ)
Bitmap image = new Bitmap("eurotext.tif");
tessnet2.Tesseract ocr = new tessnet2.Tesseract();
ocr.SetVariable("tessedit_char_whitelist", "0123456789"); // If digit only
ocr.Init("fra", false); // To use correct tessdata
List<tessnet2.Word> result = ocr.DoOCR(image, Rectangle.Empty);
foreach (tessnet2.Word word in result)
Console.WriteLine("{0} : {1}", word.Confidence, word.Text);
หลังจากได้ทุกอย่างมาครบ ก็เริ่มทำโปรเจค มีการใช้คลาสพวก HttpWebRequest พวกนี้นิดหน่อยตามธรรมชาติของโปรแกรมลักษณะนี้
ผมได้โปรแกรมตั้งต้นหน้าตาเป็นแบบนี้
และหลังผ่านการปรับปรุงและเพิ่ม Feature เช่นแก้ส่วนของ Keep-Alive, จัดโปรแกรมลง Tray, และอื่นๆ โดยคุณน้องบุ๊ค @hybridknight ก็ได้อะไรประมาณนี้ออกมา http://twitpic.com/xmfe
โปรเจคนี้ทำเล่นเอามัน และ communicate ผ่าน Twitter ตลอด (จนเพื่อนบางคนอาจจะรำคาญ - -''a) ไม่มีจุดประสงค์ใดแอบแฝง
ตัวโปรแกรมและซอร์สโค้ด จะอัญเชิญเวอร์ชันล่าสุดจากน้องมาโปะให้เร็วๆนี้นะครับ และโปรแกรมนี้เพื่อการศึกษาเท่านั้นนะ :P
Tags: security, c#, c++, ocr, .net, cp, network, fun