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
Ideas
This article is for demonstration only, so the first picture verification code is taken As an example to explain.
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
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['1'];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:
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]['red'] == 212) { echo '□'; } else { echo '■'; } } echo "<br>"; }Effect:
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.
Is it very clear? Some people may still ask, you said this How can we know what the numbers on the picture are?
□ 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,
$dic = array( '00011000001111000110011011000011110000111100001111000011011001100011110000011000' => 0, '00011000001110000111100000011000000110000001100000011000000110000001100001111110' => 1, '00111100011001101100001100000011000001100000110000011000001100000110000011111111' => 2, '01111100110001100000001100000110000111000000011000000011000000111100011001111100' => 3, '00000110000011100001111000110110011001101100011011111111000001100000011000000110' => 4, '11111110110000001100000011011100111001100000001100000011110000110110011000111100' => 5, '00111100011001101100001011000000110111001110011011000011110000110110011000111100' => 6, '11111111000000110000001100000110000011000001100000110000011000001100000011000000' => 7, '00111100011001101100001101100110001111000110011011000011110000110110011000111100' => 8, '00111100011001101100001111000011011001110011101100000011010000110110011000111100' => 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:
Finally, for the sake of accuracy, take 100 cycles and see:
Verification code recognition !
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