测试开发Python培训:模拟登录新浪微博-技术篇

 

一般一个初学者项目的起点就是登陆功能的自动化,而面临的项目不同实现的技术难度是不一样的,poptest在做测试开发培训中更加关注技术难点,掌握技术实现思路,提高动手能力。这里通过大家都能接触到的系统新浪微博,作为案例。

模拟登录功能比较简单,很多人在学习自动化的时候都会以登陆来作为自己的第一个学习案例,有点像开发语言中第一段代码都是helloworld!一样。登陆简单的模拟登录,直接发post请求就OK,很容易实现。 这里用新浪微博,就是技术实现复杂,涉及到很多细节。难点在于登录新浪微博时,客户端js会对发送的请求,如登陆中的用户名、密码进行加密。

第一步:分析协议内容

可以利用协议工具进行分析,在这里我们可以用火狐浏览器来进行跟踪,输入用户名后,会进行预登录,网址为:http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=ZW5nbGFuZHNldSU0MDE2My5jb20%3D&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.18)&_=1443156845536,通过响应(sinaSSOController.preloginCallBack({"retcode":0,"servertime":1443156842,"pcid":"gz-e88b75a929252baec7c12c741985eaa45627","nonce":"2L4IZ3","pubkey":"EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443","rsakv":"1330428213","showpin":0,"exectime":16})),这里分析会发现获得四个变量,servertime、nonce、pubkey和rsakv.

新浪微博的用户名加密目前采用Base64加密算法,而新浪微博登录密码的加密算法使用RSA2,这是模拟登陆的重点,需要先创建一个rsa公钥,公钥的两个参数新浪微博都给了固定值,第一个参数是登录第一步中的pubkey,第二个参数是js加密文件中的‘10001’. 这两个值需要先从16进制转换成10进制,把10001转成十进制为65537,随后加入servertime和nonce再次加密.

第二步:模拟请求

请求网址:http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18),表单数据如下:

主要提交数据:
  su:base64加密过后的用户名
  servertime/nonce/rsakv之前预登陆获取到了
  sp是加密过户的密码

  username 经过了BASE64 计算: username = base64.encodestring( urllib.quote(username) )[:-1];
      password 经过了三次SHA1 加密, 且其中加入了 servertime 和 nonce 的值来干扰。
      即: 两次SHA1加密后, 将结果加上 servertime 和 nonce 的值, 再SHA1 算一次。

第三步:处理请求响应

提交之后: 将参数组织好, POST请求。 这之后还没有登录成功。,原因是返回的并不是微博个人主页,而是一段重定向的代码:

登录成功后retcode 的值是0 。接下来再请求这个URL,这样就成功登录到微博了。
   记得要提前build 缓存

备注:技术实现:

  cookielib: 用来保存cookies.
  urllib2: 发送请求获取网页数据,与cookielib配合,利用cookie访问.
  json:处理数据交换格式

 代码:

# -*- coding: utf-8 -*- 
######################## 
#author:Andrewseu 
#date:2015/9/23 
#login weibo 
########################

import sys 
import urllib 
import urllib2 
import cookielib 
import base64 
import re 
import json 
import rsa 
import binascii 
#import requests 
#from bs4 import BeautifulSoup

#新浪微博的模拟登陆 
class weiboLogin: 
  def enableCookies(self): 
    #获取一个保存cookies的对象 
    cj = cookielib.CookieJar() 
    #将一个保存cookies对象和一个HTTP的cookie的处理器绑定 
    cookie_support = urllib2.HTTPCookieProcessor(cj) 
    #创建一个opener,设置一个handler用于处理http的url打开 
    opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler) 
    #安装opener,此后调用urlopen()时会使用安装过的opener对象 
    urllib2.install_opener(opener)

  #预登陆获得 servertime, nonce, pubkey, rsakv 
  def getServerData(self): 
    url = 'http://login.sina.com.cn/sso/prelogin.php?      entry=weibo&callback=sinaSSOController.preloginCallBack&su=ZW5nbGFuZHNldSU0MDE2My5jb20%3D&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.18)&_=1442991685270' 
    data = urllib2.urlopen(url).read() 
    p = re.compile('(.∗)') 
    try: 
      json_data = p.search(data).group(1) 
      data = json.loads(json_data) 
      servertime = str(data['servertime']) 
      nonce = data['nonce'] 
      pubkey = data['pubkey'] 
      rsakv = data['rsakv'] 
      return servertime, nonce, pubkey, rsakv 
    except: 
      print 'Get severtime error!' 
      return None

   #获取加密的密码 
   def getP、assword(self, password, servertime, nonce, pubkey): 
      rsaPublickey = int(pubkey, 16) 
      key = rsa.PublicKey(rsaPublickey, 65537) #创建公钥 
      message = str(servertime) + '\t' + str(nonce) + '\n' + str(password) #拼接明文js加密文件中得到 
      passwd = rsa.encrypt(message, key) #加密 
      passwd = binascii.b2a_hex(passwd) #将加密信息转换为16进制。 
      return passwd

   #获取加密的用户名 
   def getUsername(self, username): 
      username_ = urllib.quote(username) 
      username = base64.encodestring(username_)[:-1] 
      return username

   #获取需要提交的表单数据 
   def getFormData(self,userName,password,servertime,nonce,pubkey,rsakv): 
      userName = self.getUsername(userName) 
      psw = self.getPassword(password,servertime,nonce,pubkey)

      form_data = { 
        'entry':'weibo', 
        'gateway':'1', 
        'from':'', 
        'savestate':'7', 
        'useticket':'1', 
        'pagerefer':'http://weibo.com/p/1005052679342531/home?from=page_100505&mod=TAB&pids=plc_main', 
        'vsnf':'1', 
        'su':userName, 
        'service':'miniblog', 
        'servertime':servertime, 
        'nonce':nonce, 
        'pwencode':'rsa2', 
        'rsakv':rsakv, 
        'sp':psw, 
        'sr':'1366*768', 
        'encoding':'UTF-8', 
        'prelt':'115', 
        'url':'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack', 
        'returntype':'META' 
       } 
    formData = urllib.urlencode(form_data) 
    return formData

    #登陆函数 
    def login(self,username,psw): 
      self.enableCookies() 
      url = 'http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18)' 
      servertime,nonce,pubkey,rsakv = self.getServerData() 
      formData = self.getFormData(username,psw,servertime,nonce,pubkey,rsakv) 
      headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0'} 
      req = urllib2.Request( 
      url = url, 
      data = formData, 
      headers = headers 
      ) 
      result = urllib2.urlopen(req) 
      text = result.read() 
      print text 
      #还没完!!!这边有一个重定位网址,包含在脚本中,获取到之后才能真正地登陆 
      p = re.compile('location\.replace[\'"](.∗?)[\'"]') 
      try: 
        login_url = p.search(text).group(1) 
        print login_url 
        #由于之前的绑定,cookies信息会直接写入 
        urllib2.urlopen(login_url) 
        print "Login success!" 
      except: 
        print 'Login error!' 
        return 0

    #访问主页,把主页写入到文件中 
    url = 'http://weibo.com/u/2679342531/home?topnav=1&wvr=6' 
    request = urllib2.Request(url) 
    response = urllib2.urlopen(request) 
    text = response.read() 
    fp_raw = open("e://weibo.html","w+") 
    fp_raw.write(text) 
    fp_raw.close() 
    #print text

wblogin = weiboLogin() 
print '新浪微博模拟登陆:' 
username = raw_input(u'用户名:') 
password = raw_input(u'密码:') 
wblogin.login(username,password)

测试开发Python培训:模拟登录新浪微博-技术篇的更多相关文章

  1. 测试开发Python培训:抓取新浪微博抓取数据-技术篇

    测试开发Python培训:抓取新浪微博抓取数据-技术篇   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的se ...

  2. 测试开发Python培训:自动发布新浪微博-技术篇

    测试开发Python培训:自动发布新浪微博-技术篇   在前面我们教大家如何登陆,大家需要先看自动登陆新浪微博(http://www.cnblogs.com/laoli0201/articles/48 ...

  3. 测试开发Python培训:抓取新浪微博评论提取目标数据-技术篇

    测试开发Python培训:抓取新浪微博评论提取目标数据-技术篇   在前面我分享了几个新浪微博的自动化脚本的实现,下面我们继续实现新的需求,功能需求如下: 1,登陆微博 2,抓取评论页内容3,用正则表 ...

  4. 测试开发Python培训:实现屌丝的图片收藏愿望(小插曲)

    测试开发Python培训:实现屌丝的图片收藏愿望(小插曲) 男学员在学习python的自动化过程中对于爬虫很感兴趣,有些学员就想能收藏一些图片,供自己欣赏.作为讲师只能是满足愿望,帮助大家实现对美的追 ...

  5. 测试开发Python培训:实现屌丝的黄色图片收藏愿望(小插曲)

    男学员在学习python的自动化过程中对于爬虫很感兴趣,有些学员就想能收藏一些情色图片,供自己欣赏.作为讲师只能是满足愿望,帮助大家实现对美的追求,http://wanimal.lofter.com/ ...

  6. 模拟登录新浪微博(Python) - 转

    Update: 如果只是写个小爬虫,访问需要登录的页面,采用填入cookie 的方法吧,简单粗暴有效,详细见:http://www.douban.com/note/264976536/模拟登陆有时需要 ...

  7. 【Python3爬虫】最新的模拟登录新浪微博教程

    一.写在前面 首先呢,由于之前重装系统,又要重新配置环境,然后还有一些别的事,导致我一直没有写爬虫了,不过现在又可以继续写了. 然后我这次说的模拟登录新浪微博呢,不是使用Selenium模拟浏览器操作 ...

  8. 用python实现模拟登录人人网

    用python实现模拟登录人人网 字数4068 阅读1762 评论19 喜欢46 我决定从头说起.懂的人可以快速略过前面理论看最后几张图. web基础知识 从OSI参考模型(从低到高:物理层,数据链路 ...

  9. Java实现模拟登录新浪微博

    毕设题目要使用到新浪微博数据,所以要爬取新浪微博的数据.一般而言,新浪微博的爬虫有两种模式:新浪官方API和模拟登录新浪微博.两种方法的异同点和适用情况就无须赘述了.前辈的文章已经非常多了.写这篇文章 ...

随机推荐

  1. BZOJ 3404: [Usaco2009 Open]Cow Digit Game又见数字游戏(博弈论)

    一开始被题意坑了= =,题目是说这个数字的最大和最小,不是个位的最大和最小= = 不知道怎么做只能递推了,必胜态就是存在能到达必败态的,必败态就是只能到达必胜态的 CODE: #include< ...

  2. 不想当程序员的CEO不是好投资人:小米雷军23年前所写代码曝光

    众所周知,雷军是小米创办人,董事长兼CEO,但是较少人知道,其实雷军是程序员出身,并且在程序员这个行业里一做就是十年.有网友曝光了一段23年前雷军所写的代码,一起来看下. 可以看出这段代码写于1994 ...

  3. NFS安装及配置

    NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布.功能是通过网络让不同的机器.不同的操作系统能够彼此分享个 ...

  4. Mysql删除表格之后,进行恢复

    一:存在在PHPmyAdmin下找到表格导出然后再导入 二:当没有备份时,使用binlog功能进行恢复 先进入到/etc/my.cnf文件中. 在文件中添加一句:log-bin=mysql-bin 然 ...

  5. Cesium原理篇:3D Tiles(1)渲染调度

    Cesium在2016年3月份左右推出3D Tiles数据规范,在glTF基础上提供了LOD能力,定位就是Web环境下海量三维模型数据.虽然目前3D Tiles还是Beta阶段,有不少硬伤,但3D T ...

  6. Debian部署RMI异常:java.rmi.ConnectException: Connection refused to host: 127.0.1.1;

    现象:在windows上部署RMI很顺利,但移到debian上部署后,客户端报异常: java.rmi.ConnectException: Connection refused to host: 12 ...

  7. Dev使用技巧

    1.  dev调试 I.建工程,选择console application II.设置断点(F4),并按F5,(完成输入后,)其它功能如Next line可运作 2.  修改字体大小:Tools-&g ...

  8. 浅析=======Struts2之==========valueStack

    今天刚学习了struts2的valueStack,在这里把自己学到的做个分享,说道valueStack就不得不提OGNL表达式=== struts2工作流程 1.OGNL(Object Graph N ...

  9. [hdu2156]分数矩阵

    Problem Description 我们定义如下矩阵:1/1 1/2 1/31/2 1/1 1/21/3 1/2 1/1矩阵对角线上的元素始终是1/1,对角线两边分数的分母逐个递增.请求出这个矩阵 ...

  10. 【杂】poj2482 Stars in Your Windows 题面的翻译

    原地址:http://poj.org/problem?id=2482 神题,被誉为最浪漫的题目,一位acmer以自己独特的方式写下的殷殷情语 你窗前的星星 纵时光飞逝如梭,也我对你的回忆也永不黯然.从 ...