关于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,所以把颜色判断条件改为:
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格式后再识别,参考代码如下:
$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。
为了方便,模仿了通用网址查询的输入框,参考代码如下:
//输入框表单 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]; }
运行结果如下:
.
2014/08/20 15:46:54
[…] 原理参考: php实现验证码的识别(初级篇) php识别验证码后提交 […]
2014/03/23 12:36:44
2013/04/27 11:32:26
2013/04/27 11:47:58
好啊
2012/12/14 20:26:20
大哥 请教一下,按照你的做法,我这里生成的图片就固定了 不会变。 是不是因为网站的验证码实现方式不一样?
2012/12/14 22:37:08
每个网站的验证码都不一样,你要自己制作字模。
2012/12/15 14:27:36
我把字模改过来了 还是不对哦。 不知道什么原因
2012/12/15 13:10:21
我这边生成的图片固定不变 就是因为字模不对的原因吗?
2012/06/06 23:31:25
受益匪浅,记得以前用按键精灵编写自动补血的脚本,自动打怪脚本,也是需要捕获屏幕上固定位置的颜色的RGB值,然后再写脚本
2012/06/07 00:50:46
是啊,那方法我以前也用过,不过现在不用了