[todo][已解决]请教Python模拟登录网站,cookie处理问题
本帖最后由 bxfqing 于 2014-09-08 21:33 编辑2014-07-30-PM:
花费了2周时间,第一个python终于完成了,虽然还有很多不理解的地方,但是在这个过程中,还是学习了一些web开发的基础知识
INFO >>> Reply successfully!
Current reply/当前次数,Loop replies number/本次循环次数,Totaldone/总计已完成,Limit/回帖总数限制
开始睡眠,s
INFO >>> lasted reply: , user id:
INFO >>> Sleep sec for skip reply continual limit,睡眠秒,等待连续回复限制
Current reply/当前次数,Loop replies number/本次循环次数,Totaldone/总计已完成,Limit/回帖总数限制
开始睡眠,s
2014-07-28-PM:
功能终于调试通了,开始代码重构
<?xml version="1.0" encoding="utf-8"?>
<root><!', {'fid':'29','tid':'8164648','pid':'124095702','from':'','sechash':''});}</script>]]></root>
更换了流程,以前的写法,导致cookie始终无法在bbs域生效:
Method 2:
1. GEThttp://passport.feng.com/?r=user/login&sso=%E5%A8%81%E9%94%8B%E8%AE%BA%E5%9D%9B&sso=2&sso=bc1ce0c20dad09f5855266d8a0530010
2. POST http://passport.feng.com/?r=user/loginProcess
3. GEThttp://bbs.feng.com/api/uc.php?time=1406430109&code=
4. GEThttp://passport.feng.com/?r=user/profile
5. GEThttp://bbs.feng.com/read-htm-tid-8157115.html
==================
当前进度: 2014-07-24-PM:
登陆流程:
1. http://passport.feng.com/?r=user/login
2. jump to http://passport.feng.com/?r=user/loginProcess
3. jump to http://passport.feng.com/api/uc.php?time=xxx&code=xxxx
4. jump to http://passport.feng.com/?r=user/profile
5. jump to random post to show content ,e.g.http://bbs.feng.com/read-htm-tid-8157115.html
可以从profile读取,但是切换到tid页面,还是提示未登陆
<h1>个人资料</h1>
<table width="700" border="0" cellpadding="0" cellspacing="0" class="line-table fr" style="margin-right:40px; -margin-right:20px">
<tr>
<td width="70">帐户ID</td>
<td> <span style="margin-left:20px">(注册日期:2014-07-22)</span></td>
</tr>
<tr>
<td>UID:</td>
<td>8655459</td>
</tr>
<tr>
<td>E-Mail:</td>
<td>
<div class="pt hm">
您需要登录后才可以回帖 <a href="member.php?mod=logging&action=login" onclick="showWindow('login', this.href)" class="xi2">登录</a> | <a href="member.php?mod=register" class="xi2">注册</a>
</div>
=============原帖=============
我在练习如何使用python登陆Discuz!论坛,以bbs.feng.com作为试验对象
通过网上的教程,了解一些使用python模拟登陆网站的sample
使用firefox+httpfox抓包,然后分析post,header
现在example已经写出来了,但是登陆,保存cookie后,打开页面还是提示我没有登陆
期望是能从 最后一句 print result.read的打印中, 能过滤出登陆信息,而实际上是提示未登陆
<div class="pt hm">
您需要登录后才可以回帖 <a href="member.php?mod=logging&action=login" onclick="showWindow('login', this.href)" class="xi2">登录</a> | <a href="member.php?mod=register" class="xi2">注册</a>
</div>
请问下面的代码,哪里写的有问题啊? 这个代码复制后就可以在本地运行的
登陆流程分析:
1. http://passport.feng.com/?r=user/login
2. jump to http://passport.feng.com/?r=user/loginProcess
3. jump to http://passport.feng.com/api/uc.php?time=xxx&code=xxxx
4. jump to http://passport.feng.com/?r=user/profile
#-*- coding: utf-8 -*-
# !/usr/bin/python
import urllib2
import urllib
import cookielib
import re
import pdb
auth_url = 'http://passport.feng.com/?r=user/loginProcess'
test_url = 'http://bbs.feng.com/read-htm-tid-8150265.html';
# 登陆用户名和密码
data = {
"Kaf_Model_Form_Login":"",
"Kaf_Model_Form_Login":"",
'Kaf_Model_Form_Login':'0'
}
# urllib进行编码
post_data=urllib.urlencode(data)
# 发送头信息
headers = {'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language':'en-US,en;q=0.5',
'Host': 'bbs.feng.com',
'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0'
}
# 初始化一个CookieJar来处理Cookie
cookieJar=cookielib.CookieJar()
# 实例化一个全局opener
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cookieJar))
# 获取cookie
req=urllib2.Request(auth_url,post_data,headers)
result = opener.open(req)
#pdb.set_trace()
# 访问测试页面 自动带着cookie信息
result = opener.open(test_url)
# 显示结果
print result.read()
本帖最后由 cdhigh 于 2014-12-26 07:03 编辑
没去分析网页,不过感觉上
data = {
"Kaf_Model_Form_Login":"xxxx",
"Kaf_Model_Form_Login":"xxxx",
'Kaf_Model_Form_Login':'0'
}
应该改成:
data = {
"login":"xxxxx",
"password":"xxxx",
'rememberMe':'0'
} 你要先访问一次http://passport.feng.com,获取到cookie
然后再通过http://passport.feng.com/?r=user/loginProcess,POST账号密码
然后再通过访问http://passport.feng.com/?r=user/profile(带cookie),查看html源代码,就会发现登陆成功
PS:建议用urllib2.install_opener(opener) 回复 2# cdhigh
谢谢关注,这个post data 是我抓包得到的,不能改成那样,chinanuix才是类似的格式
formhash=e7a9a2fc&referer=http%3A%2F%2Fbbs.chinaunix.net%2F&username=bxfqing&password=0000000000000xxx&loginsubmit=true&return_type= 回复 2# cdhigh
谢谢分享,我按照你的思路实现一个版本 本帖最后由 bxfqing 于 2014-09-08 21:31 编辑
v0yager 发表于 2014-07-22 20:54 static/image/common/back.gif
你要先访问一次http://passport.feng.com,获取到cookie
然后再通过http://passport.feng.com/?r=user/log ...
获取cookie是在GET uc.php中的,但是我获取cookie时,提示
‘Authracation has expiried’
下面是我新实现的代码和login过程抓包
登陆流程分析:
1. http://passport.feng.com/?r=user/login
2. jump to http://passport.feng.com/?r=user/loginProcess
3. jump to http://passport.feng.com/api/uc.php?time=xxx&code=xxxx
class LoginWeiphone:
email = ''
password = ''
cookie = None
friendlist = []
type = sys.getfilesystemencoding()
def __init__(self, email, passwd):
self.userName = email
self.password = passwd
#cookie
self.cookie = cookielib.LWPCookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookie))
urllib2.install_opener(opener)
#self.cookie.save()
#pdb.set_trace()
def login(self):
postdata = {
'Kaf_Model_Form_Login':self.userName,
'Kaf_Model_Form_Login':self.password,
'Kaf_Model_Form_Login':'0'
}
headers = {'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language':'en-US,en;q=0.5',
'Host': 'bbs.feng.com',
'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0'
}
postdata = urllib.urlencode(postdata)
#Login
# http://passport.feng.com/?r=user/login
req = urllib2.Request('http://passport.feng.com/?r=user/loginProcess',postdata)
result = urllib2.urlopen(req).read()
#self.cookie.save()
#pdb.set_trace()
#print result.decode("UTF-8").encode(self.type)
#cookie
result = str(result)
#p_src=r'(http://passport\.feng\.com/api/uc\.php\?time=\d+&code=\S+)'
#p_src=(r'(?<=src=")http://passport\.feng\.com/api/ui\.php\?time=\d+&code=.+(?=" )')
p_src=(r'(?<=src=")http://passport.+(?=" )')
print p_src
src=re.findall(p_src,result)
print src
req1 = urllib2.Request(src,None,headers)
result1 = urllib2.urlopen(req1).read()
#self.cookie.save()
#pdb.set_trace()
print result1.decode("UTF-8").encode(self.type)
if '''align="absmiddle"''' in result:
print u"Login Successfully."
else:
print u"ERROR: Login Failed."
print result
exit(1)
if __name__ == '__main__':
user = LoginWeiphone("1111","2222") #账号密码
print '=================='
user.login()
bxfqing 发表于 2014-07-24 17:10 static/image/common/back.gif
获取cookie是在GET uc.php中的,但是我获取cookie时,提示
‘Authracation has expiried’
下面是我新 ...
我刚才用你的账号密码试了下,登陆是可以的,我把http://passport.feng.com/?r=user/profile的html源代码输出了,如下图,有你的邮箱:
建议你还是抓包分析下登陆的步骤,记得把浏览器cookie清空一下再跑程序。:wink: v0yager 发表于 2014-07-24 21:06 static/image/common/back.gif
我刚才用你的账号密码试了下,登陆是可以的,我把http://passport.feng.com/?r=user/profile的html源代码 ...
谢谢,参考你3楼的建议,我已经成功获取到user profile页面的信息了,原因是:伪造的headers字段,手残,打错了一个字母;
当前进度:
开始调查为什么passport.feng.com的登陆信息,无法在bbs.feng.com生效
如何保持cookie在跨网页登陆呐?
BTW: google上搜索结果,都可以登陆passport.feng.com后,直接登陆bbs.feng.com,我不知道为什么?
@cdhigh
hi,兄弟,请把我的用户名和密码删掉,谢了!
页:
[1]