鍍金池/ 問答/PHP  HTML/ 關(guān)于使用curl模擬登錄,驗證碼失效的問題?重復刷新了網(wǎng)頁?讀取的cookie是

關(guān)于使用curl模擬登錄,驗證碼失效的問題?重復刷新了網(wǎng)頁?讀取的cookie是錯誤的?

我模擬登錄教務(wù)系統(tǒng)時,先 curl_init 連接請求了驗證碼,并獲取了驗證碼值
我攜帶在獲取 驗證碼 值時得到的cookie + post數(shù)據(jù) + 驗證碼 , 顯示驗證碼失效

我發(fā)現(xiàn)在原網(wǎng)頁中 不帶參數(shù)訪問表單提交地址的時候 、 重復提交的時候就會出現(xiàn)驗證碼失效的問題

成功登錄請求信息如下

clipboard.png

我的代碼如下:

require_once './read.php'; // 自動驗證碼識別
/**
 * 模擬登錄
 */
//初始化變量
$cookie_file = __DIR__ . "\cookie.txt";
$post_url = "http://jiaowu.jvtc.jx.cn/Logon.do?method=logon"; // 表單請求登錄的地址
$url = "http://jiaowu.jvtc.jx.cn";  // 登錄的地址
$verify_code_url = "http://jiaowu.jvtc.jx.cn/verifycode.servlet";  // 驗證碼的地址

// // 初始化 
// function login_init($url,$cookie) {
//     $ch = curl_init();
//     curl_setopt($ch , CURLOPT_URL , $url);
//     curl_setopt($ch , CURLOPT_RETURNTRANSFER , 1); // 不直接輸出
//     curl_setopt($ch , CURLOPT_COOKIEJAR , $cookie); // 保存cookie
//     curl_exec($ch);
//     curl_close($ch);
// }

function getVerfyCode($url,$cookie) {
    $ch = curl_init($url);
    curl_setopt($ch , CURLOPT_COOKIEJAR, $cookie);
    curl_setopt($ch , CURLOPT_RETURNTRANSFER , 1); // 不直接輸出
    $img = curl_exec($ch);
    curl_close($ch);

    $fp = fopen("verifyCode.jpg",'w');
    fwrite($fp,$img);
    fclose($fp);

    // 返回驗證碼code
    return currentImg('verifyCode.jpg'); // 自動識別驗證碼
}

function login($url , $cookie , $p, $referer){
    $ch = curl_init();
    curl_setopt($ch , CURLOPT_URL , $url);
    curl_setopt($ch , CURLOPT_HEADER,1);
    curl_setopt($ch , CURLOPT_RETURNTRANSFER , 0); // 直接輸出
    curl_setopt($ch , CURLOPT_COOKIEFILE, $cookie);// 讀取cookie信息
    curl_setopt($ch , CURLOPT_POST, 1); //以POST方式提交
    curl_setopt($ch , CURLOPT_POSTFIELDS, http_build_query($p));//要執(zhí)行的信息
    curl_exec($ch); //執(zhí)行curl轉(zhuǎn)去頁面內(nèi)容
    curl_close($ch);
}
// login_init($url,$cookie_file);
$code = getVerfyCode($verify_code_url,$cookie_file); // 得到驗證碼
$p['userAccount'] = '163050521';
$p['userPassword'] = '163050531';
$p['RANDOMCODE'] = $code;

login($post_url , $cookie_file,$p);

這是我讀取的cookie


# Netscape HTTP Cookie File
# http://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

#HttpOnly_jiaowu.jvtc.jx.cn    FALSE    /    FALSE    0    JSESSIONID 93F5A5EC3665B6C10DFAD66627CB1E84


好像正確獲取cookie不是這樣子的,我不知道我錯在哪里,為什么會產(chǎn)生這樣的cookie

查了半天資料了,我還是沒發(fā)現(xiàn)錯誤在哪里 求解~~

謝謝大佬的回答,我其實就是沒有拿到 encoded

添加一個問題,在我登錄成功后, 拿到cookie去讀取 需要獲取數(shù)據(jù)的頁面 后,出現(xiàn)需要重新登錄的現(xiàn)象

但是我使用的cookie一直用來獲取驗證碼、登錄 都沒有出現(xiàn)什么問題,請問問題在哪里呢?

后面的部分代碼如下:

// 登錄
function login($url , $cookie , $p){
    $ch = curl_init();
    curl_setopt($ch , CURLOPT_URL , $url);
    curl_setopt($ch , CURLOPT_HEADER,0);  // 輸出 header
    curl_setopt($ch , CURLOPT_RETURNTRANSFER , 0); // 直接輸出
    curl_setopt($ch , CURLOPT_COOKIEFILE, $cookie);// 讀取cookie信息
    curl_setopt($ch , CURLOPT_POST, 1); //以POST方式提交
    curl_setopt($ch , CURLOPT_POSTFIELDS, http_build_query($p));//要執(zhí)行的信息
    $content = curl_exec($ch); //執(zhí)行curl轉(zhuǎn)去頁面內(nèi)容
    curl_close($ch);

}

// 初始化界面
login_init($url,$cookie_file);

// 得到驗證碼
$code = getVerfyCode($verify_code_url,$cookie_file); 

// 表單信息
$p['userAccount'] = '163050581';
$p['userPassword'] = '163050581';
$p['RANDOMCODE'] = $code;

$encoded = getEncoded("http://jiaowu.jvtc.jx.cn/Logon.do?method=logon&flag=sess",$cookie_file);
$p['encoded'] = $encoded;

login($post_url , $cookie_file,$p); // 登錄成功

// 獲取頁面
getPage("http://jiaowu.jvtc.jx.cn/jsxsd/framework/xsMain_new.jsp",$cookie_file);

// 登錄
function getPage($url , $cookie){
    $header = array(
        'Referer: http://jiaowu.jvtc.jx.cn/jsxsd/framework/xsMain.jsp',
        'Accept-Language: zh-CN,zh;q=0.9',
        'Host: jiaowu.jvtc.jx.cn',
        'Upgrade-Insecure-Requests: 1',
        'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'
    );
    $ch = curl_init();
    curl_setopt($ch , CURLOPT_URL , $url);
    curl_setopt($ch , CURLOPT_HEADER,1);  // 輸出 header
    curl_setopt($ch , CURLOPT_RETURNTRANSFER , 0); // 直接輸出
    curl_setopt($ch , CURLOPT_COOKIEFILE, $cookie);// 讀取cookie信息
    curl_setopt($ch , CURLOPT_HTTPHEADER, $header);
    $page = curl_exec($ch); //執(zhí)行curl轉(zhuǎn)去頁面內(nèi)容
    curl_close($ch);
}

輸出結(jié)果:

clipboard.png

header頭部分

clipboard.png

回答
編輯回答
負我心

時序問題吧,你得模擬正常登錄流程,先get訪問一下登錄頁,獲取到cookie,然后再獲取驗證碼,最后提交

2017年11月1日 23:16
編輯回答
逗婦乳

更新的問題:沒有保存登錄cookie

===============================

少了encoded字段的數(shù)據(jù)

模擬登錄的重點是模擬,不要忽略任何細節(jié),表單有多少字段就提交多少。

2018年4月5日 18:42