Discuz X 发帖提交器一点实现

本文介绍了一段使用Python实现的脚本,用于自动登录并提交DiscuzX论坛的帖子。脚本通过模拟浏览器行为,实现了自动填写表单、登录验证和帖子发布功能,极大地提高了操作效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#!/usr/bin/python
#coding=utf-8
#post by EvilBinary 小E 实现Discuz X 的post自动提交。
#Filename: post.py

import urllib,urllib2,cookielib,re,os
import fnmatch,sys,time,random

url ='http://bbs.xxxxxx.net/'
cookie=cookielib.CookieJar()
def login(username,password):
	action='member.php?mod=logging&action=login&loginsubmit=yes&handlekey=login&loginhash=LIQ5i'
	logindata=(('username',username), ('password',password))
	opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
	agents = ["Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)","Internet Explorer 7 (Windows Vista); Mozilla/4.0 ","Google Chrome 0.2.149.29 (Windows XP)","Opera 9.25 (Windows Vista)","Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1)","Opera/8.00 (Windows NT 5.1; U; en)"]
	agent = random.choice(agents)	
	#print agent
	#opener.addheaders = [('User-agent','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)')]
	opener.addheaders=[('User-agent',agent)]
	urllib2.install_opener(opener)
	req=urllib2.Request(url+action,urllib.urlencode(logindata))
	content = ""
  	err_count = 0
	flage = True
  	while flage:
		try:
			u=urllib2.urlopen(req)
			content=u.read()
			flage=False
			getResultInfo(content)
		except urllib2.HTTPError, e:
			if err_count > 10:
				exit(1)
			err_count += 1
			print e
			flage = True
			if e.getcode()== 403:
				print "Wait for 5 minutes..."
        		time.sleep(5 * 60)

	#print content
	return content

def getResultInfo(content):
	p = re.compile('<div\s*id="messagetext"\s*class="alert_error"\s*>\s*<p>(.*?)\s*<script\s*')
	m = p.findall(content)
	if len(m) > 0:
		for i in m:
			print  i.replace('</p>','').decode('gbk','ignore')	
		return m[0].replace('</p>','')
	else:
		return ''

def post(fid,title,contents):
	action='forum.php?mod=post&action=newthread&fid='+fid
	request=urllib2.Request(url+action,urllib.urlencode(''))
	content = ""
  	err_count = 0
	flage = True
  	while flage:
		try:
			page=urllib2.urlopen(request)
			content=page.read()

			flage=False
		except urllib2.HTTPError, e:
			if err_count > 10:
				exit(1)
			err_count += 1
			print e
			flage = True
			if e.getcode() == 403:
				print "Wait for 5 minutes..."
				time.sleep(5 * 60)
	#print content.decode('gbk')
	try:
		getResultInfo(content)
		str='<input\s*type="hidden"\s*name="formhash"\s*id="formhash"\s*value="(.*?)"\s*\/>'
		reObj=re.compile(str)
		allMatch=reObj.findall(content)
		formhash=allMatch[0]
		#print formhash
		str='<input\s*type="hidden"\s*name="posttime"\s*id="posttime"\s*value="(.*?)"\s*\/>'
		reObj=re.compile(str)
		allMatch=reObj.findall(content)
		posttime=allMatch[0]
		#print posttime
	except Exception,e:
		print e
		#print content
		exit(1)
	#print content
	postdata=(("formhash",formhash),("posttime",posttime),("wysiwyg","1"),("subject",title),("message",contents),("save",""),("usesig","1"),("allownoticeauthor","1")) #,("typeid","28")
	params=urllib.urlencode(postdata,'gbk')
	#print params
	action='forum.php?mod=post&action=newthread&fid='+fid+'&extra=&topicsubmit=yes'
	request=urllib2.Request(url+action,params)
	content = ""
  	err_count = 0
	flage=True
  	while flage:
		try:
			page=urllib2.urlopen(request)
			content=page.read()
			flage=False
		except urllib2.HTTPError, e:
			if err_count > 10:
				exit(1)
			err_count += 1
			print e
			flage = True
			if e.getcode() == 403:
				print "Wait for 5 minutes..."
				time.sleep(5 * 60)
	getResultInfo(content)
	#f=open('test.html',"w")
	#f.write(content)
	#f.close()

def postAllFile(path,fid):
	if(path==''):
		path='./'
		print 'null'
	else:
		for fileName in os.listdir (path):
			if fnmatch.fnmatch ( fileName, '*.txt' ):
				initsize=900
				print 'Posting... '+fileName
				f=open(path+fileName,"r")
				contents=f.read()
				fileName=fileName.replace('.txt','')
				count=0
				totallen=len(contents)
				oder=0
				while count<= totallen:
					if count==0:
						fileName=unicode(fileName,'utf-8','ignore').encode('gbk','ignore')
					else:
						fileName=unicode(fileName+'继'+str(oder),'utf-8','ignore').encode('gbk','ignore')	
					c= unicode(contents[count:count+initsize],'utf-8','ignore').encode('gbk','ignore')
					post(fid,fileName,c)
					#time.sleep(20)
					#print fileName
					#print c
					count+=initsize
					oder+=1
				f.close()
				

if __name__ == "__main__":
	fid=0
	if len(sys.argv) < 2:
		print "usage :", sys.argv[0], "<username> <password> <url> <fid> "
		exit(1)
	else:
		try:
			username = sys.argv[1]
			password=sys.argv[2]
			if len(sys.argv) >3:
				url=sys.argv[3]
			if len(sys.argv)>4:
				fid=sys.argv[4]
			#print username+' '+password+' '+url+' '+fid
			login(username,password)
			postAllFile('./',fid)
		except Exception,e:
			print 'Error'
			print e

一、Discuz论坛批量发贴机简介 Discuz论坛批量发贴机,采用.net平台开发。该发贴机使用模块化开发,运用了多线程和xml存储技术。适用于通用的Discuz论坛程序的批量发帖。可以设置一个帖子发布到N个论坛,或者N个帖子发布到一个论坛。全自动化的formhash获取,分类获取。多线程技术让发帖速度更快更好。 二、使用方法 1,打开批量发贴机,点击设置文章和参数按钮。 2,在弹出的窗口中,填入论坛地址,用户名,密码,以及要发布到论坛的哪个频道。注意密码框使用了前景和背景一样的颜色,所以要选中才可以看到。fid是论坛的频道代码,可以在发布前打开论坛对应频道,然后在网址里面看看fid的数字是多少。没使用rewrite静态化的discuz论坛,其网址里面直接可以看到fid=***,这个***就可以填到弹出窗口的fid里面了。如果是静态化的,那么一般是forum-***-1.html或者其他,只要是两个-中间那一个就是fid了。 3,在下面的文章里面填入文章标题和文章内容,注意一些论坛有标题和内容长度限制。 4,设置好论坛发帖频率,防止发送过快被拦截。 5,设置好参数之后,给需要发帖的论坛前面的选择框打上勾,要发布的文章前面也同样打上勾。 6,最后最重要的一步,一定要点击保存按钮,前面的一切设置才会保存下来! 7,设置完之后,点击保存按钮,弹出窗口自动关闭。点击发贴机界面的第二个按钮进入自动发帖
<think>好的,我现在需要帮助用户找到Discuz X3.4中内置的ajaxPost功能的使用示例或代码实例。首先,我需要回忆一下Discuz的结构和常见的使用方法。 Discuz是一个流行的论坛系统,X3.4版本应该包含一些内置的AJAX功能,ajaxPost可能是其中用于发送POST请求的方法。用户可能需要在前端调用这个函数,比如提交表单或动态加载内容。 我应该先确认ajaxPost的具体用法。通常在Discuz的模板或插件中,可能会用到这个函数。可能需要查看官方文档或者社区讨论,但用户可能没有这些资料,所以我得根据经验推断。 ajaxPost的基本结构可能类似于其他AJAX库,需要指定URL、数据、回调函数等参数。例如,函数签名可能是ajaxPost(url, data, callback)。接下来,用户可能需要一个简单的示例,比如提交表单数据到服务并处理响应。 还需要考虑Discuz的安全机制,比如表单哈希(formhash)和CSRF保护。在发送请求时,可能需要包含formhash值,否则请求会被拒绝。因此,在示例中需要提醒用户获取并添加formhash到数据中。 另外,处理返回的数据时,Discuz可能返回JSON格式的数据,其中包含状态码和消息。例如,success为1表示成功,0表示失败,并附带错误信息。回调函数需要处理这些情况,并更新页面内容或提示用户。 可能还需要提到如何绑定事件,比如点击按钮时触发ajaxPost。例如,在模板中使用onclick事件调用JavaScript函数,并传递必要的参数。 用户的问题可能涉及到前后端的交互,所以除了前端代码,可能需要简要说明后端处理请求的PHP代码示例。例如,在source/module/目录下创建自定义模块,处理传入的POST参数,并返回JSON响应。 还需要注意Discuz的钩子或插件机制,确保自定义的AJAX处理能够被正确路由和调用。可能需要使用特定的URL结构,如action=mycustom_action,并在后端根据这个action参数执行相应的逻辑。 最后,需要检查是否有常见的错误或注意事项,比如缓存问题、权限验证,以及正确使用Discuz的全局函数和变量。例如,使用$_G['formhash']获取当前表单哈希,确保请求的合法性。 总结一下,我需要提供一个前端使用ajaxPost的示例代码,说明如何构造请求和处理响应,同时给出后端处理的基本框架,并提醒用户注意安全机制和常见问题。</think>### Discuz X3.4 ajaxPost 使用示例 在Discuz X3.4中,`ajaxpost` 是内置的异步请求方法,主要用于实现无刷新提交数据功能。以下是典型的使用场景和代码实现: --- #### **一、基础调用示例** ```javascript // 提交数据到指定接口 ajaxpost('forum.php?mod=ajax&action=myaction', { formhash: $_G['formhash'], // 必须包含表单哈希防止CSRF攻击[^1] data1: 'value1', data2: 'value2' }, function(result) { if (result && result.status == 1) { showDialog('操作成功', 'right', null, function(){ location.reload(); }); } else { showError(result.message || '请求失败'); } }); ``` --- #### **二、关键参数解析** 1. **URL构造** URL需指向Discuz路由控制(如`source/module/forum/forum_ajax.php`),通过`mod`和`action`参数指定处理逻辑: ```javascript 'forum.php?mod=ajax&action=vote' // 示例:帖子投票功能接口 ``` 2. **数据格式** POST数据必须包含: - `formhash`:通过`$_G['formhash']`获取当前会话安全哈希 - 自定义参数:如帖子ID`tid`、内容`message`等 3. **回调处理** 返回结果结构包含: ```json { "status": 1, // 1=成功 0=失败 "message": "操作提示", "data": {} // 扩展数据 } ``` --- #### **三、完整应用场景(发帖异步验证)** ```javascript // 绑定表单提交事件 $('submit_btn').onclick = function() { var postdata = { formhash: $_G['formhash'], subject: $('subject').value, message: $('editor').value }; ajaxpost('forum.php?mod=ajax&action=checkpost', postdata, function(res) { if (res.status == 1) { // 验证通过后提交完整表单 $('postform').submit(); } else { alert('错误:' + res.message); } }); }; ``` --- #### **四、后端处理示例** 在`source/module/forum/forum_ajax.php`中添加自定义处理逻辑: ```php // 根据action参数路由 if ($_GET['action'] == 'myaction') { $data1 = $_POST['data1']; $data2 = $_POST['data2']; // 业务逻辑处理 if ($data1 && $data2) { ajaxshow(array('status' => 1, 'message' => '操作成功')); } else { ajaxshow(array('status' => 0, 'message' => '参数缺失')); } } ``` --- #### **五、注意事项** 1. **安全验证** 必须验证`$_GET['formhash']`与`$_G['formhash']`的一致性,防止伪造请求[^1] 2. **编码规范** 返回数据需使用`ajaxshow()`函数输出标准JSON响应 3. **调试方法** 浏览开发者工具中查看Network标签的请求/响应详情 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值