您现在的位置是:首页 > cms教程 > Discuz教程Discuz教程
Python实现Discuz论坛的自动POST登录发贴回帖实例
代真2025-07-10Discuz教程已有人查阅
导读下面简单说下过程:首先是得到了login的post地址:几个关键的parameter是loginurl为登录面页,用于获得formhash的值loginsubmiturl为post登录参数的地址
#-*-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':'<input\s*type="hidden"\s*name="formhash"\s*value="([\w\W]+?)"\s*\/>',
'replyreg':'<input\s*type="hidden"\s*name="formhash"\s*value="([\w\W]+?)"\s*\/>',
'tidreg': '<tbody\s*id="normalthread_\d+">[\s\S]+?<span\s*id="thread_(\d+)">'
}
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:// .xxx.com/logging.php?action=login',
'loginsubmiturl': 'http:// .xxx.com/logging.php?action=login&loginsubmit=yes',
'fidurl': 'http:// .xxx.com/forum-%s-1.html',
'tidurl': 'http:// .xxx.com/thread-%s-1-1.html',
'replysubmiturl': 'http:// .xxx.com/post.php?action=reply&replysubmit=yes&infloat=yes&handlekey=fastpost&fid=%s&tid=%s',
'referer':'http:// .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地址:
几个关键的parameter是
formhash
cookietime
formhash
loginfield
password
questionid
referer
username
cookietime 浏览器自动给的是 2592000
loginfield 默认的username
password 密码
questionid 这个貌似是登录时的回答问题,这个论坛没有强制回答所以用默认的0
referer 这个则是引用地址
username 用户名
formhash 之后这个貌似这个是随机的,不固定,可也是个关键参数,所以就直接用正则查找之
args = {
'loginurl': 'http:// .xxx.com/logging.php?action=login',
'loginsubmiturl': 'http:// .xxx.com/logging.php?action=login&loginsubmit=yes',
'fidurl': 'http:// .xxx.com/forum-%s-1.html',
'tidurl': 'http:// .xxx.com/thread-%s-1-1.html',
'replysubmiturl': 'http:// .xxx.com/post.php?action=reply&replysubmit=yes&infloat=yes&handlekey=fastpost&fid=%s&tid=%s',
'referer':'http:// .xxx.com/index.php'
}
loginurl为登录面页,用于获得formhash的值loginsubmiturl为post登录参数的地址
fidurl这个是版块的ID,url中%s那里即为fid,这样的url ,fid即为45
tidurl是帖子的id,查找方法同上
replysubmiturl这个是回复帖子post参数的url,要定位一个帖子前提得知道fid和tid
referer这个是引用地址,用网站的首页即可
本文标签:
很赞哦! ()
上一篇:discuz脚本发表帖子的方法
下一篇:怎么修改discuz首页logo
相关教程
图文教程
discuz美化提升外观和体验的方法
Discuz可以通过美化插件和自定义CSS提升外观和体验。具体方法包括:使用美化插件,如DiscuzPlus、SimpleStyle和ElegantStyle。自定义CSS文件(style.css)编辑关键CSS类,
Discuz的NT非官方升级介绍
接触Discuz的NT有很长的一段时间,从最初的神秘到现在的跃跃欲试,在这个九月之后一天,十一的前一天下午,终于完成了一次非官方升级!
discuz数据库表说明
pre_common_addon 插件扩展中心服务商表pre_common_admincp_cmenu 后台管理面板,自定义常用菜单表pre_common_admincp_group 后台团队职务名称表
Discuz!NT网站安装自动化论坛程序安装及初始化过程
网站安装自动化--论坛程序安装及初始化过程论坛的安装文件位于Discuz.Web中的Instal文件夹中。该文件夹中的文件index.aspx为安装的起始页。
相关源码
-
响应式帝国cms7.5NBA黑色体育资讯模板下载本模板为体育新闻媒体、报道机构设计,采用帝国CMS7.5内核开发,具备完整的资讯发布、体育日历、数据展示功能。响应式布局确保在手机端呈现实时资讯和图文内容查看源码 -
(自适应)英文电子芯片电子元件网站pbootcms模板下载基于PbootCMS内核开发的电子元件类企业专用模板,采用响应式设计技术,适配电子元器件、集成电路、半导体等行业的品牌展示与技术文档发布需求。前端布局针对芯片参数表格与产品规格书展示进行深度优化。查看源码 -
(自适应响应式)HTML5简繁双语电子元器件设备制造Pbootcms模板下载本模板为电子科技设备制造、电子元件生产等高科技企业设计,采用PbootCMS内核开发,具备简繁双语切换功能。模板设计充分考虑了电子科技行业的技术展示需求,能够专业呈现各类电子元器件、电路板、智能设备的参数规格和应用方案。查看源码 -
(自适应)APP应用软件落地页单页推广页网站模板下载基于PbootCMS内核开发的响应式单页模板,为企业产品展示、服务推广等应用场景设计。通过简洁直观的视觉布局与高效的技术架构,帮助用户快速构建专业级落地页面,实现移动端与PC端数据实时同步展示。查看源码 -
(自适应)科技产品设备技术作品pbootcms网站模板带下载和招聘基于PbootCMS内核开发的高端科技企业模板,采用响应式布局技术,适配各类移动终端设备。模板设计聚焦科技行业特性,通过模块化结构实现企业形象展示、技术成果发布与人才招募等核心需求查看源码 -
(自适应)品牌策划网络设计作品公司个人pbootcms网站源码下载本款基于PbootCMS开发的网站模板专为品牌策划、设计公司打造,特别适合展示创意作品、设计案例和企业服务。模板采用现代化设计风格查看源码
| 分享笔记 (共有 篇笔记) |
