爬蟲需突破驗證碼:先抓取驗證碼圖片至本地,再送 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 "抓取失敗";
}
?>
CURLOPT_COOKIEJAR/COOKIEFILE 維持 Cookiefunction 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;
}
繞過驗證碼可能違反網站服務條款、電腦犯罪法規。僅供學習研究、授權測試使用,**嚴禁用於惡意爬蟲、暴力破解、自動化濫用**。