python discuz_pythonDiscuz发帖器的实现

网络技术需要大家共同分享,不能闭门造车,下面是bj-dnsCom提示:首先要清楚discuz论坛发帖的流程,简单地说就是以下流程:进入登录页 ->登录 -> 进入版面 ->发帖

首先要清楚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就是一个鸡肋 -_-

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值