libcurl 支援 HTTPS、HTTP POST/PUT、FTP 上傳、表單上傳、代理、Cookie 管理、Basic Auth 等,是 PHP 端網絡交互的瑞士軍刀。
<?php
$discuz_url = 'https://www.example.com/';
$login_url = $discuz_url . 'logging.php?action=login';
// 1. 獲取登錄頁面,提取 formhash
$ch = curl_init($login_url);
curl_setopt_array($ch, [
CURLOPT_HEADER => 0,
CURLOPT_RETURNTRANSFER => 1,
]);
$html = curl_exec($ch);
curl_close($ch);
preg_match('/<input\s+type="hidden"\s+name="formhash"\s+value="([^"]+)"/i', $html, $m);
if (!$m) die('formhash not found');
$formhash = $m[1];
// 2. 提交登錄,攜帶 Cookie 文件
$post = [
'loginfield' => 'username',
'loginsubmit' => 'true',
'username' => 'your_username',
'password' => 'your_password',
'questionid' => 0,
'answer' => '',
'formhash' => $formhash,
];
$cookie_file = tempnam(sys_get_temp_dir(), 'cookie_');
$ch = curl_init($login_url);
curl_setopt_array($ch, [
CURLOPT_HEADER => 0,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => $post,
CURLOPT_COOKIEJAR => $cookie_file,
]);
curl_exec($ch);
curl_close($ch);
// 3. 進入發帖頁,再次提取 formhash
$post_url = $discuz_url . "post.php?action=newthread&fid=2";
$ch = curl_init($post_url);
curl_setopt_array($ch, [
CURLOPT_HEADER => 0,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_COOKIEFILE => $cookie_file,
]);
$html = curl_exec($ch);
curl_close($ch);
preg_match('/<input\s+type="hidden"\s+name="formhash"\s+id="formhash"\s+value="([^"]+)"/i', $html, $m);
if (!$m) die('post formhash not found');
$formhash = $m[1];
// 4. 提交發帖數據
$post_data = [
'subject' => '測試標題',
'message' => '測試內容',
'topicsubmit' => 'yes',
'tags' => '測試,標簽',
'formhash' => $formhash,
];
$ch = curl_init($post_url);
curl_setopt_array($ch, [
CURLOPT_REFERER => $post_url, // 偽裝來源
CURLOPT_HEADER => 0,
CURLOPT_RETURNTRANSFER => 0, // 直接輸出
CURLOPT_COOKIEFILE => $cookie_file,
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => $post_data,
]);
curl_exec($ch);
curl_close($ch);
// 5. 清理
unlink($cookie_file);
| 環節 | 關鍵點 |
|---|---|
| formhash | Discuz! 核心 CSRF 防護令牌,每次會話/頁面不同,必須動態提取 |
| Cookie 管理 | CURLOPT_COOKIEJAR 寫入、CURLOPT_COOKIEFILE 讀取,維持會話狀態 |
| Referer 偽裝 | 防止防盜鏈/來源檢查,發帖時設置為發帖頁 URL |
| User-Agent | 建議設置常見瀏覽器 UA,避免簡單 UA 過濾 |
| 錯誤處理 | 生產代碼需檢查 curl_errno()、curl_error()、HTTP 狀態碼 |
GuzzleHttp 等高級 HTTP 客戶端,支援異步、中介軟、PSR-7/18 標準CURLOPT_COOKIELIST 內存管理,避免臨時文件 I/ODOMDocument / Masterminds/HTML5-Parser,比正則更健壯自動化腳本僅供技術學習、授權測試、個人數據備份等合法用途。未經授權批量註冊、發帖、刷量屬違法行為,可能觸犯《計算機信息網絡國際聯網安全保護管理辦法》等法規。請遵守目標站點 `robots.txt` 與服務條款。