我们讲了如何配置Charles代理,这一节我们通过模拟微博登录这个例子来看看如何使用Charles分析网站加载流程,顺便把微博模拟登录的Python代码也给实现了。
1. 用Charles记录整个登录过程
首先,我们运行Charles并开始记录。然后打开Chrome浏览器,选择使用Charles代理,打开微博
首页
,出现登录页面(如果之前登录过微博,要先退出登录)。输入用户名和密码进行登录,登录成功后就可以停止Charles的记录。这样我们就用Charles完整记录下了微博的登录过程。见图:
我们把整个登录过程写出一个Python类,它的定义为:
class WeiboLogin:
user_agent = (
'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.11 (KHTML, like Gecko) '
'Chrome/20.0.1132.57 Safari/536.11'
)
def __init__(self, username, password, cookies_tosave='weibo.cookies'):
self.weibo_user = username
self.weibo_password = password
self.cookies_tosave = cookies_tosave
self.session = requests.session()
self.session.headers['User-Agent'] = self.user_agent
接下来我们分析登录过程,并逐一实现这个类的各个方法。
2. 分析登录过程
把Charles的主窗口切换到“Sequence”标签页,
我们可以按加载时间顺序观察Charles记录的微博登录过程,我们发现第一个可疑的请求的Host是:
login.sina.com.cn
点击该条记录,下方出现该条请求的完整内容,它的路径是:
GET /sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=&rsakt=mod&client=ssologin.js(v1.4.19)&_=1542456042531 HTTP/1.1
这个GET请求的参数_=1542456042531看起来是个时间戳,这个在ssologin.js(看后面是如何找到的)定义为preloginTimeStart,可以用int(time.time()*1000)得到。
从prelogin.php这个名字看,它是一个预登陆,即在你输入用户名和密码前,它先从服务器拿点东西过来:
用Python实现这个prelogin:
def prelogin(self):
preloginTimeStart = int(time.time()*1000)
url = ('https://login.sina.com.cn/sso/prelogin.php?&#