抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

关于PHP识别验证码可以查看上一篇文章:《PHP实现验证码的识别(初级篇)》

一、获取图片网址

在验证码图片处点击右键,选择复制图片网址选项,可以得到图片的网址:
http://www.net.cn/has_client/include/pwdcode.asp
可以看出,此验证码是通过pwdcode.asp文件得到的。

二、获取图片格式

在验证码图片处点击右键,选择图片另存为选项,发现此图片为bmp格式。
但是php中并没有打开bmp格式图片的函数,所以只好在网上找了一段bmp转jpg的php代码。

将bmp图片转换为jpg格式后,发现图片失真严重:
This is a picture without description

图片背景有很多噪点,其实现在有很多网站的验证码也差不多是这个样子的。

用php重新识别了一下验证码:
This is a picture without description

出错了,1251识别成1855,现在只能重新修改颜色判断的代码了。

三、增加代码兼容性

用屏幕取色工具观察颜色的规律,发现数字颜色的R,G,B值大部分都小于160,而背景颜色大部分都大于160,所以把颜色判断条件改为:

1
if($rgbarray['red'] < 160 || $rgbarray['green'] < 160 || $rgbarray['blue'] < 160)

重新识别一下,发现可以成功识别出来了:
This is a picture without description

四、获取提交的网址

最简单的方法是用firefox的firebug插件查看提交的网址,发现提交的网址为:
http://www.net.cn/has\_client/whois1.asp?tongyong=yes&domain=poboke&code=1251
其中参数domain是要查询的通用网址,code是验证码。
所以只要识别出验证码,再提交这个网址就行了。

五、保存图片和cookie

服务器是根据cookie值来识别某个验证码的,所以获取验证码时,要保存服务器返回的cookie,并且把图片保存到本地,转换成jpg格式后再识别,参考代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$url = "http://www.net.cn/has_client/include/pwdcode.asp";
$cookie = dirname(__FILE__)."/valid.tmp";

//访问验证码图片网址,把返回的cookie保存为valid.tmp文件
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_REFERER, $referer);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie);
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie);
$data = curl_exec($curl);
curl_close($curl);

//保存验证码图片
$fp = fopen("valid.bmp","wb");
fwrite($fp, $data);
fclose($fp);

//转换图片格式
$img = ImageCreateFromBmp("valid.bmp");
imagejpeg($img, "valid.jpg");

//识别验证码图片
$valid = new Valite();
$valid->setImage("valid.jpg");
$valid->getHec();
$validCode = $valid->run();

六、提交验证码

前面已经识别出验证码和保存了cookie了,现在就要提交验证码,并发送cookie。
为了方便,模仿了通用网址查询的输入框,参考代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//输入框表单
echo iconv('utf-8', 'gbk', "通用网址查询:<br>");
echo "<form name='form' method='get' action=''>";
echo "<input type='text' name='domain' value='poboke'/><br>";
echo "<input type='text' name='code' value='$validCode' size=10/> ";
echo '<img src="valid.jpg"><br>';
echo "<input type='submit' /><br>";
echo "</form>";

if($_GET['domain'])
{
//发送cookie和验证码
$domain = $_GET['domain'];
$url = "http://www.net.cn/has_client/whois1.asp?tongyong=yes&domain=$domain&code=$validCode";
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_REFERER, $referer);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie);
$src = curl_exec($curl);
curl_close($curl);

//匹配出返回的结果并显示出来
preg_match('|10.5pt\'>(.*)<br>|U', $src, $res);
echo $res[1];
}

运行结果如下:
This is a picture without description

七、源码下载

点击下载源码

评论