針對帶有驗證碼的網站進行模擬登錄,全自動識別驗證碼(OCR)準確率難以保證。本文提供一種半自動化方案:程式取得驗證碼圖片 → 暫停等待人工輸入 → 續行登錄,兼顧自動化效率與識別準確度。
sleep(20) 暫停 20 秒,供人工查看圖片並將驗證碼寫入 code.txtcode.txt 內容作為驗證碼參數<?php
/** 模擬登錄主流程 */
$cookie_file = "tmp.cookie";
$login_url = "https://xxx.com/logon.php";
$verify_url = "https://xxx.com/verifyCode.php";
echo "正在獲取 Cookie...\n";
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $login_url,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_CONNECTTIMEOUT => 5,
CURLOPT_COOKIEJAR => $cookie_file, // 儲存 Cookie
]);
curl_exec($ch);
curl_close($ch);
echo "正在取得驗證碼圖片...\n";
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $verify_url,
CURLOPT_COOKIEFILE => $cookie_file, // 攜帶 Cookie
CURLOPT_HEADER => 0,
CURLOPT_RETURNTRANSFER => 1,
]);
$img = curl_exec($ch);
curl_close($ch);
file_put_contents("verifyCode.jpg", $img);
echo "驗證碼已儲存,請於 20 秒內查看圖片並將驗證碼寫入 code.txt\n";
sleep(20);
$code = trim(file_get_contents("code.txt"));
echo "讀取驗證碼:$code\n";
echo "正在嘗試登錄...\n";
$post = "username=maben&pwd=hahahaha&verifycode=$code";
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $login_url,
CURLOPT_HEADER => false,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $post,
CURLOPT_COOKIEFILE => $cookie_file,
]);
$result = curl_exec($ch);
curl_close($ch);
// 根據實際回應調整判斷邏輯
if (strpos($result, "登錄成功") !== false) {
echo "登錄成功!\n";
// 後續業務邏輯...
} else {
echo "登錄失敗\n";
exit;
}
?>
| 設定項 | 作用 |
|---|---|
CURLOPT_COOKIEJAR | 首次請求儲存 Cookie 到檔案 |
CURLOPT_COOKIEFILE | 後續請求讀取 Cookie 檔案,維持 Session |
CURLOPT_RETURNTRANSFER | 將回應作為字串返回而非直接輸出 |
sleep(20) | 阻塞腳本,提供人工介入時間窗口 |
sleep() 阻塞 PHP 進程此方案適用於一次性資料遷移、測試腳本、低頻爬蟲等場景;高頻業務請採用全自動識別或官方 API。