鱼C论坛

 找回密码
 立即注册
查看: 4552|回复: 13

[作品展示] python实现自动登录discuz论坛

[复制链接]
发表于 2013-7-17 14:25:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

最近被公司的事情搞的很纠结,博客也有段时间没写了,不过最近还是忙里偷闲做了点其他事情,在这里记录下来,和大家分享一下。

需求也比较简单,老婆是做社区运营的,所以需要每天把几个帖子定时的顶上来,手工做很累,所以就想让我用程序实现。

分析一下,其实无非是先用户名和密码登录,获取到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来进行程序自动访问)

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-9 20:25:07 | 显示全部楼层
我看不懂,还是支持一下我们的黑夜!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-4 15:15:27 | 显示全部楼层
http://bbs.fishc.com/static/image/smiley/default/shocked.gif
我看不懂,还是支持一下我们的黑夜!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-4 17:59:19 | 显示全部楼层
太深奥。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-14 23:14:39 | 显示全部楼层
额,现在还是有回复验证码吧?永远滴痛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-19 11:29:12 | 显示全部楼层
先存着,希望不久就能看懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-11 07:10:54 | 显示全部楼层
谢谢楼主分享!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-11 08:39:26 | 显示全部楼层
顶楼主,感谢分享~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-14 13:34:21 | 显示全部楼层
谢谢楼主分享。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-16 20:23:40 | 显示全部楼层
非常有用!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-16 22:41:47 | 显示全部楼层
没看懂,慢慢学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-26 16:45:25 | 显示全部楼层
我来看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-12 14:28:58 | 显示全部楼层
没看懂,慢慢学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-14 17:37:59 | 显示全部楼层
lz,params里面的值是哪儿来的呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 14:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表