首页 > 源码分享 > 分享:Discuz论坛自动发帖机

分享:Discuz论坛自动发帖机

最近,因为工作上需要,要往自己搭建的discuz论坛系统上发帖。刚开始,在网上找了好多,总是出现各种各样的问题,有的要注册,有的要收费,还有的在用的过程中不稳定,经常出现各种异常。浪费了一整天的时间,没有找到合适的,于是决定自己写一个。下面分享一个做的过程中遇到的一些问题,以及解决的方法。最后,我会把源码分享出来,希望能够对有需要的朋友有所帮助。

1. 准备工作

开始动手写程序之前,需要了解一下discuz发帖的基本原理。这里最好的方法就是用抓包工具来抓取浏览器发包时与web服务器之间的交互过程。可选的工具有Firebug和HttpWatch。Firebug是Firefox上专用的,是免费的,不过功能没有HttpWatch强大。HttpWatch是可以在IE和Firefox上用的,功能比较强大,但是收费的,不过网上应该能下到免费版的。我个人比较推荐使用功能强大的HttpWatch。

2. 分析Discuz发帖过程

我们知道,发帖的过程,本质上就是往web服务器POST数据的过程(如果不了解啥是POST的同学,先去了解一下HTTP协议吧 😛 )。在开始介绍发帖机原理之前,请大家回忆一下自己去某个论坛发帖的整个过程,总结了一下,大概包括以下几个过程:
(1)输入用户名、密码登录论坛
(2)点击进入某个感兴趣的板块
(3)编写帖子,发帖
自动发帖机的基本工作原理就是用程序模拟人发帖的过程,所以自动发帖机在实现在过程中也包含以上三个过程,这一点会在后面讲实现的时候看到。

3. 补充一些基础知识

我这个自动发帖机是用shell脚本实现的,主要是用wget工具来完成的。所以,在这里简单介绍一下wget的用法,以及在接下来发帖机实现过程中要用到的一些选项。

1
2
3
4
5
6
7
8
9
10
基本用法:wget $url [options] 
选项:
             -d debug模式,会把http交互过程打出来,这个选项在跟踪问题是比较有用
             --save-cookies=file 把cookie存到指定的文件
             --load-cookies=file 从指定文件file中加载cookie
             --user-agent=string 指定请求时所带的UA
             --post-data=data 指定要向服务器POST的数据内容
             --referer=url 指定referer url,解决web服务器有防盗链设置
             -O file 把web服务器的应答页面存入指定的文件
             -a file 把输出信息append到指定文件

4. 实现自动发帖机

(1)登录

1
2
3
4
5
6
7
8
9
10
11
12
#login discuz bbs
function login()
{
	local url="http://$host/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&inajax=1" 
	local data="fastloginfield=username&username=$user&cookietime=2592000&password=$passwd&quickforward=yes&handlekey=ls&questionid=0&answer=" 
	wget $url -d \
              --save-cookies=$cookie_file \
              --user-agent="$user_agent" \
              --post-data="$data" \
              -O $page \
              -a $header 2>/dev/null
}

(2)进入板块

1
2
3
4
5
6
7
8
9
10
11
function goto_board()
{
	local fid=$1
	local url="http://$host/forum.php?mod=forumdisplay&fid=$fid"
	wget $url -d \
              --load-cookies=$cookie_file \
              --user-agent="$user_agent" \
              --save-cookies=$cookie_file \
              -O $page \
              -a $header 2>/dev/null
}

(3)发帖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function post()
{
	local fid=$1
	local subject=$2
	local message=$3
 
	goto_board $fid
	local formhash=`get_formhash`
	local referer="http://$host/forum.php?mod=forumdisplay&fid=$fid"
	local url="http://$host/forum.php?mod=post&action=newthread&fid=$fid&topicsubmit=yes&infloat=yes&handlekey=fastnewpost&inajax=1"
	local data="subject=$subject&message=$message&formhash=$formhash&usesig=1"
	wget $url -d \
              --load-cookie=$cookie_file \
              --user-agent="$user_agent" \
              --referer="$referer" \
              --post-data="$data" \
              -O $page \
              -a $header 2>/dev/null
}

5. 注意事项

(1)上面讲的发帖机只能用在登录时没有图形验证码的Discuz论坛中,我是用Discuz X1.5正式版做的测试。
(2)在发帖过程中,discuz有个验证formhash的过程,细心的朋友在看上面程序的过程时,应该会有所发现
(3)本发帖机完全免费、开源,任何个人或机构都可以在不合法的前提下使用
(4)要获取完整的发帖机程序,请访问:http://code.google.com/p/xiao5geproject/source/browse/trunk/auto_poster/auto_poster.sh
(5)本发帖机版权属小武哥所有,转帖的同学,请保留原文地址,谢谢!

  1. 2011年3月9日18:35 | #1

    这是发什么类型帖子用的呢?

  2. 2011年3月9日21:46 | #2

    discuz论坛发什么帖都可以@博士海龟馆

  3. 2011年3月11日15:19 | #3

    谢谢博主分享,正找这个呢

  4. 2011年3月14日11:10 | #4

    论坛自动发帖机,听起来还真的不错。。。看来我要好好研究下了

  5. 2011年3月14日14:52 | #5

    怎么会工作需要的?

  6. 2011年3月17日10:20 | #7

    好像不是很好用吧,法多了就成了垃圾帖

  7. 2011年3月17日10:21 | #9

    要修改源码啊,挺麻烦的

  8. 2011年3月21日13:02 | #11

    我一般是用curl与服务器交互和测试,wget用来下载,原来wget也有post功能啊。

  9. 2011年3月21日13:37 | #12

    两者都可以,不过我感觉wget的功能更强大些~@ivy

  10. 2011年3月21日13:46 | #13

    @小武哥
    不是吧,比如上传文件。wget的手册里:
    In particular, –post-file is not
    for transmitting files as form attachments: those must appear as
    “key=value” data (with appropriate percent-coding) just like
    everything else. Wget does not currently support
    “multipart/form-data” for transmitting POST data; only
    “application/x-www-form-urlencoded”.

  11. 2011年3月21日18:23 | #14

    curl也有缺陷嘛@ivy

  12. clark
    2013年12月9日16:40 | #15

    稍微看了下代码,不错,楼主好人!

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
您必须在 登录 后才能发布评论.