模擬精靈是首個(gè)公開(kāi)最有效的驗證碼識別技術(shù)的軟件,
使用模擬精靈制作了大量的免費、商用群發(fā)軟件,對很多復雜BT的驗證碼都能成功的識別。
但是驗證碼仍然需要精湛的技術(shù)與足夠的耐心。請牢記這一點(diǎn)。
驗證碼識別不適合浮躁的人去做。
驗證碼識別是一項特殊的技術(shù),任何一個(gè)公開(kāi)的驗證碼識別代碼都會(huì )很快的失效。
因為代碼的公開(kāi)后相關(guān)網(wǎng)站都會(huì )很快的更改驗證碼。
所以下面我只會(huì )介紹其原理。
在這里討論驗證碼識別技術(shù)純粹基于技術(shù)研究目的。
公開(kāi)此技術(shù)也是為了讓更多的網(wǎng)站采取更有效的防范措施。
禁止任何人利用這里介紹的驗證碼識別技術(shù)濫發(fā)垃圾信息。
一、下載驗證碼樣本
打開(kāi)c:\test文件夾,選“查看縮略圖”,
然后重復運行下面的LAScript腳本,每運行一次,就查看c:\test下自動(dòng)生成的圖片,把圖片上的字符改為文件名.
例如圖片上面顯示5,就把文件名改為5.jpg.
如果變化比較復雜的驗證碼,可以對每個(gè)字符多用幾個(gè)樣本,第一個(gè)字符為驗證碼字符,第二個(gè)字符可以為任意字符。
例如:5a.jpg , 5b.jpg , 5c.jpg ...........等等。
樣本多就會(huì )識別能力就越強。
img = image.new();
--下載圖像,沒(méi)有后綴名要顯示指定*.bmp格式
img:Crop(4 ,3 , 56 ,18 )
img:save("c:\\test\\test.jpg") --保存到硬盤(pán)
image.del(img);
--折分圖片,指定一行四列
img2,img3,img4,img5 =

在整個(gè)驗證碼識別過(guò)程中,格式與后綴名一定不能搞錯,否則就會(huì )失敗。
通常:asp的驗證碼是bmp格式,php的驗證碼是png格式,其他驗證碼很多是jpg格式。
簡(jiǎn)單的,在驗證碼上右鍵點(diǎn)選“圖片另存為”,就可以看到格式(不一定準確)。
如果你搞不清楚,這時(shí)候就不要指定后綴名
img:getURL("http://vwww.***.com/test.asp","")
這樣就可以下載了
二、生成驗證碼樣本數據庫
復制下面的代碼并
你就可以在A(yíng)peML源代碼最后面的「數據區塊」中看到生成的驗證碼樣本了。
將「數據區塊」的內容復制需要使用驗證碼識別的fap模擬程序中覆蓋「數據區塊」即可。
--如果一個(gè)字符有多個(gè)樣本,例如 5A.jpg 5B.jpg 5C.jpg
for k,v in pairs(tkey) do
if((#k)~=2)then --如果元素鍵名不是兩位字符
tkey[k.."A" ]=0;
tkey[k.."B" ]=0;
tkey[k.."C" ]=0;
tkey[k]=nil;--刪除單字符的鍵名
end;
end;
--k參數為鍵,v參數表示值 一個(gè)典型的tkeyle迭代器回調函數
loadtkey = function(k,v)
local img = image.new();
img:load("C:\\test\\"..k..".jpg");
assert(img:ok(),"C:\\test\\"..k..".jpg".."\n不是有效的圖片");
img:bpp(1);
img:bpp(24);
--通過(guò)上面兩句,輕松去掉驗證碼上的雜色雜點(diǎn)
img:Crop( 1 , 0 , 9 , 10);--修剪單個(gè)字符
img:median(2);--中值濾波進(jìn)一步去雜點(diǎn)
tkey[k]= string.encode( img:getBytes("*.jpg") , ""); --因為轉換到字符串還是二進(jìn)制,所以用base64進(jìn)行編碼
image.del(img);
end;
--遍歷表tkey的所有元素,調用loadtkey加載圖片文件
for k,v in pairs(tkey) do
loadtkey(k,v);
end;
--把所有圖片保存到數據島,
ape:saveTable(tkey,"驗證碼樣本")
將下面的代碼添加到fap模擬程序最前面的init腳本區塊中即可
需要識別驗證碼的地方添加類(lèi)似下面的代碼:
--因為刷新了驗證碼與頁(yè)面不一致,把驗證碼畫(huà)到屏幕上
local x,y = mouse.getPos()
img:paint(x,y,60 ,20 )
local str = ImgToString(img);
--下面我們把驗證碼的每個(gè)字符都轉換為大寫(xiě),并控制鍵盤(pán)順序按鍵
code1 = string.upper( string.sub(str,1,1) );
code2 = string.upper( string.sub(str,2,2) );
code3 = string.upper( string.sub(str,3,3) );
code4 = string.upper( string.sub(str,4,4) );
key.press(100,code1,code2,code3,code4);
上面我們用了模擬按鍵的方法輸入驗證碼。
實(shí)際上大多時(shí)候可以用更簡(jiǎn)單的方法,如下:

因為我們使用img:getURL讀取驗證碼時(shí)已經(jīng)刷新了驗證碼。
所以驗證碼與頁(yè)面上顯示的并不一樣,您只需要識別最新的驗證碼即可。

有些驗證碼是綁定頁(yè)面的,必須識別頁(yè)面上的驗證碼才行。
那么可以使用image.capture函數直接抓屏屏幕上的圖片即可。
請參考:image.capture函數。
更好的方法是使用函數直接拷貝頁(yè)面上的圖片到剪貼板。
然后使用 img:getClipBD() 獲取圖片。
請參考:函數 img:getClipBD()函數

聯(lián)系客服