Discuz发帖机Python版

in python

流程:

1、获取logging.php?action=login页的源代码,分析得到fromhash

2、输入用户名与密码,POST至/logging.php?action=login&loginsubmit=yes地址

3、得到cookie并保存

4、访问发帖页面并附带上cookie

直接源码吧

#-*-coding:utf-8-*-
from urllib import urlencode
import cookielib, urllib2,urllib
import os,sys
import re
from xml.dom.minidom import parse, parseString
import getpass
import time
from Queue import Queue
import threading

class Discuz:
    def __init__(self,uid,pwd,**param):
        self.username = uid
        self.password = pwd
        self.para = param
        self.regex = {
            'loginreg':'<input\s*type="hidden"\s*name="formhash"\s*value="([\w\W]+?)"\s*\/>',
            'postreg':'<input\s*type="hidden"\s*name="formhash"\s*id="formhash"\s*value="([\w\W]+?)"\s*\/>'
        }
        self.opener = None
        self.request = None
        self.islogin = False
        self.donecount = 0
        self.__login()
        self.threadcount = 100    #总线程数
        self.count = 0
        self.totalcount = 100000   #发帖量
    def __login(self):
        try:
            loginPage = urllib2.urlopen(self.para['loginurl']).read()
            formhash = re.search(self.regex['loginreg'],loginPage)
            formhash = formhash.group(1)
            print formhash
            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 = True

        except Exception ,e:
            print 'Loggin Error:%s' % e
    def 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()
        lst = threading.enumerate()
        for i in range(self.threadcount):
            threads[i].join()
        print 'done'
    def __postTopic(self,**para):
        if not self.islogin:
            print 'please login......'
            return
        while self.count < self.totalcount:
            try:
                print 'current count %d:' % self.count
                print 'current thread name %s' % (threading.currentThread().getName())
                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+=1
                print '%d done.....' % self.donecount
            except Exception,e:
                print e
            if para.has_key('sleep'):
                time.sleep(float(para['sleep']))
            self.count +=1

if __name__=='__main__':
    name = raw_input('username:').strip()
    password = getpass.getpass('password:').strip()
    dz = Discuz(name,password,
    loginurl='http://localhost/logging.php?action=login',
    loginsubmiturl='http://localhost/logging.php?action=login&loginsubmit=yes',
    posturl='http://localhost/post.php?action=newthread&fid=28',
    postsubmiturl='http://localhost/post.php?&action=newthread&fid=28&extra=&topicsubmit=yes',
    sleep='1'
    )
    content='''新手如何 练级更加快??送极品装备!新手必看
绑定升级钻石账号方法超简单:
1 新用户:直接到推广页面[url=http://tg.sdo.com/38797039]http://tg.sdo.com/38797039[/url]注册账号时在“推广员账号”一栏填推广员号adaccount直接升级钻石账号。
2 已经注册盛.大通行证的玩家在这里绑定直接成为 钻石账号 玩家
第一步: 点此 预绑定用户认证 [url=http://178.sdo.com/web/ConsumerBindUser.aspx]http://178.sdo.com/web/ConsumerBindUser.aspx[/url]
第二步: 点此进行最终绑定确认 [url=http://gift.sdo.com/Consumer/AIONBindUser.aspx]http://gift.sdo.com/Consumer/AIONBindUser.aspx[/url]

推广员填:adaccount'''

    dz.Post('送极品装备!新手必看','1',content)

运行截图

8 Comments

8 Comments

  1. 经典论坛垃圾帖子都是你发的吧。[face:1]

  2. 有腾讯围脖邀请码不?有的话跟我搞一个[face:16]

  3. 好像最近搞起PY来了。

  4. 来给你说一下我的网站地址改了。
    我懒得上MSN。
    你改下。
    我的新站是crazyphper.com/wblog/ [face:4]

  5. 这。。。好用不?分享一份,哈哈!

  6. 這個好用, 不用重頭開發了 , 感謝分享

Leave a Reply

Using Gravatars in the comments - get your own and be recognized!

XHTML: These are some of the tags you can use: <a href=""> <b> <blockquote> <code> <em> <i> <strike> <strong>