ใช้ selenium+tesseract ทดสอบ Captchar
ส่วนใหญ่พวก web app เราจะใส่พวก captchar ด้วยในหน้า login หรือฟอร์มต่าง ๆ เพื่อกันบอทโพสข้อมูลหรือ login ซ้ำ ๆ จนได้ password ใช่ไหมครับ แต่เราเคยสงสัยไหมครับว่า captchar ของเรานี่ดีในระดับไหน
ผมขอเล่าวิธีการทดสอบง่าย ๆ โดยใช้ selemiun กับ tesseract ละกันครับ โดยขอบเขตของการทดสอบคือใช้กับ captchar ที่เป็นตัวอังกฤษภาษาอังกฤษผสมตัวเลขเท่านั้นครับ ภาษาที่ใช้เป็น python ครับ นี่เป็นหน้าตาของส่วน login ที่เราจะทดสอบนะครับ captchar เป็นตัวเลขล้วนครับ
ผมจะอธิบายโค้ดทีละบรรทัดนะครับ
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import sys, string, os, time
#ด้านบนเป็นการ import lib ทั้งหมดครับ
driver = webdriver.Firefox()
driver.get(“http://www.xxx.com/login”)
#เลือก driver ที่เราจะใช้ในการทดสอบตามโค้ดเป็น firefox เมื่อ run จะเปิด firefox ขึ้นมาครับ
assert “Login” in driver.title
#ดูว่า title ของ page มีคำว่า Login หรือไม่ครับ
driver.save_screenshot(‘screenshot.png’)
#ทำ ss ของหน้าเว็ป ตรงนี้สังเกตว่าต้องใช้ ss เพราะ captchar จะเปลี่ยนมี refresh ใหม่ทุกครั้งครับ
os.chdir(‘C:\Program Files\ImageMagick-6.9.0-Q16’)
os.system(‘”convert -crop 145×45+750+270 c:\screenshot.png c:\ss.png”‘)
os.chdir(‘C:\\’)
os.system(‘tesseract ss.png test -psm 7’)
#หลังจากที่ได้ ss แล้วเราก็ crop ภาพให้เหลือแต่ส่วนที่เป็น captchar ครับ แล้วใช้ tesseract ที่เป็น opensource orc แกะตัวอักษรออกมา -psm 7 คือให้อ่านออกมาเหมือนว่ามีบรรทัดเดียวครับ
f = open(‘C:\\test.txt’,’r’)
captchar = f.read()
output = ”
for char in captchar:
if ‘0’<= char <= ‘9’:
output=output+char
#หลังจากได้ captchar มาแล้วจะมีบางส่วนที่อ่านไม่ได้ครับแล้วออกมาเป็นตัวอักษรแปลก ๆ ครับ เราจะต้องกรองให้เหลือแค่ตัวเลขครับ
s = ‘ren ss.png ‘+output+”.png”
os.system(s)
#พอได้ตัวเลขแล้วก็เปลี่ยนชื่อไฟล์เพื่อเช็คว่า captchar ที่อ่านได้ถูกกี่เปอร์เซ็นต์ โค้ดตัวอย่างไม่ได้ทำ for loop นะครับ แต่ผมทดสอบไป 100 ครั้งได้ผลตามสรุปครับ
สรุปแล้วผลที่ผมได้คือ 63% อ่านได้ถูกต้องตัวเลขครบทั้งหกตัว 24% ตัวเลขครบหกตัวแต่จะอ่านตัวเลขผิดส่วนที่ผิดมาก ๆ จะเป็นอ่านเลขแปดเป็นเลขสามครับ อีก 13% อ่านตัวเลขได้ไม่ครบทั้งหกตัวครับ
ซึ่งถ้าเราปรัปเปลี่ยนให้อีก 13% ที่อ่านตัวเลขได้ไม่ครบกลับไป recursive อีกครั้งความเป็นไปได้ที่เราจะอ่าน captchar ได้อย่างถูกต้องจะอยู่ที่ 71% ครับ
จริง ๆ ผมไม่แน่ใจว่า captchar นี่ควรจะกันบอทได้อย่างน้อยกี่ % แต่เข้าใจว่าเกิน 60% ถือว่ามากเกินไปและควรจะเปลี่ยน อ้างอิงจาก recaptchar ของ google ที่มีคนแกะจนอ่านได้เกิน 60% แล้วเริ่ม implement มาใช้ภาพแทนครับ
–วิธีลง PhantomJS บน ubuntu https://gist.github.com/julionc/7476620
Recent Comments