登录后才能获取数据也是现在反爬的一个重点,所以计划接下来的几期内容都是关于登录各大站点。由于js代码过长,所以只截取了部分,完整代码移步从今天开始种树,直接拷贝运行即可。
啰嗦两句
各大网站登录提交数据的方式不太 一样,有些只需要POST
明文的账号密码、有些网站POST
的密码是经过加密的(RSA、BASE64、AES、SHA1
等等),还有些网站增加了一些其它的参数,而这些网站的统一特点就是均可以从JS文件
中提取加密代码复现出来,获得这些代码则完全依靠数据提取师父们个人的调试能力了,下面就尝试去登录两个不同的网站-豆瓣与Steam
。
明文提交
明文提交最典型的就是豆瓣,输入错误密码按F12
然后点击登录发现,提交的url为https://accounts.douban.com/j/mobile/login/basic
,提交的数据只有username和password
,还有其它两个空的参数:
这种登录方式属于Baby级的,甚至于都不需要写一个登录类或者函数,不过有点需要注意的是你需要带着cookie去post账号密码,如果你代码中直接POST
到这个url是不会成功的,除非你在请求头中添加了cookies
,还有一种办法就是先用requests.Session
, session方式请求豆瓣的网址,下一次请求就会自动带上cookie,代码如下:
import requests
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.113 Safari/537.36",
}
url = "https://www.douban.com/"
session = requests.Session()
session.get(url,headers=headers, verify=False)
login_url = "https://accounts.douban.com/j/mobile/login/basic"
login_data = {
"ck": "",
"name": "nide",
"password": "nide",
"remember": "false",
"ticket": "",
}
resp = session.post(login_url, data=login_data, headers=headers, verify=False)
print(resp.text)
登录成功:
加密登录
前言
Steam作为全球最大的一个男性购物平台,每天都有可能捡漏到一些折扣较低的游戏。假设你有代码在监控平台上的游戏折扣,在购买时当然需要先登录,要实现自动化的过程,首先就得让你的账号自动登录,接下来就看看如何实现Steam登录(如需监控游戏商城需自行发挥,本文不涉及相关内容)。
分析
关于如何打开Steam登录网页之类的就不废话了,直入正题,Steam登录url为https://store.steampowered.com/login/?redir=&redir_ssl=1
,请求这个url就会到账号密码输入环节,老方法按F12
,先看看输入错误账号密码时候返回的内容,比如我输入的是账号为test
,密码为123456
:
点击登录,查看网络请求发现有两个,getrsakey
和dologin
:
首先看一下getrsakey/
请求,通过上图可以看到请求url为https://store.steampowered.com/login/getrsakey/
,方法为POST
,提交的参数如下:
donotcache
看着像是时间戳,username
就不用说了,点击Preview
看看返回了什么内容:
返回了一些参数,但是现在还不知道这些有何用处,接着查看dologin/
:
提交的路径为https://store.steampowered.com/login/dologin/
,POST
的参数为:
基本可以断定donotcache
是时间戳了,而password
则经过了各种加密,关于rsatimestamp
如果观察仔细的话可以看到其值与getrsakey/
返回的timestamp
的值是一样的,其它几个参数基本可以忽略了:
Form Data参数 | 是否变化 |
---|---|
donotcache | 约等于固定 |
password | 经过加密 |
username | 约等于固定 |
twofactorcode | 可为空 |
emailauth | 可为空 |
loginfriendlyname | 可为空 |
captchagid | 验证码标志,约等于固定 |
captcha_text | 无验证码情况可为空,约等于固定 |
emailsteamid | 固定(可为空) |
rsatimestamp | 变化,getrsakey/ 返回中获取 |
remember_login | 固定 |
经过分析,现在需要获取的值就只有经过加密的password
,那就去Sources
里搜索一下看看有没有包含passwor
的js文件,查找结果如下:
有几个js文件都包含了password
变量,但是结果观察发现login.js
文件中包含了很多password
,甚至都能看到RSA.encrypt
的字样,那基本就确定了我们想要的加密过程就在这个文件里,那就打开这个文件看看吧:
上面红框里的内容已经很明了了,加密的函数在RSA.encrypt
里,这个函数有两个参数:password
和pubkey
,pubkey
是通过RSA.getPublickey
函数得到的,这个函数也有两个参数:result.publickey_mod
和result.publickey_exp
,看着似曾相识,其实倒回去到https://store.steampowered.com/login/getrsakey/
链接返回的地方可以看到有两个同名的参数返回,这里再贴一次,但是现在还不能确定是不是,还需要再调试:
调试
在387
处打一个断点开始调试: