>백엔드 개발 >PHP 튜토리얼 >curl提交登陆信息遇到验证码问题

curl提交登陆信息遇到验证码问题

WBOY
WBOY원래의
2016-06-06 20:09:061203검색

验证码,目前是找到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,在提交的时候请求一个验证码,听过识别,或者是手动输入

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.