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,设置完之后,点击保存按钮,弹出窗口自动关闭。点击发贴机界面的第二个按钮进入自动发帖
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值