Home >Backend Development >PHP Tutorial >curl提交登陆信息遇到验证码问题
验证码,目前是找到URL,在前端网页上直接显示,然后手动输入。
在网页上用AJAX提交登陆信息可以正确返回。
我将同样的组合好的信息,传入后台PHP文件中,用curl提交,但每次都报验证码错误。
感觉起来好像是在php中提交又刷新了一次验证码,请问这个需要怎么解决?
借用了ty0716的代码试了一下,还是有一些问题,不明白要怎么处理。
直接取验证码地址,没有cookie保存。用登陆页面的地址,没办法取验证码来识别。
<code class="php"> 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; } </code>
验证码,目前是找到URL,在前端网页上直接显示,然后手动输入。
在网页上用AJAX提交登陆信息可以正确返回。
我将同样的组合好的信息,传入后台PHP文件中,用curl提交,但每次都报验证码错误。
感觉起来好像是在php中提交又刷新了一次验证码,请问这个需要怎么解决?
借用了ty0716的代码试了一下,还是有一些问题,不明白要怎么处理。
直接取验证码地址,没有cookie保存。用登陆页面的地址,没办法取验证码来识别。
<code class="php"> 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; } </code>
你在第一次获取页面的时候,要保存cookie,然后把你的登录信息、验证码,连着那个cookie一起post过去。如果你直接post,你的验证码永远对应的都是上一次的验证码
看了下,这样的验证码可以做个验证码识别,参考我的一篇文章:https://segmentfault.com/a/1190000004361370
你需要保证提交post的session_id与验证码的session_id一致,否则就是验证码错误了。
验证码由你的程序来输出,
用php获取验证码后输出,你再去调用一次要么是过期的验证码,要么就不是你这个session_id的验证码了
找到验证码的URL,在提交的时候请求一个验证码,听过识别,或者是手动输入