用Python模拟登陆微博

前言

最近在研究模拟登陆,看了很多教程,发现基本上都是只教怎么处理后就能登陆成功,没有讲解怎样得到处理的方法。经过的一天的研究,把微博模拟登陆基本上弄清楚了,下面就把过程详细说明。


工具和环境

1.语言:Python3
2.IDE: Pycharm
3.浏览器:Chrome
4.使用的库:re, rsa, base64, requests, PIL, urllib


模拟登陆过程

弄清楚所需的数据

首先我们在Chrome浏览器中打开微博登陆界面,然后Ctrl+shift+i开启开发者工具,在开发者工具的Network选项里找到Preserve log并勾选,然后登录你的微博。之后可以看到以下界面:

我们可以看到Network下面这么多文件,到底哪一个是我们需要的呢?由于登陆的时候需要向服务器输送数据所以我们限定搜索范围,去找MethodPOST的这时你会找到login.php?client=ssologin.js(v1.4.18)点击找到它的form data看到下列数据:

其中大部分数据都是固定数据,只有suservertimenoncersakvsp是通过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所以选用第一种加密方式。至于第二种加密方式是否适用大家可以去尝试尝试。
其中10001rsaPubkey为16进制需要通过int(x, 16)转换为十进制。接着经过servertime + '\t' + nonce + '\n' + passwd拼接字符串再进行Rsa加密, 最后转成16进制即得到sp

模拟登录

经过上面的努力我们已经把所需要的数据统统获取,下面只要上传数据到服务器就可以登录了。
注意登陆全程需在requests的session下进行
首先,将登录时所需要的值(就是第二张图里的值)posthttp://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
2
uniqueid = **********
weibo_url = 'http://weibo.com/%s/profile?topnav=1&wvr=6&is_all=1' % uniqueid


后记

本教程仅用于学习交流
方法已经写出来了,大家多去自己尝试一下。如果实在写不出来可以到我的GitHub参考我写好的代码。
代码地址:https://github.com/Wooden-Robot/pop

给我加个菜?