Home >Backend Development >PHP Tutorial >PHP implements simple verification code recognition, very detailed!

PHP implements simple verification code recognition, very detailed!

藏色散人
藏色散人forward
2020-07-24 14:22:235068browse

I’ve always wanted to write this, but after a long time, I got interested and decided to record it.

CAPTCHA

Completely Automated Public Turing test to tell Computers and Humans Apart (CAPTCHA), commonly known as CAPTCHA, is a fully automatic public Turing test to tell computers and humans apart. A public automatic program that distinguishes users from computers and humans. In a CAPTCHA test, the computer as the server automatically generates a question for the user to answer. This question can be generated and judged by a computer, but only a human can answer it. Since computers cannot answer CAPTCHA questions, the user who answers the questions can be considered a human.
Encyclopedia Introduction

To put it simply, it is randomly generated characters and output on a picture [other forms of drag and drop/SMS verification codes, etc. are not considered here].

Common types

PHP implements simple verification code recognition, very detailed!

Ideas

This article is for demonstration only, so the first picture verification code is taken As an example to explain.
PHP implements simple verification code recognition, very detailed!

Every point on the picture has its RGB value, which can be obtained through the color picker. It can be seen with the naked eye that the verification code of the picture is a pure digital solid color. Background

PHP implements simple verification code recognition, very detailed!

It can be seen through the color picker that the background color RGB value of the verification code is (212,214,204)

Implementation

Let’s use PHP’s imagecolorsforindex function to obtain the RGB values ​​of all points in the image:

$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);
    }
}

The results are as follows:

PHP implements simple verification code recognition, very detailed!


You may want to ask what is the use of this? Let's change the way to display the data, output for the background color, and ■## for the verification code area. #, Let’s take a look again:

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>";
}

Effect:


PHP implements simple verification code recognition, very detailed!

Is it clear now?

But you may still have questions. Although you can see it, how do you know how much it is?

Let’s analyze it below:


PHP implements simple verification code recognition, very detailed! The distance between each verification code is 4 spaces, the left and right spacing is 6/10 spaces, and the top and bottom spacing is 16/10 spaces.

Let’s remove these interference points again, so that we can see more clearly:


PHP implements simple verification code recognition, very detailed! Is it very clear? Some people may still ask, you said this How can we know what the numbers on the picture are?

Okay, let me tell you my idea. Let’s replace the

and with 0 and 1, and the shapes of these numbers are fixed, so you can get 0-9. Each area of ​​each word 8*10 is composed of 0 and 1,
PHP implements simple verification code recognition, very detailed!

Let's do every 8 segments again, remove the 4-space spacing, and loop to get the 01 combination value of 0-9:


PHP implements simple verification code recognition, very detailed!

$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);

Get These 10 are combined into an array. Each time the image RGB is parsed and replaced with the corresponding array value, the verification code value is obtained. Let’s demonstrate below:

PHP implements simple verification code recognition, very detailed!

Finally, for the sake of accuracy, take 100 cycles and see:

Verification code recognition !
PHP implements simple verification code recognition, very detailed!

Haha, the accuracy is 100%

Written at the end

The purpose of this article is to facilitate WEB development Please pay attention to safety when generating the verification code, please do not use it for illegal purposes.

The site demonstrated in this project (Hangzhou Dianzi University Library->My Library) cannot be opened, everyone Just refer to the principle

The code is on github:https://github.com/chaclee/sf

The above is the detailed content of PHP implements simple verification code recognition, very detailed!. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:segmentfault.com. If there is any infringement, please contact admin@php.cn delete