热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PYTHON实现DISCUZ论坛的自动POST登录发贴回帖

#-*-coding:utf-8-*-importurllib2,urllib,cookielibimportreimportgetpassimportsqlite3impor

class="wp_codebox">



id="p107code2" class="code">

#-*-coding:utf-8-*-
import urllib2, urllib, COOKIElib
import re
import getpass
import sqlite3
import random
import time
 
class Discuz:
def __init__(self,user,pwd,args):
self.username = user
self.password = pwd
self.args = args
self.regex = {
‘loginreg‘:‘‘,
‘replyreg‘:‘‘,
‘tidreg‘: ‘[\s\S]+?‘
}
self.conn = None
self.cur = None
self.islogin = False
self.login()
self.InitDB()
 
def login(self):
try:
loginPage = urllib2.urlopen(self.args[‘loginurl‘]).read()
formhash = re.search(self.regex[‘loginreg‘], loginPage)
formhash = formhash.group(1)
#print ‘login formhash:‘, formhash
print ‘start login...‘
cj = COOKIElib.COOKIEJar()
opener = urllib2.build_opener(urllib2.HTTPCOOKIEProcessor(cj))
user_agent = ‘Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Mozilla/4.0 \
(compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 2.0.507‘

opener.addheaders = [(‘User-agent‘, user_agent)]
urllib2.install_opener(opener)
logindata = urllib.urlencode({
‘COOKIEtime‘: 2592000,
‘formhash‘: formhash,
‘loginfield‘:‘username‘,
‘username‘: self.username,
‘password‘: self.password,
‘questionid‘: 0,
‘referer‘: self.args[‘referer‘]
})
request = urllib2.Request(self.args[‘loginsubmiturl‘],logindata)
respOnse= urllib2.urlopen(request)
self.islogin = True
print ‘login success...‘
except Exception,e:
print ‘loggin error: %s‘ % e
 
def PostReply(self, fid, tid, content):
try:
sql = "select * from post where fid=‘%s‘ and tid=‘%s‘" % (fid,tid)
self.cur.execute(sql)
if self.cur.rowcount == -1:
tidurl = self.args[‘tidurl‘] % tid
replysubmiturl = self.args[‘replysubmiturl‘] % (fid,tid)
tidPage = urllib2.urlopen(tidurl).read()
formhash = re.search(self.regex[‘replyreg‘], tidPage)
formhash = formhash.group(1)
#print ‘reply formhash:‘, formhash
print ‘start reply...‘
replydata = urllib.urlencode({
‘formhash‘: formhash,
‘message‘: content,
‘subject‘: ‘‘,
‘usesig‘:‘1‘
})
request = urllib2.Request(replysubmiturl,replydata)
respOnse= urllib2.urlopen(request)
sql = "insert into post values (‘%s‘, ‘%s‘, ‘%d‘)" % (fid, tid, 1)
self.cur.execute(sql)
self.conn.commit()
print ‘reply success for [%s]‘ % tidurl
else:
print ‘Skip! Thread:%s is already replied...‘ % tid
except Exception, e:
print ‘reply error: %s‘ % e
 
def GetTids(self, fid):
if self.islogin:
fidurl = self.args[‘fidurl‘] % fid
respOnse= urllib2.urlopen(fidurl)
cOntent= response.read()
tids = re.findall(self.regex[‘tidreg‘], content)
return tids
else:
print ‘Error Please Login...‘
 
def InitDB(self):
self.conn = sqlite3.connect(‘data.db‘)
self.cur = self.conn.cursor()
sql = ‘‘‘create table if not exists post (
fid text,
tid text,
replied integer)‘‘‘

self.cur.execute(sql)
self.conn.commit()
 
if __name__ == ‘__main__‘:
username = raw_input(‘username:‘).strip()
password = getpass.getpass(‘password:‘).strip()
args = {
‘loginurl‘: ‘http://www.xxx.com/logging.php?action=login‘,
‘loginsubmiturl‘: ‘http://www.xxx.com/logging.php?action=login&loginsubmit=yes‘,
‘fidurl‘: ‘http://www.xxx.com/forum-%s-1.html‘,
‘tidurl‘: ‘http://www.xxx.com/thread-%s-1-1.html‘,
‘replysubmiturl‘: ‘http://www.xxx.com/post.php?action=reply&replysubmit=yes&infloat=yes&handlekey=fastpost&fid=%s&tid=%s‘,
‘referer‘:‘http://www.xxx.com/index.php‘
}
dz = Discuz(username, password,args)
fid = ‘45‘
tids = dz.GetTids(‘45‘)
replylist = [
u‘不错,支持一下,呵呵‘,
u‘已阅,顶一下‘,
u‘看看,顶你,呵呵‘,
u‘多谢分享,顶一下‘,
u‘说的不错,支持一下‘,
u‘提着水桶到处转,哪里缺水哪里灌! ‘,
u‘你太油菜了!‘
]
for tid in tids:
cOntent= random.choice(replylist)
cOntent= content.encode(‘gbk‘)
dz.PostReply(‘45‘,tid, content)
time.sleep(20)


-

下面简单说下过程:

首先是得到了login的post地址:http://www.xxx.com/logging.php?action=login&loginsubmit=yes
>几个关键的parameter是


formhash
> COOKIEtime

formhash
loginfield

password
questionid

referer
username




  • COOKIEtime 浏览器自?

PYTHON实现DISCUZ论坛的自动POST登录发贴回帖,布布扣,bubuko.com


推荐阅读
  • 学习kmp算法我最后是看的数据结构书上的一本教材学会的。。我觉得kmp相对于普通的BF算法就是避免了很多不必要的匹配,而kmp算法的精髓自然就在于next数组的运用。。。而next ... [详细]
  • 前言:拿到一个案例,去分析:它该是做分类还是做回归,哪部分该做分类,哪部分该做回归,哪部分该做优化,它们的目标值分别是什么。再挑影响因素,哪些和分类有关的影响因素,哪些和回归有关的 ... [详细]
  • 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 2.对于随机访问get和set,ArrayList优于LinkedList,因为Ar ... [详细]
  • 动手动脑,无法自拔(3)课时作业6
    1.动手动脑(五子棋棋盘排布)(1)源程序(2)实验截图2.动手动脑(数字转换成汉字)(1)源程序(2)实验截图3.动手动脑(大数计算)(1)源程序 ... [详细]
  • gitlab重置password
    ruby没怎么学,自己搭建的gitlab的rootpassword又忘了。幸好看见此帖子,试验okhttp:roland.kierkels.netgitreset-your-git ... [详细]
  • 第8章 使用外部和内部链接
    8.1使用web地址LearnAboutafricanelephants. ... [详细]
  • substring( ) 和 substr( ) 的区别
    1、里面的参数定义不一样substring(x,y)substr(x,y);substring里面的x,y是位置,相当于坐标,substr里的x是位置,y是长度length特殊备注 ... [详细]
  • 说到C语言的语句块,真是一堆血泪史。第一大坑就是优先级。刚工作那会儿,C的书没看几本,自信满满的认为C语言都会了,拿出搞ACM培养的豪情壮志,代码倒是写得爽,却到处留 ... [详细]
  • 今天我们开始学习下拉及多级弹出菜单,包含以下内容和知识点:带下拉子菜单的导航菜单绝对定位和浮动的区别和运用css自适应宽度滑动门菜单一、带下拉子菜单的导航菜单下拉菜单在一些 ... [详细]
  • 在程序开发中,经常需要处理日期和时间的相关数据,此时我们可以使用java.util包中的Date类。这个类最主要的作用就是获取当前时间,我们来看下Date类的使用:使用Date类的 ... [详细]
  • java的流分两大类,字节流和字符流。一般在cc++中,一个字节是8位,java也是一样。但是,在cc++中一个字符,即char一般也是8位(可能机器不同会有所不同),但java为 ... [详细]
  • 常用工具(一)
    1.时间戳在线转换工具(1)链接https:tool.lutimestamp(2)说明可以通过此工具:将时间戳转为具体时间点,也可以将具体时间点转为时间戳(3)效果2.JSON在线 ... [详细]
  • P1025数的划分学傻了,学傻了,什么d ... [详细]
  • android ... [详细]
  • 前言:关于跨域CORS1.没有跨域时,ajax默认是带cookie的2.跨域时,两种解决方案:1)服务器端在filter中配置详情:http:blog.csdn.netwzl002 ... [详细]
author-avatar
张哥他爹
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有