前言
最近在研究模拟登陆,看了很多教程,发现基本上都是只教怎么处理后就能登陆成功,没有讲解怎样得到处理的方法。经过的一天的研究,把微博模拟登陆基本上弄清楚了,下面就把过程详细说明。
工具和环境
1.语言:Python3
2.IDE: Pycharm
3.浏览器:Chrome
4.使用的库:re, rsa, base64, requests, PIL, urllib
模拟登陆过程
弄清楚所需的数据
首先我们在Chrome浏览器中打开微博登陆界面,然后Ctrl+shift+i
开启开发者工具,在开发者工具的Network
选项里找到Preserve log
并勾选,然后登录你的微博。之后可以看到以下界面:
我们可以看到Network
下面这么多文件,到底哪一个是我们需要的呢?由于登陆的时候需要向服务器输送数据所以我们限定搜索范围,去找Method
为POST
的这时你会找到login.php?client=ssologin.js(v1.4.18)
点击找到它的form data
看到下列数据:
其中大部分数据都是固定数据,只有su
,servertime
,nonce
,rsakv
,sp
是通过JS加载得到。su
就是账户经过加密而得,sp
是密码经过加密而得。我们只需要找到这几个数据就可以模拟登录到微博,那么怎么找到这些数据呢?接着往下看…
获取servertime,nonce等数据
在登录页面里打开开发者工具,清除Network
里的数据。这个时候输入你的账号并按回车键。你会神奇地发现出现了一条数据,点击选择Preview
看看里面有什么?
是不是有些熟悉的字眼。你要做的就是把这里面的数据用代码爬取下来,但是通过对它Headers
里面的Query String Parametes
进行观察,我们发现爬取这个页面还需要知道su
的值,所以先别急,继续登陆。我们可以再它下面发现一条名叫ssologin.js
的数据,右键选择open link in the new tab
你会发现新打开的窗口下式很多的代码,稍加整理就可以找到对账号和密码加密处理的部分。
账号与密码的加密
账号的加密
这是我找到的账号加密代码,su
是账号首先经过html字符转义再转成base64编码。知道了这点我们就可以通过代码实现对账号的加密获取su
值。
密码的加密
上图为密码加密部分。里面的数据除了rsaPubkey
之外我们都有了,我们可以在找到nonce
值的地方找到一个pubkey
,这个值就是rsaPubkey
。
关于密码的加密代码中显示有两种方式,判断的标准是pwencode
的值。我们登录时一般为rsa2
所以选用第一种加密方式。至于第二种加密方式是否适用大家可以去尝试尝试。
其中10001
和 rsaPubkey
为16进制需要通过int(x, 16)
转换为十进制。接着经过servertime + '\t' + nonce + '\n' + passwd
拼接字符串再进行Rsa加密, 最后转成16进制即得到sp
。
模拟登录
经过上面的努力我们已经把所需要的数据统统获取,下面只要上传数据到服务器就可以登录了。
注意登陆全程需在requests的session下进行
首先,将登录时所需要的值(就是第二张图里的值)post
到http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18)
,你会得到一个页面提取页面里的重定向地址(大概这个样子http://passport.weibo.com/wbsso/login?后面一堆参数省略
),get
这个地址得到这些内容就代表你登录成功啦。
1 | <html><head><script language='javascript'>parent.sinaSSOController.feedBackUrlCallBack({"result":true,"userinfo":{"uniqueid":"1561651905","userid":null,"displayname":null,"userdomain":"?wvr=5&lf=reg"}});</script></head><body></body></html> |
提取你自己的uniqueid值放入下列网址中get
得到你的微博主页信息。
1 | uniqueid = ********** |
后记
本教程仅用于学习交流
方法已经写出来了,大家多去自己尝试一下。如果实在写不出来可以到我的GitHub参考我写好的代码。
代码地址:https://github.com/Wooden-Robot/pop