模擬登錄核心難點
- 驗證碼識別:OCR 準確率低、第三方打碼平台成本高
- 會話保持:Cookie 必須在請求間正確傳遞
- 反爬機制:IP 限流、User-Agent 檢測、隱藏表單字段、JS 動態生成參數
人工介入驗證碼方案
本文採用「程序獲取驗證碼圖片 → 保存本地 → 休眠等待人工輸入 → 讀取識別結果 → 繼續登錄」的半自動模式。
1,
CURLOPT_CONNECTTIMEOUT => 5,
CURLOPT_COOKIEJAR => $cookie_file, // 保存 Cookie
]);
curl_exec($ch);
curl_close($ch);
// 2. 獲取驗證碼圖片
$ch = curl_init($verify_url);
curl_setopt_array($ch, [
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 秒內查看 verifyCode.jpg 並將驗證碼寫入 code.txt\n";
// 3. 等待人工輸入
sleep(20);
$code = trim(file_get_contents("code.txt"));
// 4. 提交登錄
$post = "username=xxx&pwd=yyy&verifycode=$code";
$ch = curl_init($login_url);
curl_setopt_array($ch, [
CURLOPT_HEADER => false,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => $post,
CURLOPT_COOKIEFILE => $cookie_file,
]);
$result = curl_exec($ch);
curl_close($ch);
if (strpos($result, "登錄成功") !== false) {
echo "登錄成功,Cookie 已保存至 $cookie_file\n";
// 後續業務請求直接使用 $cookie_file
} else {
echo "登錄失敗: " . substr($result, 0, 200);
}
關鍵 cURL 選項解析
| 選項 | 作用 | 登錄場景值 |
| CURLOPT_COOKIEJAR | 響應 Cookie 保存文件 | 登錄頁請求 |
| CURLOPT_COOKIEFILE | 請求攜帶 Cookie 文件 | 驗證碼/登錄提交/後續業務 |
| CURLOPT_FOLLOWLOCATION | 自動跟隨 302 重定向 | 1 (登錄常有跳轉) |
| CURLOPT_REFERER | 設置 Referer | 登錄頁 URL (防盜鏈) |
| CURLOPT_USERAGENT | 模擬瀏覽器 UA | Chrome/Firefox 完整 UA 字符串 |
| CURLOPT_SSL_VERIFYPEER | 驗證 SSL 證書 | 0 (測試環境) / 1 + CA 憑證 (生產) |
進階:全自動化方案對比
| 方案 | 優點 | 缺點 | 適用場景 |
| 人工輸入 | 100%準確、無成本 | 不可大規模、需人值守 | 內部工具、低頻操作 |
| OCR 識別 (Tesseract) | 免費、本地化 | 準確率低(簡單驗證碼<60%) | 純數字/字母、無干擾線 |
| 打碼平台 API | 高準確率、全自動 | 費用高、延遲、隱私風險 | 商業項目、高頻需求 |
| 深度學習模型 | 可訓練適應特定驗證碼 | 需標註數據、GPU訓練、維護成本 | 長期項目、固定目標站點 |
| Selenium/Playwright | 真實瀏覽器環境、繞過 JS 檢測 | 資源佔用大、啟動慢、穩定性差 | 複雜單頁應用、需執行 JS |
生產級封裝建議
class LoginSimulator {
private $ch;
private $cookieFile;
public function __construct($cookieFile) {
$this->cookieFile = $cookieFile;
$this->ch = curl_init();
$this->setDefaults();
}
private function setDefaults() {
curl_setopt_array($this->ch, [
CURLOPT_COOKIEJAR => $this->cookieFile,
CURLOPT_COOKIEFILE => $this->cookieFile,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_FOLLOWLOCATION => 1,
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
]);
}
public function get($url) {
curl_setopt($this->ch, CURLOPT_URL, $url);
curl_setopt($this->ch, CURLOPT_POST, 0);
return curl_exec($this->ch);
}
public function post($url, $data) {
curl_setopt($this->ch, CURLOPT_URL, $url);
curl_setopt($this->ch, CURLOPT_POST, 1);
curl_setopt($this->ch, CURLOPT_POSTFIELDS, $data);
return curl_exec($this->ch);
}
public function getCookie($name) {
// 解析 cookie 文件獲取指定值
}
}
總結
cURL 模擬登錄的核心是 **Cookie 生命週期管理** 與 **請求參數完整復現**。人工驗證碼是過渡方案,長期項目應投入自動化識別或遷移至官方 API。建議建立「登錄服務」微服務,統一處理認證、Token 刷新、異常重試,業務系統無感調用。
- 上一篇文章: PHP 通過串口發送短信(PDU 模式 UCS2 編碼)完整實現
- 下一篇文章: PHP 輕量級網頁爬蟲完整實現:URL 去重、深度控制、多線程限制
Copyright ©
程式碼之家 All Rights Reserved