首先要清楚discuz論壇發(fā)帖的流程,簡單地說就是以下流程:
進(jìn)入登錄頁 ->登錄 -> 進(jìn)入版面 ->發(fā)帖
登錄和發(fā)帖時(shí)要獲取到頁面的formhash值,否則會(huì)失敗,如果啟用了驗(yàn)證碼,還得去分析驗(yàn)證碼,這就比較復(fù)雜了。這里只用python來描述這一系列過程,涉及到驗(yàn)證碼還請大家自行去實(shí)現(xiàn)。
#!/usr/bin/env python#coding=utf-8from urllib import urlencodeimport cookielib, urllib2,urllibimport os,sysimport urllib2,cookielib,urllib,httplib,reimport getpassimport timefrom queue import queueimport threadingclass discuz:def __init__(self,uid,pwd,debug = false,**param):self.username = uidself.password = pwdself.para = param#self.timelimit = timelimitself.regex = {loginreg:,postreg:}self.opener = noneself.request = noneself.islogin = falseself.donecount = 0self.__login()self.threadcount = 10def __login(self):try:loginpage = urllib2.urlopen(self.para[loginurl]).read()formhash = re.search(self.regex[loginreg],loginpage)formhash = formhash.group(1)print start login......cookiejar = cookielib.cookiejar()self.opener = urllib2.build_opener(urllib2.httpcookieprocessor(cookiejar))values = {formhash:formhash,username:self.username,password:self.password,loginsubmit:true}data = urllib.urlencode(values)self.request = urllib2.request(self.para[loginsubmiturl], data)rq = self.opener.open(self.request)print login success......self.islogin = trueexcept exception ,e:print edef post(self,subject,wysiwyg,content):threads = []for i in range(self.threadcount):t = threading.thread(target=self.__posttopic,kwargs={_subject:subject,_wysiwyg:wysiwyg,_body:content})threads.append(t)for i in range(self.threadcount):threads[i].start()for i in range(self.threadcount):threads[i].join()print donedef __posttopic(self,**para):if not self.islogin:print please login......returnwhile true:try:self.request = urllib2.request(self.para[posturl])rq = self.opener.open(self.request)data = rq.read()formhash = re.search(self.regex[postreg],data)formhash = formhash.group(1)postdata = {addtags:+可用標(biāo)簽,checkbox:0,formhash:formhash,iconid:,message:para[_body],subject:para[_subject],tags:,updateswfattach : 0,wysiwyg : para[_wysiwyg]}self.request = urllib2.request(self.para[postsubmiturl],urllib.urlencode(postdata))self.opener.open(self.request)self.donecount+=1print %d done..... % self.donecountexcept exception,e:print etime.sleep(2)if __name__==__main__:name = raw_input(username:)password = getpass.getpass(password:)dz = discuz(name,password,loginurl=http://xxx/logging.php?action=login,loginsubmiturl=http://xxx/logging.php?action=login&loginsubmit=yes,posturl=http://xxx/post.php?action=newthread&fid=5,postsubmiturl=http://xxx/post.php?&action=newthread&fid=5&extra=&topicsubmit=yes)content=這是帖子內(nèi)容dz.post(這是帖子內(nèi)容,1,content)discuz類中只有一個(gè)公開方法
def post(self,subject,wysiwyg,content)
三個(gè)參數(shù),分別是帖子標(biāo)題、是否是可視化編輯、帖子內(nèi)容。
類實(shí)例化時(shí)會(huì)進(jìn)行登錄操作,并同時(shí)記錄下cookie以備用,post方法中會(huì)啟用多個(gè)線程執(zhí)行私有方法__posttopic(self,**para)進(jìn)行真正的發(fā)帖操作。
所以,基本上discuz生成的formhash就是一個(gè)雞肋 -_-
新聞熱點(diǎn)
疑難解答
圖片精選