免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

PHP驗(yàn)證碼識(shí)別的示例分析

這篇文章主要介紹PHP驗(yàn)證碼識(shí)別的示例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了湖南免費(fèi)建站歡迎大家使用!

php有什么用

php是一個(gè)嵌套的縮寫名稱,是英文超級(jí)文本預(yù)處理語言,它的語法混合了C、Java、Perl以及php自創(chuàng)新的語法,主要用來做網(wǎng)站開發(fā),許多小型網(wǎng)站都用php開發(fā),因?yàn)閜hp是開源的,從而使得php經(jīng)久不衰。

網(wǎng)站的登陸頁、注冊(cè)頁等等等到處都是驗(yàn)證碼,然而你的驗(yàn)證碼真的安全么?也許只需要一段簡(jiǎn)單的小程序,你的驗(yàn)證碼就會(huì)如同虛設(shè)。本文只是簡(jiǎn)單實(shí)現(xiàn),不會(huì)太過深入。

有攻就有防

寫這篇文章完全是因?yàn)橥碌墓娞?hào)發(fā)了一篇文章叫"實(shí)踐-寫個(gè)驗(yàn)證碼",你簡(jiǎn)單寫了一下,我就簡(jiǎn)單破解一下試試,生活處處有樂趣啊~

生成驗(yàn)證碼

Copy代碼,執(zhí)行,生成如下驗(yàn)證碼:

PHP驗(yàn)證碼識(shí)別的示例分析

如圖我們能發(fā)現(xiàn),這個(gè)驗(yàn)證碼格式特別"規(guī)范",字體大小一樣,顏色都是黑色,讓我們省了不少事兒。

二值化

程序讀圖,二值化(關(guān)鍵點(diǎn)在于查找字體顏色的閾值,這個(gè)驗(yàn)證碼都是黑色,so...),通過程序一個(gè)像素點(diǎn)一個(gè)像素點(diǎn)判斷,將屬于字體顏色的標(biāo)記為*,非字體顏色標(biāo)記為0

PHP驗(yàn)證碼識(shí)別的示例分析

<center>從上面的圖,能夠大概看出驗(yàn)證碼的樣子(YTAD)</center>

分析圖像,切割

切割出字符串(先切綠線,再分別切藍(lán)線,這樣即使這個(gè)字符上下移動(dòng)一下,也不太容易影響我們的切割)

PHP驗(yàn)證碼識(shí)別的示例分析

提取特征碼

將字符串拆分后,我們多次獲取驗(yàn)證碼,將a-z,A-Z,0-9等驗(yàn)證碼的特征碼全部記錄下來。

PHP驗(yàn)證碼識(shí)別的示例分析

<center>這個(gè)是提取出來的字母Y</center>

識(shí)別

識(shí)別的過程就是重復(fù)上面的:二值化->切割->提取特征碼,再加上和之前提取的特征碼比對(duì)相似度,就OK了。

PHP代碼實(shí)現(xiàn)

/**
 * 簡(jiǎn)單驗(yàn)證碼識(shí)別
 * @author zhjx922
 */

class vCode{

    //字符特征碼
    private $_wordKeys = array (
        'A' => '000**00000****000**00**0**0000****0000****0000************0000****0000****0000**',
        'B' => '******00**000**0**0000****000**0******00**000**0**0000****0000****000**0******00',
        'C' => '00*****00**000****00000***000000**000000**000000**000000**00000*0**000**00*****0',
        'D' => '******00**000**0**0000****0000****0000****0000****0000****0000****000**0******00',
        'E' => '*********00000**00000**00000******0**00000**00000**00000**00000*******',
        'F' => '**********000000**000000**000000******00**000000**000000**000000**000000**000000',
        'G' => '00*****00**000****000000**000000**000000**000*****0000****0000**0**000**00*****0',
        'H' => '**0000****0000****0000****0000************0000****0000****0000****0000****0000**',
        'I' => '******00**0000**0000**0000**0000**0000**0000**0000**00******',
        'J' => '00****0000**0000**0000**0000**0000**0000***000****0**00***00',
        'K' => '**0000****000**0**00**00**0**000****0000****0000**0**000**00**00**000**0**0000**',
        'L' => '**00000**00000**00000**00000**00000**00000**00000**00000**00000*******',
        'M' => '**0000*****00*************0**0****0**0****0**0****0000****0000****0000****0000**',
        'N' => '**0000*****000******00******00****0**0****0**0****00******000*****000*****0000**',
        'P' => '*******0**0000****0000****0000*********0**000000**000000**000000**000000**000000',
        'Q' => '00****000**00**0**0000****0000****0000****0000****0**0****00****0**00**000****0*',
        'R' => '*******0**0000****0000****0000*********0*****000**00**00**000**0**0000****0000**',
        'S' => '0******0**0000****000000**0000000******0000000**000000**000000****0000**0******0',
        'T' => '********000**000000**000000**000000**000000**000000**000000**000000**000000**000',
        'U' => '**0000****0000****0000****0000****0000****0000****0000****0000**0**00**000****00',
        'V' => '**0000****0000****0000**0**00**00**00**00**00**000****0000****00000**000000**000',
        'W' => '**0000****0000****0000****0000****0**0****0**0****0**0*************00*****0000**',
        'X' => '**0000****0000**0**00**000****00000**000000**00000****000**00**0**0000****0000**',
        'Y' => '**0000****0000**0**00**000****00000**000000**000000**000000**000000**000000**000',
        'Z' => '*******00000**00000**0000**0000**0000**0000**0000**00000**00000*******',
        'a' => '00*****00**000**000000**0*********0000****000***0****0**',
        'b' => '**000000**000000**000000**0***00***00**0**0000****0000****0000*****00**0**0***00',
        'c' => '00*****00**000****000000**000000**0000000**000**00*****0',
        'd' => '000000**000000**000000**00***0**0**00*****0000****0000****0000**0**00***00***0**',
        'e' => '00****000**00**0**0000************0000000**000**00*****0',
        'f' => '000****000**00**00**00**00**000000**0000******0000**000000**000000**000000**0000',
        'g' => '0*****0***000*****000**0**000**00*****00**0000000******0**0000**0******0',
        'h' => '**000000**000000**000000**0***00***00**0**0000****0000****0000****0000****0000**',
        'i' => '00**0000**000000000***0000**0000**0000**0000**0000**00******',
        'k' => '**00000**00000**00000**00**0**0**00****000****000**0**00**00**0**000**',
        'l' => '***00**00**00**00**00**00**00**00**0****',
        'm' => '*0**0**0**0**0****0**0****0**0****0**0****0**0****0**0**',
        'n' => '**0***00***00**0**0000****0000****0000****0000****0000**',
        'o' => '00****000**00**0**0000****0000****0000**0**00**000****00',
        'p' => '**0***00***00**0**0000****0000****0000*****00**0**0***00**000000**000000',
        'q' => '00***0**0**00*****0000****0000****0000**0**00***00***0**000000**000000**',
        'r' => '**0****00***00**0**000000**000000**000000**000000**00000',
        's' => '0******0**0000****0000000******0000000****0000**0******0',
        't' => '00**000000**0000******0000**000000**000000**000000**000000**00**000****0',
        'u' => '**0000****0000****0000****0000****0000**0**00***00***0**',
        'v' => '**0000****0000**0**00**00**00**000****0000****00000**000',
        'w' => '**0000****0000****0**0****0**0****0**0**********0**00**0',
        'x' => '**0000**0**00**000****00000**00000****000**00**0**0000**',
        'y' => '**0000****0000****0000****0000****0000**0**00***00***0***00000**0******0',
        'z' => '******0000**000**000**000**000**0000******',
        '0' => '000**00000****000**00**0**0000****0000****0000****0000**0**00**000****00000**000',
        '1' => '00**000***00****0000**0000**0000**0000**0000**0000**00******',
        '2' => '00****000**00**0**0000**000000**00000**00000**00000**00000**00000**00000********',
        '3' => '0*****00**000**0000000**00000**0000***0000000**0000000**000000****000**00*****00',
        '4' => '00000**00000***0000****000**0**00**00**0**000**0********00000**000000**000000**0',
        '5' => '*******0**000000**000000**0***00***00**0000000**000000****0000**0**00**000****00',
        '6' => '00****000**00**0**0000*0**000000**0***00***00**0**0000****0000**0**00**000****00',
        '7' => '********000000**000000**00000**00000**00000**00000**00000**00000**000000**000000',
        '8' => '00****000**00**0**0000**0**00**000****000**00**0**0000****0000**0**00**000****00',
        '9' => '00****000**00**0**0000****0000**0**00***00***0**000000**0*0000**0**00**000****00',
    );

    /**
     * 生成驗(yàn)證碼
     * @author 武老師
     */
    public function make($verCode = '') {
        if(empty($verCode)) {
            $baseChars     = 'ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789';
            $verCode       = '';
            $codeCharLenth = 4;
            for ($i = 1; $i <= $codeCharLenth; $i++) {
                // 通過字符串下標(biāo)形式隨機(jī)獲取
                $verCode .= $baseChars{mt_rand(0, strlen($baseChars) - 1)};
            }
        }

        // 以下代碼是將生成的驗(yàn)證碼生成圖片
        $font_size = 20;
        $width     = 60;
        $height    = 30;
        $img       = imagecreate($width, $height); // 新建一個(gè)基于調(diào)色板的圖像

        $bgR        = mt_rand(50, 200); //r(ed)
        $bgG        = mt_rand(50, 200); //g(reen)
        $bgB        = mt_rand(50, 200); //b(lue)
        $background = imagecolorallocate($img, $bgR, $bgG, $bgB); // 背景色
        $black      = imagecolorallocate($img, 0, 0, 0);

        imagestring($img, 5, 9, 8, $verCode, $black); // 水平地畫一行字符串

        ob_start();
        imagepng($img);
        $image = ob_get_contents();
        ob_end_clean();

        return array(
            'image' =>  $image,
            'code'  =>  $verCode
        );
    }

    /**
     * 獲取原始圖像數(shù)組
     * @param string $imageString
     * @return array
     */
    public function getImage($imageString) {
        $im = imagecreatefromstring($imageString);

        list($width, $height) = getimagesizefromstring($imageString);

        $image = array();

        for($x = 0;$x < $width;$x++) {
            for($y =0;$y < $height;$y++) {
                $rgb = imagecolorat($im, $x, $y);
                $rgb = imagecolorsforindex($im, $rgb);
                if($rgb['red'] == 0 && $rgb['green'] == 0 && $rgb['blue'] == 0) {
                    $image[$y][$x] = '*';
                } else {
                    $image[$y][$x] = 0;
                }
            }
        }

        return $image;
    }

    /**
     * 移除無用數(shù)據(jù)
     * @param array $image
     * @return array
     */
    public function remove($image) {
        //計(jì)算x和y軸的
        $xCount = count($image[0]); //60
        $yCount = count($image); //30

        $xFilter = array();
        for($x = 0;$x < $xCount;$x++) {
            $filter = true;
            for($y = 0;$y < $yCount;$y++) {
                $filter = $filter && ($image[$y][$x] == '0');
            }
            if($filter) {
                $xFilter[] = $x;
            }
        }

        //有字符的列
        $xImage = array_values(array_diff(range(0, 59), $xFilter));

        //存放關(guān)鍵字
        $wordImage = array();

        $preX = $xImage[0] - 1;
        $wordCount = 0;
        foreach($xImage as $xKey => $x) {
            if($x != ($preX + 1)) {
                $wordCount++;
            }
            $preX = $x;

            for($y = 0;$y < $yCount;$y++) {
                $wordImage[$wordCount][$y][$x] = $image[$y][$x];
            }
        }

        foreach($wordImage as $key=>$image) {
            $wordImage[$key] = $this->removeByLine($image);
        }


        return $wordImage;

    }

    /**
     * 按行移除無用數(shù)據(jù)
     * @param array $image
     * @return array
     */
    public function removeByLine($image) {

        $isFilter = false;
        foreach($image as $y => $yImage) {
            if($isFilter == true || array_filter($yImage)) {
                $isFilter = true;
            } else {
                unset($image[$y]);
            }
        }

        krsort($image);

        $isFilter = false;
        foreach($image as $y => $yImage) {
            if($isFilter == true || array_filter($yImage)) {
                $isFilter = true;
            } else {
                unset($image[$y]);
            }
        }

        ksort($image);

        return $image;
    }

    /**
     * 獲取關(guān)鍵字字符串
     * @param array $wordImage
     * @return string
     */
    public function getWordString($wordImage) {
        $wordString = '';
        foreach($wordImage as $image) {
            foreach($image as $string) {
                $wordString .= $string;
            }
        }

        return $wordString;
    }

    /**
     * 匹配關(guān)鍵字
     * @param array $image
     * @return array
     */
    public function match($image) {
        $match = array(
            'min' => '',
            'key' => ''
        );
        foreach($this->_wordKeys as $k => $v) {
            $percent = 0.0;
            similar_text($this->getWordString($image), $v, $percent);
            if($match['min'] == '') {
                $match['min'] = $percent;
                $match['key'] = $k;
            } else {
                if($percent > $match['min']) {
                    $match['min'] = $percent;
                    $match['key'] = $k;
                }
            }
        }

        return $match;
    }

    /**
     * 終端顯示驗(yàn)證碼
     * @param $image
     */
    public function show($image) {
        foreach($image as $xImage) {
            foreach($xImage as $yImage) {
                echo $yImage;
            }
            echo PHP_EOL;
        }
        echo PHP_EOL;
    }
}


$vCode = new vCode();

$codeImage = $vCode->make();
$imageString = $codeImage['image'];

$image = $vCode->getImage($imageString);
//原圖
$vCode->show($image);

//去除干擾邊框、拆字
$newImage = $vCode->remove($image);
$word = array();
$code = '';
foreach($newImage as $image) {
    $vCode->show($image);
    $code .= $vCode->match($image)['key'];
}

echo "生成的驗(yàn)證碼為:{$codeImage['code']}" . PHP_EOL;
echo "識(shí)別的驗(yàn)證碼為:{$code}" . PHP_EOL;


/*
//用來批量生成驗(yàn)證碼的特征碼。識(shí)別他人網(wǎng)站驗(yàn)證碼,需要自己采集多張,人肉標(biāo)記特征碼
$vCode = new vCode();

$string = 'ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789';

$max = ceil(strlen($string) / 4);

$wordKeys = array();

for($i=0;$i<$max;$i++) {
    $code = substr($string, $i * 4, 4);
    $imageString = $vCode->make($code)['image'];


    $image = $vCode->getImage($imageString);
    $newImage = $vCode->remove($image);
    foreach($newImage as $key => $image) {
        $word = $vCode->getWordString($image);
        isset($code[$key]) && $wordKeys[$code[$key]] = $word;
    }
}

echo var_export($wordKeys);
*/

運(yùn)行結(jié)果:

PHP驗(yàn)證碼識(shí)別的示例分析

以上是“PHP驗(yàn)證碼識(shí)別的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

網(wǎng)頁題目:PHP驗(yàn)證碼識(shí)別的示例分析
轉(zhuǎn)載來于:http://m.newbst.com/article0/jicgoo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站品牌網(wǎng)站建設(shè)定制網(wǎng)站面包屑導(dǎo)航定制開發(fā)網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)