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

PHP cURL 實戰:模擬登錄 Discuz! 論壇並自動發帖

     編輯:PHP 綜合知識

cURL 核心能力回顧

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);

關鍵技術點解析

環節關鍵點
formhashDiscuz! 核心 CSRF 防護令牌,每次會話/頁面不同,必須動態提取
Cookie 管理CURLOPT_COOKIEJAR 寫入、CURLOPT_COOKIEFILE 讀取,維持會話狀態
Referer 偽裝防止防盜鏈/來源檢查,發帖時設置為發帖頁 URL
User-Agent建議設置常見瀏覽器 UA,避免簡單 UA 過濾
錯誤處理生產代碼需檢查 curl_errno()、curl_error()、HTTP 狀態碼

現代化改進建議

  • 使用 GuzzleHttp 等高級 HTTP 客戶端,支援異步、中介軟、PSR-7/18 標準
  • Cookie 改用 CURLOPT_COOKIELIST 內存管理,避免臨時文件 I/O
  • HTML 解析改用 DOMDocument / Masterminds/HTML5-Parser,比正則更健壯
  • 敏感資訊(帳號密碼)務必從環境變量/密鑰管理系統讀取,絕不硬編碼
  • 增加隨機延遲、請求頻率控制,模擬真人行為降低封禁風險

法律與道德提醒

自動化腳本僅供技術學習、授權測試、個人數據備份等合法用途。未經授權批量註冊、發帖、刷量屬違法行為,可能觸犯《計算機信息網絡國際聯網安全保護管理辦法》等法規。請遵守目標站點 `robots.txt` 與服務條款。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved