PHP 使用 cURL 模拟登录与发帖 Discuz 论坛详解

林舟
林舟
发布时间:2026-10-15| 6人浏览过
原创

在 PHP 开发中,cURL 库不仅支持 HTTPS、FTP 上传等基础功能,更是实现 Web 自动化操作的利器。对于希望对接或管理 Discuz 论坛数据的开发者而言,掌握利用 cURL 模拟用户登录并自动发帖的流程至关重要。本文将通过完整代码示例,解析从获取登录凭证到成功发表主题的全过程。

模拟登录准备与 FormHash 获取

Discuz 系统具有完善的安全机制,其核心在于 formhash(表单哈希)以及 Session/Cookie 会话管理。要模拟登录,首先必须合法地访问登录页面以获取当前的 formhash,随后携带正确的参数进行 POST 请求以换取有效的 Cookie。

第1步:初始化 cURL 会话并获取登录页源码

  • 目的:通过 GET 请求获取登录页面 HTML,解析其中的隐藏字段 formhash 和安全提问信息。
  • 参数说明:CURLOPT_RETURNTRANSFER 设为 1 可确保返回内容而非直接输出;CURLOPT_HEADER 设为 0 过滤掉 HTTP 头部干扰。
$discuz_url = 'http://127.0.0.1/discuz/'; // 请替换为你的实际论坛地址
$login_url = $discuz_url . 'logging.php?action=login';

$post_fields = array();
$post_fields['loginfield'] = 'username';
$post_fields['loginsubmit'] = 'true';
$post_fields['username'] = 'tianxin';     // 替换为实际用户名
$post_fields['password'] = '111111';      // 替换为实际密码
$post_fields['questionid'] = 0;           // 0表示没有安全提问
$post_fields['answer'] = '';
// 若开启了验证码,需在此处补充 seccodeverify 参数

$ch = curl_init($login_url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$contents = curl_exec($ch);
curl_close($ch);

// 使用正则表达式匹配 formhash
preg_match('/<input\s*type="hidden"\s*name="formhash"\s*value="(.*?)"\s*\/>/i', $contents, $matches);
if(!empty($matches)) {
    $formhash = $matches[1];
} else {
    die('无法找到 formhash');
}

第2步:执行登录请求并保存 Cookie

  • 目的:将上一步获得的 formhash 连同账号密码 POST 至登录接口,并将服务器返回的 Cookie 保存到本地文件,供后续请求复用。
  • 关键操作:开启 CURLOPT_POST,指定 COOKIEJAR 文件路径。
// 创建临时 Cookie 文件
$cookie_file = tempnam('./temp', 'cookie');

$ch = curl_init($login_url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
curl_exec($ch);
curl_close($ch); 

模拟发帖操作

登录成功后,Cookie 文件中已包含必要的会话令牌。接下来,我们需要进入目标板块的新帖发布页面,再次提取该页面的 formhash,即可构造发帖请求。

第3步:获取发帖页面的 formhash

  • 注意:发帖页面的 formhash 正则可能与登录页不同(例如多了 id 属性),需注意区分。
  • 参数说明:fid 代表论坛版块 ID,需根据实际情况修改。
$send_url = $discuz_url."post.php?action=newthread&fid=2"; // 修改 fid 为你需要发布的版块ID

$ch = curl_init($send_url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file); // 携带登录后的 Cookie
$contents = curl_exec($ch);
curl_close($ch);

// 匹配发帖框的 formhash(通常包含 id="formhash")
preg_match('/<input\s*type="hidden"\s*name="formhash"\s*id="formhash"\s*value="(.*?)"\s*\/>/i', $contents, $matches);
if(!empty($matches)) {
    $formhash = $matches[1];
} else {
    die('无法找到发帖 formhash');
}

第4步:POST 数据完成发帖

  • 目的:组装标题、内容、标签及必需的 formhash,向服务器发起发帖请求。
  • 风险提醒:设置 CURLOPT_REFERER 伪装来源页面可有效降低被反爬机制拦截的概率。
$post_data = array();
$post_data['subject'] = '测试帖子标题';     // 帖子标题
$post_data['message'] = '这里是帖子正文内容'; // 帖子内容
$post_data['topicsubmit'] = "yes";
$post_data['extra'] = '';
$post_data['tags'] = 'php,discuz';          // 标签
$post_data['formhash'] = $formhash;         // 必须填入当前页面的 hash

$ch = curl_init($send_url);
curl_setopt($ch, CURLOPT_REFERER, $send_url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0); // 直接输出以便调试
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$contents = curl_exec($ch);
curl_close($ch);

// 清理临时 cookie 文件
unlink($cookie_file); 

以上就是使用 PHP cURL 模拟登录 Discuz 论坛并发布帖子的详细内容,更多关于 PHP 网站自动化开发及安全策略的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。