首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 使用 cURL 模擬登錄實戰:驗證碼人工介入與 Cookie 管理

     編輯:PHP 綜合知識

模擬登錄核心難點

  • 驗證碼識別: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模擬瀏覽器 UAChrome/Firefox 完整 UA 字符串
CURLOPT_SSL_VERIFYPEER驗證 SSL 證書0 (測試環境) / 1 + CA 憑證 (生產)

進階:全自動化方案對比

生產級封裝建議

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 刷新、異常重試,業務系統無感調用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方案優點缺點適用場景
人工輸入100%準確、無成本不可大規模、需人值守內部工具、低頻操作
OCR 識別 (Tesseract)免費、本地化準確率低(簡單驗證碼<60%)純數字/字母、無干擾線
打碼平台 API高準確率、全自動費用高、延遲、隱私風險商業項目、高頻需求
深度學習模型可訓練適應特定驗證碼需標註數據、GPU訓練、維護成本長期項目、固定目標站點
Selenium/Playwright真實瀏覽器環境、繞過 JS 檢測資源佔用大、啟動慢、穩定性差複雜單頁應用、需執行 JS