首頁  >  文章  >  後端開發  >  PHP實作簡單驗證碼識別,非常詳細!

PHP實作簡單驗證碼識別,非常詳細!

藏色散人
藏色散人轉載
2020-07-24 14:22:234965瀏覽
##ssccc

一直想寫這個,過了很久今天興趣來了索性記錄下。

驗證碼

全自動區分電腦與人類的公開圖靈測試(英文:Completely Automated Public Turing test to tell Computers and Humans Apart,簡稱CAPTCHA),俗稱驗證碼,是一種區分使用者是電腦和人的公共全自動程式。在CAPTCHA測試中,作為伺服器的電腦會自動產生一個問題由使用者來解答。這個問題可以由電腦產生並評判,但是必須只有人類才能解答。由於電腦無法解答CAPTCHA的問題,所以回答出問題的使用者就可以被認為是人類。
百科介紹

說的簡單點就是隨機生成的字符,輸出在一張圖片上[這裡不考慮其他形式的拖曳/短信驗證碼等等]。

常見類型

PHP實作簡單驗證碼識別,非常詳細!

想法

本文只做示範使用,故取第一張圖片驗證碼作為講解範例。
PHP實作簡單驗證碼識別,非常詳細!

圖片上的每一點都有其RGB值,透過取色器可以取得到,肉眼觀察可以看出該圖驗證碼是純數字純色背景

PHP實作簡單驗證碼識別,非常詳細!

透過取色器看出此驗證碼背景色RGB值為(212,214,204)

實作

下面我們來用PHP的imagecolorsforindex函數取得圖片所有點的RGB值:

$url = 'http://210.32.33.91:8080/reader/captcha.php';
$im = imagecreatefromgif($url);
imagegif($im, '1.gif');
$rgbArray = array();
$res = $im;
$size = getimagesize($url);

$wid = $size['0'];
$hid = $size[&#39;1&#39;];for ($i = 0; $i < $hid; ++ $i) {    for ($j = 0; $j < $wid; ++ $j) {
        $rgb = imagecolorat($res, $j, $i);
        $rgbArray[$i][$j] = imagecolorsforindex($res, $rgb);
    }
}

結果如下:

PHP實作簡單驗證碼識別,非常詳細!



PHP實作簡單驗證碼識別,非常詳細!


##各位可能想問這有什麼用呢? 下面我們換個方式來顯示資料,為背景色輸出PHP實作簡單驗證碼識別,非常詳細!,驗證碼區域輸出
,再來看下:

for ($i = 0; $i < $hid; $i ++) {    for ($j = 0; $j < $wid; $j ++) {        
        if ($rgbArray[$i][$j][&#39;red&#39;] == 212) {            echo &#39;□&#39;;
        } else {            echo &#39;■&#39;;
        }
    }    echo "<br>";
}

效果:
PHP實作簡單驗證碼識別,非常詳細!

#這樣一下是不是很清楚了。

但是你可能還是有疑問,儘管可以看出來了,但是如何知道是多少呢?#下面我們來分析下:
PHP實作簡單驗證碼識別,非常詳細! 每個驗證碼直接間距4格,左右間距6/10格,上下間距16/10格。

我們再來去掉這些幹擾點,可以看得更清晰些:
PHP實作簡單驗證碼識別,非常詳細!

#是不是很清晰了?可能還是有人會問,你講這麼多到底要怎麼知道圖片上的數字是多少.

好吧,說下我的思路,我們將剛剛的

PHP實作簡單驗證碼識別,非常詳細!換成0和1,而這些數字形狀是固定的,這樣就可以得到0-9每一個字的每一個區域8*10都有0和1組成了,

#我們再來進行每8個切分,去掉4格間距,循環得出0-9的01組合值:
PHP實作簡單驗證碼識別,非常詳細!

$dic = array(    &#39;00011000001111000110011011000011110000111100001111000011011001100011110000011000&#39; => 0,    &#39;00011000001110000111100000011000000110000001100000011000000110000001100001111110&#39; => 1,    &#39;00111100011001101100001100000011000001100000110000011000001100000110000011111111&#39; => 2,    &#39;01111100110001100000001100000110000111000000011000000011000000111100011001111100&#39; => 3,    &#39;00000110000011100001111000110110011001101100011011111111000001100000011000000110&#39; => 4,    &#39;11111110110000001100000011011100111001100000001100000011110000110110011000111100&#39; => 5,    &#39;00111100011001101100001011000000110111001110011011000011110000110110011000111100&#39; => 6,    &#39;11111111000000110000001100000110000011000001100000110000011000001100000011000000&#39; => 7,    &#39;00111100011001101100001101100110001111000110011011000011110000110110011000111100&#39; => 8,    &#39;00111100011001101100001111000011011001110011101100000011010000110110011000111100&#39; => 9);

得出這10個後組合成數組,每次解析圖片RGB換成對應數組值就得到驗證碼值了。下面來示範下:

最後為了準確度,取100個循環看看:

##驗證碼識別! #####################哈哈,準確率100%######寫在最後######本文的目的是為了讓WEB開發者在產生驗證碼時注意安全,請勿用於非法目的.#########本計畫所示範的站點(杭州電子科技大學圖書館->我的圖書館)無法打開,各位參考原理即可######

程式碼已在github:https://github.com/chaclee/sf

#

以上是PHP實作簡單驗證碼識別,非常詳細!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除