PHP识别验证码后提交
关于PHP识别验证码可以查看上一篇文章:《PHP实现验证码的识别(初级篇)》 。
一、获取图片网址
在验证码图片处点击右键,选择复制图片网址选项,可以得到图片的网址:
http://www.net.cn/has_client/include/pwdcode.asp
可以看出,此验证码是通过pwdcode.asp
文件得到的。
二、获取图片格式
在验证码图片处点击右键,选择图片另存为选项,发现此图片为bmp格式。
但是php中并没有打开bmp格式图片的函数,所以只好在网上找了一段bmp转jpg的php代码。
将bmp图片转换为jpg格式后,发现图片失真严重:
图片背景有很多噪点,其实现在有很多网站的验证码也差不多是这个样子的。
用php重新识别了一下验证码:
出错了,1251识别成1855,现在只能重新修改颜色判断的代码了。
三、增加代码兼容性
用屏幕取色工具观察颜色的规律,发现数字颜色的R,G,B值大部分都小于160,而背景颜色大部分都大于160,所以把颜色判断条件改为:
1
| if($rgbarray['red'] < 160 || $rgbarray['green'] < 160 || $rgbarray['blue'] < 160)
|
重新识别一下,发现可以成功识别出来了:
四、获取提交的网址
最简单的方法是用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";
$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']) { $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]; }
|
运行结果如下:
七、源码下载
点击下载源码