一般一个初学者项目的起点就是登陆功能的自动化,而面临的项目不同实现的技术难度是不一样的,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