国产探花免费观看_亚洲丰满少妇自慰呻吟_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就是一個雞肋 -_-

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 古丈县| 定边县| 赣州市| 三门县| 东安县| 泰安市| 唐海县| 萍乡市| 扶风县| 偃师市| 琼海市| 洱源县| 汉阴县| 绥德县| 五指山市| 衡南县| 陆河县| 龙川县| 广平县| 长岛县| 聂拉木县| 鱼台县| 深圳市| 肃南| 延庆县| 龙州县| 冕宁县| 桃园市| 临汾市| 饶河县| 泰和县| 马关县| 武隆县| 泰顺县| 乐平市| 英超| 建阳市| 五指山市| 澜沧| 建湖县| 炎陵县|