新浪微博模拟登录解析
项目实现整体思路搭建:(WeiboLogin)
(1)通过预登陆POST表单获得加密参数(def prelogin)
(2)构造登录模块POST表单(def get_username def get_password def login_formdata)
(3)获得重定向url成功登录(def login)
一.预登陆模块
在登录页面https://weibo.com/输入账号并单击页面可以在开发者页面获得预登陆链接https://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=MTg1MTg2ODA4NjY%3D&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.19)&_=1563627851188,点击链接可以获得预登陆信息:
sinaSSOController.preloginCallBack({
"retcode":0,
"servertime":1563627850,
"pcid":"gz-5d8344de1dcf71332cbe56bdb47206f6247d",
"nonce":"B0F1YE",
"pubkey":"EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443",
"rsakv":"1330428213",
"is_openlock":0,
"lm":1,
"smsurl":"https:\/\/login.sina.com.cn\/sso\/msglogin?entry=weibo&mobile=18518680866&s=48d9fe9ed7f02bd510c798677049cd5a",
"showpin":0,
"exectime":13})
从上述表单中,我们只需要提取两个实时变化的加密参数:servertime、nonce
二. 登录模块
在开发者页面上设置preserve log并且完成登录,在过滤url栏输入login,我们可以得到本次模拟登录需要所有的包,如下图:
图一
其中,我们需要着重注意几个包:按照顺序第一个预登陆包、第二个POST登录包、第五个ssologin.js加密包、倒数第二个302重定向包和最后一个重定向响应包。
本节详细分析POST登陆包,重点在于其参数模块,截图如下:
图二
此处的表单数据便是我们本次模拟登陆分析的重点,我们需要明确每次登陆时表单中哪些参数是变化的,分析其变化规则,以便接下来构造模拟登陆的表单数据。
经过多次登陆,我发现其中大部分参数是不变的,变化的参数只有su、servertime、nonce、和sp。其中servertime、nonce我们在预登陆表单中已经获得,唯有su和sp需要我们进一步的去分析。经过相关资料的调研,我怀疑su和sp或许是单词sina username和sina password的首字母缩写,但是可以确定的是su和sp便是我们登录微博时账号和密码的加密形式(下面有验证),因此,接下来我们需要做的便是搞清楚微博是如何对账号和密码进行加密的。
在上述截图中,我们可以发现当需要查询相关字符串时,我们可以去访问ssologin.js数据包,而这个数据包正是我着重强调的按顺序数第五个js加密包,截图如下:
图三
访问其请求网址,我们会得到一个充满代码的页面,我们在其中寻找和解析su和sp的加密规则。
首先,在页面上搜索username,我们可以发现一行语句:
request.su=sinaSSOEncoder.base64.encode(urlencode(username));
因此,su确实是账号的加密形式,并且其加密方式应该是先由url编码,再经过base64编码。
其次,搜索password,我们发现三行语句:
RSAKey.setPublic(me.rsaPubkey,"10001");