免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 14450 | 回复: 8
打印 上一主题 下一主题

[todo][已解决]请教Python模拟登录网站,cookie处理问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-07-22 13:19 |只看该作者 |倒序浏览
本帖最后由 bxfqing 于 2014-09-08 21:33 编辑

2014-07-30-PM:
花费了2周时间,第一个python终于完成了,虽然还有很多不理解的地方,但是在这个过程中,还是学习了一些web开发的基础知识
INFO >>> Reply successfully!
Current reply/当前次数[8],Loop replies number/本次循环次数[10],Totaldone/总计已完成[22],Limit/回帖总数限制[100]
开始睡眠,[10]s
INFO >>> lasted reply: , user id:
INFO >>> Sleep [80]sec for skip reply continual limit,睡眠[80]秒,等待连续回复限制
Current reply/当前次数[9],Loop replies number/本次循环次数[10],Totaldone/总计已完成[22],Limit/回帖总数限制[100]
开始睡眠,[80]s

2014-07-28-PM:
功能终于调试通了,开始代码重构
<?xml version="1.0" encoding="utf-8"?>
<root><![CDATA[<script type="text/javascript" reload="1">if(typeof succeedhandle_fastpost=='function') {succeedhandle_fastpost('forum.php?mod=redirect&tid=8164648&goto=lastpost#lastpost', '非常感谢,回复发布成功,现在将转入主题页,系统最多需要1分钟才能同步完成,如果不能显示,请稍候……[ 点击这里转入主题列表 ]', {'fid':'29','tid':'8164648','pid':'124095702','from':'','sechash':''});}</script>]]></root>


更换了流程,以前的写法,导致cookie始终无法在bbs域生效:

  1. Method 2:
  2. 1. GET  http://passport.feng.com/?r=user/login&sso[name]=%E5%A8%81%E9%94%8B%E8%AE%BA%E5%9D%9B&sso[apps]=2&sso[verify]=bc1ce0c20dad09f5855266d8a0530010
  3. 2. POST http://passport.feng.com/?r=user/loginProcess
  4. 3. GET  http://bbs.feng.com/api/uc.php?time=1406430109&code=
  5. 4. GET  http://passport.feng.com/?r=user/profile
  6. 5. GET  http://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页面,还是提示未登陆

  1. <h1>个人资料</h1>
  2.   <table width="700" border="0" cellpadding="0" cellspacing="0" class="line-table fr" style="margin-right:40px; -margin-right:20px">
  3.     <tr>
  4.       <td width="70">帐户ID</td>
  5.       <td>     <span style="margin-left:20px">(注册日期:2014-07-22)</span></td>
  6.     </tr>
  7.     <tr>
  8.       <td>UID:</td>
  9.       <td>8655459</td>
  10.     </tr>
  11.     <tr>
  12.       <td>E-Mail:</td>
  13.       <td>
复制代码
  1. <div class="pt hm">
  2. 您需要登录后才可以回帖 <a href="member.php?mod=logging&amp;action=login" onclick="showWindow('login', this.href)" class="xi2">登录</a> | <a href="member.php?mod=register" class="xi2">注册</a>
  3. </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&amp;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

  1. #  -*- coding: utf-8 -*-
  2. # !/usr/bin/python
  3. import urllib2
  4. import urllib
  5. import cookielib
  6. import re
  7. import pdb

  8. auth_url = 'http://passport.feng.com/?r=user/loginProcess'
  9. test_url = 'http://bbs.feng.com/read-htm-tid-8150265.html';
  10. # 登陆用户名和密码
  11. data = {
  12.         "Kaf_Model_Form_Login[login]":"",
  13.          "Kaf_Model_Form_Login[password]":"",
  14.          'Kaf_Model_Form_Login[rememberMe]':'0'
  15. }

  16. # urllib进行编码
  17. post_data=urllib.urlencode(data)
  18. # 发送头信息
  19. headers = {'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  20.              'Accept-Language':'en-US,en;q=0.5',
  21.              'Host': 'bbs.feng.com',
  22.              'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0'
  23. }

  24. # 初始化一个CookieJar来处理Cookie
  25. cookieJar=cookielib.CookieJar()
  26. # 实例化一个全局opener
  27. opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cookieJar))
  28. # 获取cookie
  29. req=urllib2.Request(auth_url,post_data,headers)
  30. result = opener.open(req)
  31. #pdb.set_trace()
  32. # 访问测试页面 自动带着cookie信息
  33. result = opener.open(test_url)
  34. # 显示结果
  35. print result.read()
复制代码

论坛徽章:
0
2 [报告]
发表于 2014-07-22 17:48 |只看该作者
本帖最后由 cdhigh 于 2014-12-26 07:03 编辑

没去分析网页,不过感觉上
data = {
        "Kaf_Model_Form_Login[login]":"xxxx",
         "Kaf_Model_Form_Login[password]":"xxxx",
         'Kaf_Model_Form_Login[rememberMe]':'0'
}
应该改成:
data = {
        "login":"xxxxx",
         "password":"xxxx",
         'rememberMe':'0'
}

论坛徽章:
0
3 [报告]
发表于 2014-07-22 20:54 |只看该作者
你要先访问一次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)

论坛徽章:
0
4 [报告]
发表于 2014-07-22 22:44 |只看该作者
回复 2# cdhigh


    谢谢关注,这个post data 是我抓包得到的,不能改成那样,chinanuix才是类似的格式
formhash=e7a9a2fc&referer=http%3A%2F%2Fbbs.chinaunix.net%2F&username=bxfqing&password=0000000000000xxx&loginsubmit=true&return_type=

论坛徽章:
0
5 [报告]
发表于 2014-07-22 22:47 |只看该作者
回复 2# cdhigh


    谢谢分享,我按照你的思路实现一个版本

论坛徽章:
0
6 [报告]
发表于 2014-07-24 17:10 |只看该作者
本帖最后由 bxfqing 于 2014-09-08 21:31 编辑
v0yager 发表于 2014-07-22 20:54
你要先访问一次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


  1. class LoginWeiphone:

  2.     email = ''
  3.     password = ''
  4.     cookie = None
  5.     friendlist = []
  6.     type = sys.getfilesystemencoding()

  7.     def __init__(self, email, passwd):
  8.         self.userName = email
  9.         self.password = passwd
  10.         #cookie
  11.         self.cookie = cookielib.LWPCookieJar()
  12.         opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookie))
  13.         urllib2.install_opener(opener)
  14.         #self.cookie.save()
  15.         #pdb.set_trace()

  16.     def login(self):
  17.         postdata = {
  18.         'Kaf_Model_Form_Login[login]':self.userName,
  19.          'Kaf_Model_Form_Login[password]':self.password,
  20.          'Kaf_Model_Form_Login[rememberMe]':'0'
  21.         }
  22.         headers = {'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  23.              'Accept-Language':'en-US,en;q=0.5',
  24.              'Host': 'bbs.feng.com',
  25.              'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0'
  26.         }
  27.         postdata = urllib.urlencode(postdata)

  28.         #Login
  29.         # http://passport.feng.com/?r=user/login
  30.         req = urllib2.Request('http://passport.feng.com/?r=user/loginProcess',postdata)
  31.         result = urllib2.urlopen(req).read()
  32.         #self.cookie.save()
  33.         #pdb.set_trace()
  34.         #print result.decode("UTF-8").encode(self.type)

  35.         #cookie
  36.         result = str(result)
  37.         #p_src=r'(http://passport\.feng\.com/api/uc\.php\?time=\d+&code=\S+)'
  38.         #p_src=(r'(?<=src=")http://passport\.feng\.com/api/ui\.php\?time=\d+&code=.+(?=" )')
  39.         p_src=(r'(?<=src=")http://passport.+(?=" )')
  40.         print p_src
  41.         src=re.findall(p_src,result)
  42.         print src
  43.         req1 = urllib2.Request(src[0],None,headers)
  44.         result1 = urllib2.urlopen(req1).read()
  45.         #self.cookie.save()
  46.         #pdb.set_trace()
  47.         print result1.decode("UTF-8").encode(self.type)

  48.         if '''align="absmiddle"''' in result:
  49.             print u"Login Successfully."
  50.         else:
  51.             print u"ERROR: Login Failed."
  52.             print result
  53.             exit(1)
  54. if __name__ == '__main__':

  55.     user = LoginWeiphone("1111","2222") #账号密码
  56.     print '=================='
  57.     user.login()
复制代码

论坛徽章:
0
7 [报告]
发表于 2014-07-24 21:06 |只看该作者
bxfqing 发表于 2014-07-24 17:10
获取cookie是在GET uc.php中的,但是我获取cookie时,提示
‘Authracation has expiried’
下面是我新 ...


我刚才用你的账号密码试了下,登陆是可以的,我把http://passport.feng.com/?r=user/profile的html源代码输出了,如下图,有你的邮箱:


建议你还是抓包分析下登陆的步骤,记得把浏览器cookie清空一下再跑程序。:wink:

论坛徽章:
0
8 [报告]
发表于 2014-07-26 10:22 |只看该作者
v0yager 发表于 2014-07-24 21:06
我刚才用你的账号密码试了下,登陆是可以的,我把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,我不知道为什么?

论坛徽章:
0
9 [报告]
发表于 2014-09-08 21:32 |只看该作者
@cdhigh
hi,兄弟,请把我的用户名和密码删掉,谢了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP