php curl 发布到 PHPBB

Posted

技术标签:

【中文标题】php curl 发布到 PHPBB【英文标题】:php Curl posting to PHPBB 【发布时间】:2013-01-14 21:19:38 【问题描述】:

我曾经通过我的帐户通过 php 脚本向论坛发布更新,最近它停止工作了,我不能 100% 确定原因 - curl 没有返回任何错误,一切似乎除了出现的消息之外都可以。

我发布到的董事会已为我的用户设置了禁用泛洪限制,我有权发布所需的任何类型的主题

发布即时消息的代码如下(前段时间在网上找到的 - 稍作修改)

$url = "http://url.co.uk/board/"; $post_fields = 'username=user&password=pass&redirect=&login=Log+in'; $lurl = $url."ucp.php"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$lurl); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch,CURLOPT_COOKIEJAR,"cookie.txt"); $result= curl_exec ($ch); curl_close ($ch); $sid1 = explode("sid=",$result); $sid2 = explode('&',$sid1[1]); $sid = rtrim(substr($sid2[0], 0, -29),'"'); $purl = url&"posting.php?mode=post&f=20&sid=$sid"; var_dump($purl); $ch1 = curl_init(); curl_setopt($ch1, CURLOPT_URL,$purl); curl_setopt($ch1,CURLOPT_RETURNTRANSFER,1); curl_setopt ($ch1, CURLOPT_HEADER, false ); curl_setopt($ch1, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch1,CURLOPT_COOKIEFILE,"cookie.txt"); $result1= curl_exec ($ch1); curl_close ($ch1); preg_match('%name="form_token" value="(.*)"\ /\>%',$result1,$security123); preg_match('%name="lastclick" value="(.*)"\ /\>%',$result1,$lastclick); preg_match('%name="creation_time" value="(.*)"\ /\>%',$result1,$ctime1); $lclick = explode('" />',$lastclick[1]); $title = "标题"; $subject = "待发帖"; $post_fields = 数组( '主题' => $标题, '消息' => htmlspecialchars_decode($subject), '图标' => 0, 'poll_title' => "投票名称", 'poll_option_text' => "投票 1\r\n投票 2", 'poll_max_options' => 1, 'poll_length' => 0, 'poll_vote_change' => "开", 'disable_smilies' => 0, 'attach_sig' => 1, '通知' => 0, 'topic_type' => 2, 'topic_time_limit' => "", 'creation_time' => $ctime1[1], 'lastclick' => $lclick[0], 'form_token' => $security123[1], 'sid' => $sid, '发布' => '提交', ); print_r($post_fields); $ch1 = curl_init(); curl_setopt($ch1, CURLOPT_URL,$purl); curl_setopt($ch1, CURLOPT_POST, 1); curl_setopt($ch1, CURLOPT_POSTFIELDS, $post_fields); curl_setopt($ch1,CURLOPT_RETURNTRANSFER,1); curl_setopt ($ch1, CURLOPT_HEADER, false ); curl_setopt($ch1, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch1,CURLOPT_COOKIEFILE,"cookie.txt"); $result2= curl_exec ($ch1); 如果(curl_errno($ch1)) echo '卷曲错误:' . curl_error($ch1); curl_close ($ch1); 回声 $result2;

从这个$result2有论坛的输出线程,但是提交的消息没有发布。

我在 $result2 中登录正常,没有显示任何错误消息。

有什么建议吗?我检查了 sid、form_token、lclick 和 creation_time,它们似乎都是相同且正确的。

卷曲详细输出

* About to connect() to site.co.uk port 80
*   Trying 78.xxx.yyy.zzz... * connected
* Connected to site.co.uk (78.xxx.yyy.zzz) port 80
> POST /board/posting.php?mode=post&f=20 HTTP/1.1

Host: site.co.uk

Accept: */*

Cookie: phpbb3_9g61k_sid=693813912f38db33091212ee14102026; phpbb3_9g61k_k=; phpbb3_9g61k_u=57

Content-Length: 1914

Expect: 100-continue

Content-Type: multipart/form-data; boundary=----------------------------2fb596b13df0



< HTTP/1.1 100 Continue

< HTTP/1.1 302 Found

< Date: Wed, 30 Jan 2013 23:21:39 GMT

< Server: Apache/2.2.22 (CentOS)

< Location: http://site.co.uk/board/viewforum.php?f=20

< Content-Length: 0

< Content-Type: text/html; charset=UTF-8

* Connection #0 to host site.co.uk left intact
* Issue another request to this URL: 'http://site.co.uk/board/viewforum.php?f=20'
* Disables POST, goes with GET
* Re-using existing connection! (#0) with host site.co.uk
* Connected to site.co.uk (78.xxx.yyy.zzz) port 80
> GET /board/viewforum.php?f=20 HTTP/1.1

Host: site.co.uk

Accept: */*

Cookie: phpbb3_9g61k_sid=693813912f38db33091212ee14102026; phpbb3_9g61k_k=; phpbb3_9g61k_u=57



< HTTP/1.1 200 OK

< Date: Wed, 30 Jan 2013 23:21:39 GMT

< Server: Apache/2.2.22 (CentOS)

< Cache-Control: private, no-cache="set-cookie"

< Expires: 0

< Pragma: no-cache

< Transfer-Encoding: chunked

< Content-Type: text/html; charset=UTF-8

* Connection #0 to host site.co.uk left intact
* Closing connection #0

【问题讨论】:

是您的论坛还是其他人的论坛?也许他们阻止了你。 没有被屏蔽,我在论坛上有管理员权限,但没有文件权限。任何日志中都没有显示任何内容,当脚本运行时我可以看到我的用户名在线显示 如果您是本论坛的管理员,为什么不直接将其插入数据库,而是使用 curl? @QuyNguyen 数据库结构非常复杂。在 PhpBB3.x 数据库中手动插入帖子非常困难 不仅如此。但是缓存失效是通过代码发生的 【参考方案1】:

解决了

posting.php 第 49 行

if ($cancel || ($current_time - $lastclick < 2 && $submit))

虽然对我的用户禁用了洪水,但我仍然必须坚持 2 秒的硬编码延迟。

【讨论】:

这听起来像是 PhpBB 中的错误!到 bugtracker 你应该去 该文件并非设计为 API 端点(您会看到 OP 问题 hacking the CSRF token from the page)。这是一个通过快速连续点击两次按钮来防止重复发布的功能。

以上是关于php curl 发布到 PHPBB的主要内容,如果未能解决你的问题,请参考以下文章

phpBB3.2开发环境配置

国外最牛的Php开源建站平台

PHP 中的登录集成

php RAW Curl使用PHP发布到AWS Kinesis

使用 cURL PHP 发布到 Facebook 用户的墙上

PHP 在php中使用curl以编程方式发布到php网页并检索结果