python discuz_pythonDiscuz发帖器的实现
網(wǎng)絡(luò)技術(shù)需要大家共同分享,不能閉門造車,下面是bj-dnsCom提示:首先要清楚discuz論壇發(fā)帖的流程,簡單地說就是以下流程:進(jìn)入登錄頁 ->登錄 -> 進(jìn)入版面 ->發(fā)帖
首先要清楚discuz論壇發(fā)帖的流程,簡單地說就是以下流程:
進(jìn)入登錄頁 ->登錄 -> 進(jìn)入版面 ->發(fā)帖
登錄和發(fā)帖時要獲取到頁面的formhash值,否則會失敗,如果啟用了驗證碼,還得去分析驗證碼,這就比較復(fù)雜了。這里只用python來描述這一系列過程,涉及到驗證碼還請大家自行去實現(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類中只有一個公開方法
def Post(self,subject,wysiwyg,content)
三個參數(shù),分別是帖子標(biāo)題、是否是可視化編輯、帖子內(nèi)容。
類實例化時會進(jìn)行登錄操作,并同時記錄下cookie以備用,Post方法中會啟用多個線程執(zhí)行私有方法__postTopic(self,**para)進(jìn)行真正的發(fā)帖操作。
所以,基本上Discuz生成的formhash就是一個雞肋 -_-
總結(jié)
以上是生活随笔為你收集整理的python discuz_pythonDiscuz发帖器的实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 武汉商贷转公积金流程
- 下一篇: 浙金中心是不是p2p平台