Heim > Fragen und Antworten > Hauptteil
验证码,目前是找到URL,在前端网页上直接显示,然后手动输入。
在网页上用AJAX提交登陆信息可以正确返回。
我将同样的组合好的信息,传入后台PHP文件中,用curl提交,但每次都报验证码错误。
感觉起来好像是在php中提交又刷新了一次验证码,请问这个需要怎么解决?
借用了ty0716的代码试了一下,还是有一些问题,不明白要怎么处理。
直接取验证码地址,没有cookie保存。用登陆页面的地址,没办法取验证码来识别。
define('SCRIPT_ROOT',dirname(__FILE__).'/');
include "code.php";
function send($loginUrl, $cookieFile){
// $name = $_POST['name'];
// $idcard = $_POST['idcard'];
// $pw = $_POST['pw'];
// $code = $_POST['code'];
$code = getCode('http://www.xxx.com/Num.jsp');
header("Content-Type: text/html;charset=utf-8");
$post_data = "".$code;
return post($loginUrl, $post_data, $cookieFile);
}
function getCode($captchaUrl, $cookieFile){
$captchaString = get($captchaUrl, $cookieFile);
$tempCaptchaFile = SCRIPT_ROOT. date('YmdHis') . '.jpg';
file_put_contents($tempCaptchaFile, $captchaString);
$ocr = new code($tempCaptchaFile);
$captcha = $ocr->getCode();
echo $captcha;
return $captcha;
}
function get($url, $cookie_file, $isCookiesSave = false)
{
// 初始化
$curl = curl_init($url);
$header = array();
$header[] = 'User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36';
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
// 不输出header头信息
curl_setopt($curl, CURLOPT_HEADER, 0);
if ($isCookiesSave) {
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_file);
} else {
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file);
}
// 保存到字符串而不是输出
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
// 是否抓取跳转后的页面
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
$info = curl_exec($curl);
curl_close($curl);
return $info;
}
function post($url, $data, $cookie_file)
{
// 初始化
$curl = curl_init($url);
$header = array();
$header[0] = 'User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36';
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
// 不输出header头信息
curl_setopt($curl, CURLOPT_HEADER, 0);
// 保存到字符串而不是输出
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file);
// post数据
curl_setopt($curl, CURLOPT_POST, 1);
// 请求数据
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
// 是否抓取跳转后的页面
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
$response = curl_exec($curl);
curl_close($curl);
return $response;
}
阿神2017-04-10 17:38:35
你在第一次获取页面的时候,要保存cookie,然后把你的登录信息、验证码,连着那个cookie一起post过去。如果你直接post,你的验证码永远对应的都是上一次的验证码
高洛峰2017-04-10 17:38:35
看了下,这样的验证码可以做个验证码识别,参考我的一篇文章:https://segmentfault.com/a/1190000004361370
你需要保证提交post的session_id与验证码的session_id一致,否则就是验证码错误了。
验证码由你的程序来输出,
用php获取验证码后输出,你再去调用一次要么是过期的验证码,要么就不是你这个session_id的验证码了