cURL 是支援多種協定(HTTP、HTTPS、FTP、FTPS 等)的傳輸工具,PHP 透過 curl_* 函數族提供完整封裝,適合模擬瀏覽器進行登入、抓取、API 串接。
curl_init() 初始化curl_setopt() 設定選項(最關鍵)curl_exec() 執行請求curl_close() 釋放資源
$url = 'https://example.com/login.php';
$postData = http_build_query([
'username' => 'user',
'password' => 'pass',
]);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
$loginUrl = 'https://bbs.example.com/login.php';
$targetUrl = 'https://bbs.example.com/';
$cookieFile = sys_get_temp_dir() . '/curl_cookie_' . md5($loginUrl) . '.txt';
$postData = http_build_query([
'forward' => '',
'jumpurl' => $targetUrl,
'step' => 2,
'lgt' => 0,
'pwuser' => 'YOUR_USER',
'pwpwd' => 'YOUR_PASS',
'question' => 0,
'hideid' => 1,
]);
// --- 階段 1:登入並存 Cookie ---
$ch = curl_init($loginUrl);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); // 寫入 Cookie
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 自動追蹤 302
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 開發環境
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36');
curl_exec($ch);
curl_close($ch);
// --- 階段 2:攜帶 Cookie 存取需登入頁面 ---
$ch = curl_init($targetUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); // 讀取 Cookie
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 ...');
$content = curl_exec($ch);
curl_close($ch);
echo $content; // 登入後才能看到的內容
| 選項 | 用途 | 常用值 |
|---|---|---|
| CURLOPT_URL | 請求網址 | 字串 |
| CURLOPT_POST | 啟用 POST | true |
| CURLOPT_POSTFIELDS | POST 資料 | 陣列或 query string |
| CURLOPT_RETURNTRANSFER | 回傳字串而非直接輸出 | true |
| CURLOPT_HEADER | 包含回應 Header | false |
| CURLOPT_COOKIEJAR | Cookie 儲存檔(寫入) | 檔案路徑 |
| CURLOPT_COOKIEFILE | Cookie 讀取檔 | 檔案路徑 |
| CURLOPT_FOLLOWLOCATION | 自動追蹤重導向 | true |
| CURLOPT_MAXREDIRS | 最大重導向次數 | 10 |
| CURLOPT_SSL_VERIFYPEER | 驗證 SSL 憑證 | false(開發)/true(生產) |
| CURLOPT_SSL_VERIFYHOST | 驗證 SSL 主機名 | 2 |
| CURLOPT_USERAGENT | 瀏覽器識別字串 | Mozilla/5.0 ... |
| CURLOPT_REFERER | 來源頁面 | URL |
| CURLOPT_TIMEOUT | 總逾時秒數 | 30 |
| CURLOPT_CONNECTTIMEOUT | 連線逾時秒數 | 10 |
| CURLOPT_PROXY | HTTP 代理 | ip:port |
| CURLOPT_PROXYUSERPWD | 代理認證 | user:pass |
| CURLOPT_HTTPHEADER | 自定 Header 陣列 | ['Accept: application/json'] |
CURLOPT_COOKIEJAR/FILE 路徑需可寫入,建議用 sys_get_temp_dir()。CURLOPT_SSL_VERIFYPEER => true 並設定 CURLOPT_CAINFO 指向 cacert.pem。mb_convert_encoding($response, 'UTF-8', 'GB2312') 轉碼。將上述邏輯封裝為 HttpClient 類別,支援鏈式呼叫、自動 Cookie 管理、錯誤重試、PSR-7/18 相容,方便在專案中複用。