PHP识别验证码提交

简单说就是有些网站查询的时候需要输入验证码才可以,用代码实现的原理是先获取验证码图片,然后把图片提交给打码平台识别,得到打码结果之后用验证码提交。因为需要人工打码,所以速度肯定会略慢。
哎,因为打码平台之提供了PHP的API,实在没办法了第一次学着使用PHP,总算搞定了,记录一下吧。

代码写的很乱,需要认真看一下。其中有一点非常重要,就是获取验证码的时候一定要记得保存cookies,正式提交的时候带上这个cookies。
程序代码 程序代码

<?php
//以下是获取验证码过程
$sjname = time();
$CookieFile=tempnam("./tmep","beast");
$login_url = "http://www.XXX";//提交查询URL
$verify_code_url = "http://www.XXX";//验证码URL
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $verify_code_url);
curl_setopt($curl, CURLOPT_COOKIEJAR, $CookieFile);//把返回来的cookie信息保存在文件中
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_TIMEOUT, 65);    //设置本机的post请求超时时间,如果timeout参数设置60 这里至少设置65
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$img = curl_exec($curl);
curl_close($curl);
$fp = fopen("jpg/$sjname.jpg","w");//验证码放到同目录的JPG下面,名字按照时间戳生成
fwrite($fp,$img);
fclose($fp);

//以下是打码平台提交部分,这个应该是平台提供的API,代码可能不一样
$damaUrl = 'http://XXX';
$filename = "jpg/$sjname.jpg";
$ch = curl_init();
$postFields = array('username' => 'XXX',
                    'password' => 'XXX',
                    'typeid' => 3040,    //4位的字母数字混合码
                    'timeout' => 60,    //中文以及选择题类型需要设置更高的超时时间建议90以上
                    'softid' => XXXX,    //改成你自己的
                    'softkey' => 'XXX',    //改成你自己的
                    'image' => '@'.realpath($filename)
                     );

curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_URL,$damaUrl);
curl_setopt($ch, CURLOPT_TIMEOUT, 65);    //设置本机的post请求超时时间,如果timeout参数设置60 这里至少设置65
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);

$result = curl_exec($ch);
curl_close($ch);
preg_match("|<Result>([^^]*?)</Result>|u", $result, $matches);

//以下是得到验证码之后带上验证码正式POST
$code = $matches[1];
$url = $_GET["url"];
$post = "d_name=$url&d_yzm=$code&Submit=%B2%E9+%D1%AF";

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $login_url);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl, CURLOPT_TIMEOUT, 65);    //设置本机的post请求超时时间,如果timeout参数设置60 这里至少设置65
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
curl_setopt($curl,CURLOPT_COOKIEJAR, $CookieFile);
curl_setopt($curl,CURLOPT_COOKIEFILE, $CookieFile);//同时发送Cookie
$result=curl_exec($curl);
curl_close($curl);
//以下得到结果自行处理
echo $result;



文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags:
相关日志:
评论: 0 | 引用: 0 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.