萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 遠端抓取驗證碼圖片並本地化儲存:支援 PNG/GIF/JPEG 三格式

應用場景

爬蟲需突破驗證碼:先抓取驗證碼圖片至本地,再送 OCR (Tesseract、百度/騰訊 AI API) 辨識,最後帶入表單提交。

完整抓取儲存函式

<?php
/**
 * 從遠端 URL 抓取驗證碼圖片並儲存為 PNG
 * @param string $url      驗證碼圖片 URL
 * @param string $savePath 儲存路徑 (含檔名)
 * @return bool 成功與否
 */
function fetchCaptcha(string $url, string $savePath): bool
{
    $ctx = stream_context_create([
        'http' => [
            'method' => 'GET',
            'header' => "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36\r\n" .
                        "Accept: image/webp,image/apng,image/*,*/*;q=0.8\r\n" .
                        "Referer: " . parse_url($url, PHP_URL_SCHEME) . '://' . parse_url($url, PHP_URL_HOST) . "\r\n",
            'timeout' => 10,
            'follow_location' => 1,
            'max_redirects' => 3,
        ],
        'ssl' => [
            'verify_peer' => false, // 測試環境可關閉,生產請開啟並部署 CA
            'verify_peer_name' => false,
        ],
    ]);

    $data = @file_get_contents($url, false, $ctx);
    if ($data === false || strlen($data) === 0) return false;

    // 偵測圖片類型
    $info = @getimagesizefromstring($data);
    if ($info === false) return false;

    $mime = $info['mime']; // image/png, image/jpeg, image/gif
    $allowed = ['image/png', 'image/jpeg', 'image/gif'];
    if (!in_array($mime, $allowed, true)) return false;

    // 統一轉為 PNG (無損、支援透明)
    $src = match ($mime) {
        'image/png'  => imagecreatefromstring($data),
        'image/jpeg' => imagecreatefromstring($data),
        'image/gif'  => imagecreatefromstring($data),
        default      => false,
    };
    if (!$src) return false;

    // 可選:二值化、去噪、放大 提高 OCR 率
    // imagefilter($src, IMG_FILTER_GRAYSCALE);
    // imagefilter($src, IMG_FILTER_CONTRAST, -50);

    $ok = imagepng($src, $savePath);
    imagedestroy($src);
    return $ok;
}

// 使用
$url = 'https://example.com/captcha?v=' . time();
$path = sys_get_temp_dir() . '/captcha_' . bin2hex(random_bytes(8)) . '.png';
if (fetchCaptcha($url, $path)) {
    echo "已儲存: $path";
    // $text = ocrRecognize($path); // 接入 OCR
} else {
    echo "抓取失敗";
}
?>

關鍵細節

  • stream_context:模擬瀏覽器 Header、處理重導向、設定超時
  • getimagesizefromstring():不落地檔案即可偵測 MIME、尺寸
  • imagecreatefromstring():統一處理三種格式,自動偵測
  • 統一輸出 PNG:後續 OCR 處理統一格式,避免 JPEG 壓縮伪影
  • Cookie 保持:若驗證碼需同 Session,需用 CURLOPT_COOKIEJAR/COOKIEFILE 維持 Cookie

cURL 版本 (更穩健、支援 Cookie 檔案)

function fetchCaptchaCurl(string $url, string $savePath, string $cookieJar = ''): bool
{
    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_MAXREDIRS => 3,
        CURLOPT_TIMEOUT => 10,
        CURLOPT_USERAGENT => 'Mozilla/5.0 ...',
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_SSL_VERIFYHOST => false,
        CURLOPT_COOKIEJAR => $cookieJar ?: sys_get_temp_dir() . '/captcha_cookie.txt',
        CURLOPT_COOKIEFILE => $cookieJar ?: sys_get_temp_dir() . '/captcha_cookie.txt',
    ]);
    $data = curl_exec($ch);
    $err = curl_error($ch);
    $info = curl_getinfo($ch);
    curl_close($ch);

    if ($err || $info['http_code'] !== 200 || empty($data)) return false;
    // 後續同 file_get_contents 版本:getimagesizefromstring -> imagecreatefromstring -> imagepng
    // ...
    return true;
}

法律與道德提醒

繞過驗證碼可能違反網站服務條款、電腦犯罪法規。僅供學習研究、授權測試使用,**嚴禁用於惡意爬蟲、暴力破解、自動化濫用**。

copyright © 萬盛學電腦網 all rights reserved