php识别验证码后提交

时间:2012-06-02 | 分类:个人日志,学习园地 | 浏览:17756 | 评论:10 | 发表评论

关于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];
}

运行结果如下:

源码下载

.

标签: , , ,
本文链接: php识别验证码后提交
版权所有: 破博客, 转载请注明本文出处。

10个评论

  1. […] 原理参考: php实现验证码的识别(初级篇) php识别验证码后提交 […]

  2. flute
    2014/03/23 12:36:44

    :razz: 很不错的样子~我试试

  3. tarfly
    2013/04/27 11:32:26

    :cry: :cry: 搞定了一个 吼吼,版主求交换友链

  4. mcs
    2012/12/14 20:26:20

    大哥 请教一下,按照你的做法,我这里生成的图片就固定了 不会变。 是不是因为网站的验证码实现方式不一样?

    • admin
      2012/12/14 22:37:08

      每个网站的验证码都不一样,你要自己制作字模。

      • mcs
        2012/12/15 14:27:36

        我把字模改过来了 还是不对哦。 不知道什么原因 :cry:

      • mcs
        2012/12/15 13:10:21

        我这边生成的图片固定不变 就是因为字模不对的原因吗?

  5. 混乱羽翼
    2012/06/06 23:31:25

    受益匪浅,记得以前用按键精灵编写自动补血的脚本,自动打怪脚本,也是需要捕获屏幕上固定位置的颜色的RGB值,然后再写脚本

    • admin
      2012/06/07 00:50:46

      是啊,那方法我以前也用过,不过现在不用了

发表评论

您的昵称: *

您的邮箱: * (显示gravatar头像)

联系方式: