爬虫-获取某网站token的过程

前言

最近被隔离在一个不足15个平方的独立空间里面,无聊刷朋友圈看到一个在外省市的学弟询问关于某网站的数据获取,我打开这个网站看了一下,看了一下请求过程,找到数据获取的地址和入参的参数,参数主要包括两部分:时间值、token。用Postman简单调用可以获取数据,返回的数据是json格式,数据也比较全面,跟学弟私聊一下,得知他们想稳定获取数据。但这token是变化的,基本上是一天一变化,因此token的获取肯定要通过程序去解决。

使用Selenium去获取token

首先说明该方案失败了。由于该网站是不需要登录的,我分析了所有的请求过程,没有找到服务端返回token的请求。最终还是抱着试一试的心态,使用selenium去打开了网站,然后获取了一下local storage和session storage的token值,返回的都是None,因此判定该token值是前端生成的。

分析前端压缩混淆的js文件

使用vscode打开app.js文件后,进行格式化处理,然后全文检索“token”,共找到了6处,简单分析后定位了token生成的关键代码段:

var v = s.a.createHash("md5");
v.update("<固定字符串>" + (new Date).format("yyyymmdd"), "utf8");
var y = v.digest("hex") + "@" + Object(m["a"])((new Date).format("yyyymmdd"));
b.interceptors.request.use(function (e) {
	return "undefined" == typeof e.data ? e.data = "token=" + y : e.data = e.data + "&token=" + y, e
}
...
...
o = function (e) {
	var n = c.a.enc.Latin1.parse("<密钥>"),
	t = c.a.enc.Latin1.parse("<iv值>"),
	a = c.a.AES.encrypt(e, n, {
		iv: t,
	  mode: c.a.mode.CBC,
	  adding: c.a.pad.ZeroPadding
	}).toString();
  return encodeURIComponent(a)
},

通过上面的代码段不难得出token主要由两部分组成:以@字符进行拼接,第一部分使用一个固定的字符串+时间,然后计算出的md5值,第二部分是用AES128 CBC PCKS7对时间值进行加密后得到。之后用python编写token生成的工具,实现了基本目标。

备注:为什么是PCKS7?代码里面明明是ZeroPadding,因为按照ZeroPadding进行加密后,得出的值与实际值不一样,最后经过不断尝试AES CBC模式下其他填充模式,得到实际加密模式为:AES128 CBC PCKS7。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值