bxfqing 发表于 2014-07-22 13:19

[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&amp;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&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
#-*- 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-07-22 17:48

本帖最后由 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'
}

v0yager 发表于 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)

bxfqing 发表于 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=

bxfqing 发表于 2014-07-22 22:47

回复 2# cdhigh


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

bxfqing 发表于 2014-07-24 17:10

本帖最后由 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()

v0yager 发表于 2014-07-24 21:06

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:

bxfqing 发表于 2014-07-26 10:22

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,我不知道为什么?

bxfqing 发表于 2014-09-08 21:32

@cdhigh
hi,兄弟,请把我的用户名和密码删掉,谢了!
页: [1]
查看完整版本: [todo][已解决]请教Python模拟登录网站,cookie处理问题