Python实现自动登录discuz论坛
2013-11-06 10:49
471 查看
文章来源:http://blogread.cn/it/article.php?id=2170&f=sr
最近被公司的事情搞的很纠结,博客也有段时间没写了,不过最近还是忙里偷闲做了点其他事情,在这里记录下来,和大家分享一下。
需求也比较简单,老婆是做社区运营的,所以需要每天把几个帖子定时的顶上来,手工做很累,所以就想让我用程序实现。
分析一下,其实无非是先用户名和密码登录,获取到cookie后,再带着cookie去访问要顶贴的页面即可,至于剖析页面来获取url就是BeautifulSoup要做的事情了。(论坛是discuz做的,这里只为演示方法)
登录代码实现如下:
def Login(user,pwd):
loginpage = urllib.urlopen('http://bbs.xxx.com/logging.php?action=login').read()
login_soup = BeautifulSoup(loginpage)
formhash_tag = login_soup.find('input',attrs={'name':'formhash'})
formhash = formhash_tag['value']
params = {
"answer":"",
"formhash":formhash,
"loginfield":"username",
"loginsubmit":"",
"password":pwd,
"questionid":"0",
"referer":"index.php",
"username":user,
}
jar = cookielib.CookieJar()
handler = urllib2.HTTPCookieProcessor(jar)
opener = urllib2.build_opener(handler)
urllib2.install_opener(opener)
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent' : user_agent }
req = urllib2.Request(login_url)
req.add_header('User-Agent',user_agent)
enparams = urllib.urlencode(params)
page = urllib2.urlopen(req,enparams)
data = page.read()
global g_cookie
global g_formhash
g_cookie = page.info()['set-cookie']
t_cookie = re.sub(r'poK_formhash=deleted','',g_cookie)
r_formhash = re.search(r"poK_formhash=[^;]+",t_cookie)
if r_formhash:
g_formhash = re.sub(r'poK_formhash=','',r_formhash.group())
return
简单说明一下:
jar = cookielib.CookieJar()
handler = urllib2.HTTPCookieProcessor(jar)
opener = urllib2.build_opener(handler)
urllib2.install_opener(opener)
这段代码是为了能够页面返回时的cookie,并且在urllib2请求页面的时候能够自动带上cookie,而formhash是个比较诡异的东 西,在登录页面设置的formhash和cookie返回的poK_formhash居然不是同一个值(后来发现,在回复页面,又是另一个值),经过测 试,用cookie里的值是对的。
登录态获取到之后,剩下的就是直接去打开页面就行了,但是因为我需要去回复帖子,所以还是显得麻烦点:
def ReplyPost(url,params):
req = urllib2.Request(url)
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
req.add_header('User-Agent',user_agent)
enparams = urllib.urlencode(params)
page = urllib2.urlopen(req,enparams)
这样就可以了,由于对老婆公司的保密,所以代码就不放出下载了,大家了解了原理自己去写应该不难。
------------------------我是华丽的分割线----------------------------
其实在写的过程中是遇到不少问题的,列在这里如下:
1.CookieJar的实例似乎没有办法获取每个key的值,也许是我愚钝,但是看了源码都不知道怎么用,大家有知道的恳请赐教。。于是用了
g_cookie = page.info()['set-cookie']
这种方式,但是更诡异的事情是,当我这样获取cookie时,居然返回了两段。。所以在代码里我删掉了为空的那个
2.当配置上代理的时候CookieJar是获取不到cookie的。
由于一开始是在公司写的,而伟大的公司完美继承了gfw的意志,搞了个代理,于是用之前博客里提到的方法:
proxy = 'proxy.xxx.com:8080'
opener = urllib2.build_opener( urllib2.ProxyHandler({'http':proxy}) )
urllib2.install_opener( opener )
然后jar就一直为空,让我一度怀疑自己的智商是不是有问题,这么简单的程序都要调试半天。
3.如果实在是CookieJar获取不到cookie,我们其实还是有别的办法的,那就是手动去设置http请求包头:
cookie = page.info()['set-cookie']
req = urllib2.Request("xxxxx.php")
req.add_header('Cookie',cookie)
要记得是使用登录页面返回的cookie,否则是无效的。(其实这种方法满足的另一个需求是,你可以直接在浏览器中抓包得到cookie来进行程序自动访问)
原文地址:点击打开链接
最近被公司的事情搞的很纠结,博客也有段时间没写了,不过最近还是忙里偷闲做了点其他事情,在这里记录下来,和大家分享一下。
需求也比较简单,老婆是做社区运营的,所以需要每天把几个帖子定时的顶上来,手工做很累,所以就想让我用程序实现。
分析一下,其实无非是先用户名和密码登录,获取到cookie后,再带着cookie去访问要顶贴的页面即可,至于剖析页面来获取url就是BeautifulSoup要做的事情了。(论坛是discuz做的,这里只为演示方法)
登录代码实现如下:
def Login(user,pwd):
loginpage = urllib.urlopen('http://bbs.xxx.com/logging.php?action=login').read()
login_soup = BeautifulSoup(loginpage)
formhash_tag = login_soup.find('input',attrs={'name':'formhash'})
formhash = formhash_tag['value']
params = {
"answer":"",
"formhash":formhash,
"loginfield":"username",
"loginsubmit":"",
"password":pwd,
"questionid":"0",
"referer":"index.php",
"username":user,
}
jar = cookielib.CookieJar()
handler = urllib2.HTTPCookieProcessor(jar)
opener = urllib2.build_opener(handler)
urllib2.install_opener(opener)
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent' : user_agent }
req = urllib2.Request(login_url)
req.add_header('User-Agent',user_agent)
enparams = urllib.urlencode(params)
page = urllib2.urlopen(req,enparams)
data = page.read()
global g_cookie
global g_formhash
g_cookie = page.info()['set-cookie']
t_cookie = re.sub(r'poK_formhash=deleted','',g_cookie)
r_formhash = re.search(r"poK_formhash=[^;]+",t_cookie)
if r_formhash:
g_formhash = re.sub(r'poK_formhash=','',r_formhash.group())
return
简单说明一下:
jar = cookielib.CookieJar()
handler = urllib2.HTTPCookieProcessor(jar)
opener = urllib2.build_opener(handler)
urllib2.install_opener(opener)
这段代码是为了能够页面返回时的cookie,并且在urllib2请求页面的时候能够自动带上cookie,而formhash是个比较诡异的东 西,在登录页面设置的formhash和cookie返回的poK_formhash居然不是同一个值(后来发现,在回复页面,又是另一个值),经过测 试,用cookie里的值是对的。
登录态获取到之后,剩下的就是直接去打开页面就行了,但是因为我需要去回复帖子,所以还是显得麻烦点:
def ReplyPost(url,params):
req = urllib2.Request(url)
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
req.add_header('User-Agent',user_agent)
enparams = urllib.urlencode(params)
page = urllib2.urlopen(req,enparams)
这样就可以了,由于对老婆公司的保密,所以代码就不放出下载了,大家了解了原理自己去写应该不难。
------------------------我是华丽的分割线----------------------------
其实在写的过程中是遇到不少问题的,列在这里如下:
1.CookieJar的实例似乎没有办法获取每个key的值,也许是我愚钝,但是看了源码都不知道怎么用,大家有知道的恳请赐教。。于是用了
g_cookie = page.info()['set-cookie']
这种方式,但是更诡异的事情是,当我这样获取cookie时,居然返回了两段。。所以在代码里我删掉了为空的那个
2.当配置上代理的时候CookieJar是获取不到cookie的。
由于一开始是在公司写的,而伟大的公司完美继承了gfw的意志,搞了个代理,于是用之前博客里提到的方法:
proxy = 'proxy.xxx.com:8080'
opener = urllib2.build_opener( urllib2.ProxyHandler({'http':proxy}) )
urllib2.install_opener( opener )
然后jar就一直为空,让我一度怀疑自己的智商是不是有问题,这么简单的程序都要调试半天。
3.如果实在是CookieJar获取不到cookie,我们其实还是有别的办法的,那就是手动去设置http请求包头:
cookie = page.info()['set-cookie']
req = urllib2.Request("xxxxx.php")
req.add_header('Cookie',cookie)
要记得是使用登录页面返回的cookie,否则是无效的。(其实这种方法满足的另一个需求是,你可以直接在浏览器中抓包得到cookie来进行程序自动访问)
原文地址:点击打开链接
相关文章推荐
- PYTHON实现DISCUZ论坛的自动POST登录发贴回帖
- 黄聪:Python实现Discuz论坛的自动POST登录发贴回帖(转)
- 黄聪:Python实现Discuz论坛的自动POST登录发贴回帖(转)
- PYTHON实现DISCUZ论坛的自动POST登录发贴回帖
- python 实现华安信达论坛自动登录
- python自动登录12306并自动点击验证码完成登录的实现源代码
- python 尝试hack SYSUWLAN以实现自动登录
- python实现人人网的自动登录
- java整合discuz小结(实现与论坛同步登录等操作)
- 用python3.x实现北京工业大学的校园网自动登录之bjut_wifi登录
- python实现自动登录
- selenium2+python_用cookie实现自动登录(百度首页为例)
- Python+Selenium实现新浪微博自动登录
- Python使用selenium实现网页用户名 密码 验证码自动登录功能
- python+selenium实现登录账户后自动点击
- java和Discuz论坛实现单点登录,通过Ucenter(用户管理中心)
- python3模拟百度登录并实现百度贴吧签到示例分享(百度贴吧自动签到)
- python+selenium实现京东自动登录及秒杀功能
- python实现校园网自动登录
- 使用python实现baidu hi自动登录的代码