国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Python > 正文

python:Discuz發帖器的實現

2024-09-09 19:03:44
字體:
來源:轉載
供稿:網友

首先要清楚discuz論壇發帖的流程,簡單地說就是以下流程:

進入登錄頁 ->登錄 -> 進入版面 ->發帖

登錄和發帖時要獲取到頁面的formhash值,否則會失敗,如果啟用了驗證碼,還得去分析驗證碼,這就比較復雜了。這里只用python來描述這一系列過程,涉及到驗證碼還請大家自行去實現。

 

#!/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:+可用標簽,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=這是帖子內容dz.post(這是帖子內容,1,content)

discuz類中只有一個公開方法
def post(self,subject,wysiwyg,content)
三個參數,分別是帖子標題、是否是可視化編輯、帖子內容。
類實例化時會進行登錄操作,并同時記錄下cookie以備用,post方法中會啟用多個線程執行私有方法__posttopic(self,**para)進行真正的發帖操作。
所以,基本上discuz生成的formhash就是一個雞肋 -_-

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 海口市| 望谟县| 宁晋县| 常山县| 乐业县| 新昌县| 增城市| 磴口县| 辽阳县| 盘锦市| 原阳县| 灵寿县| 吉安市| 绥宁县| 城步| 佳木斯市| 平武县| 通河县| 广水市| 贵溪市| 和政县| 永善县| 繁峙县| 中西区| 连州市| 澎湖县| 南通市| 龙州县| 绥阳县| 安乡县| 芜湖市| 什邡市| 怀化市| 淳安县| 竹山县| 葫芦岛市| 清远市| 叙永县| 甘谷县| 威海市| 新乡县|