很多写爬虫的小伙伴在这个参数上犯愁了,像我自己常用的python来说,虽然有selenium去操作浏览器,但是效率和问题都比较多,用接口的方式也方便些,所以出几节关于这个参数的js解密文章,希望帮到小伙伴们
提示:文章仅供学习,请遵纪守法,做一个好市民!
今天来分析下anti-token参数,首先打开拼多多的拼多多优惠券页面,那其他的页面也会有设置anti_content参数header也是可以的==>>拼多多优惠券地址<<==,这里的话可以看到,页面请求当中,给header中添加了anti-token参数并且设置了对应的加密字符串,我们可以在这里作为切入点进行参数的分析
打开浏览的的网络=>点击这里的搜索图标=>输入关键词anti_token
可以看到这里有一个react_coupons的js文件,说明这个文件中可能有给这个请求头中添加了对应的加密字符串。
在知道参数出现文件后,我们就需要去找可能赋值的位置,那么我们也需要进行个断点调试,我们现在需要在来源中把对应的js文件找到,然后格式化以及搜索anti-token被赋值的位置
通过打短点,我们知道这个m.getAntiContent()是一个promise异步函数,且状态为pending的等待状态,所以我们需要跟进函数里面查看详细逻辑调用情况。
在这里开始生成promise异步函数
最终定位在这个代码位置,也就是react_anti的参数
function Vt() {
var t, n = f, r = {};
r[n("0x156", "j6Rk")] = function(t) {
return t()
}
,
r[n("0x11", "iqO&")] = n("0x1e", "anZ%"),
r[n("0x12e", "J)bp")] = function(t) {
return t()
}
,
r[n("0x1", "#hpG")] = function(t, n, r) {
return t(n, r)
}
,
r[n("0x4", "Cu&R")] = function(t, n) {
return t < n
}
,
r[n("0xa", "Dm1H")] = n("0x39", "Dm1H"),
r[n("0x54", "fGLK")] = function(t, n) {
return t === n
}
,
r[n("0x100", "HZS0")] = function(t, n) {
return t > n
}
,
r[n("0xd8", "0Xnq")] = function(t, n) {
return t <= n
}
,
r[n("0x2c", "0Xnq")] = function(t, n) {
return t - n
}
,
r[n("0x92", "z@XA")] = function(t, n) {
return t << n
}
,
r[n("0x75", "5QnQ")] = function(t, n) {
return t > n
}
,
r[n("0x149", "dmn8")] = function(t, n) {
return t - n
}
,
r[n("0xc5", "bpr9")] = function(t, n) {
return t << n
}
,
r[n("0x37", "GmkI")] = n("0x164", "wFxG"),
r[n("0xfb", ")!%7")] = function(t, n) {
return t + n
}
,
r[n("0xe5", ")!%7")] = n("0x76", "Vta9"),
r[n("0x140", "oemU")] = n("0x103", "Iaxw");
var e = r;
if (!rt)
return "";
var o = e[n("0x141", "5^JL")]
, a = (t = [])[A].apply(t, [ct ? [][A](e[n("0x10a", "5QnQ")](Kt), lt[o]()) : d[o](), ht[o](), kt[o](), vt[o](), mt[o](), _t[o](), pt[o](), bt[o](), Ct[o](), gt[o](), St[o]()].concat(function(t) {
if (Array.isArray(t)) {
for (var n = 0, r = Array(t.length); n < t.length; n++)
r[n] = t[n];
return r
}
return Array.from(t)
}(wt[o]()), [yt[o](), Rt[o](), Gt[o](), Pt[o](), qt[o](), Ot[o]()]));
e[n("0x7c", "Dm1H")](setTimeout, (function() {
e[n("0x121", "HZS0")](Dt)
}
), 0);
for (var u = a[I][p](2)[k](""), W = 0; e[n("0x60", "%LaC")](u[I], 16); W += 1)
u[e[n("0x88", "wFxG")]]("0");
u = u[l]("");
var x = [];
e[n("0x111", "#hpG")](a[I], 0) ? x[M](0, 0) : e[n("0x16", "Mju&")](a[I], 0) && e[n("0x11c", "^o[d")](a[I], e[n("0x66", "Hv26")](e[n("0x119", "(odD")](1, 8), 1)) ? x[M](0, a[I]) : e[n("0xc3", "GmkI")](a[I], e[n("0x30", "Iaxw")](e[n("0xed", "DxB8")](1, 8), 1)) && x[M](rt[b](u[R](0, 8), 2), rt[b](u[R](8, 16), 2)),
a = [][A]([3], [1, 0, 0], x, a);
var s = i[e[n("0xcf", "(5GC")]](a)
, h = [][_][n("0x6c", "oemU")](s, (function(t) {
return String[y](t)
}
));
return e[n("0xd3", "[xh1")](e[n("0x85", "5^JL")], c[e[n("0x155", "uYFB")]](e[n("0x10c", "GmkI")](h[l](""), tt[l]("")), c[n("0x91", "ho[k")]))
}
这个Vt()函数的return就是返回了anti-token的参数值,这个Vt函数里面的绿色的字符都是做了混淆,下图的红色剪头其实就是给r这个对象赋值了功能(函数),不用管他
具体的生成逻辑在下图红色方框中
红色方框中才是整体的参数形成重要代码块
[A].apply(t, [ct ? [][A](e[n("0x10a", "5QnQ")](Kt), lt[o]()) : d[o](), ht[o](), kt[o](), vt[o](), mt[o](), _t[o](), pt[o](), bt[o](), Ct[o](), gt[o](), St[o]()
//
wt[o]()), [yt[o](), Rt[o](), Gt[o](), Pt[o](), qt[o](), Ot[o]()])
以上的函数当中其实就是在js文件加载的时候,传入了鼠标点击位置,当前url,当前访问cookie,当前ua等信息,通过生成数组并且合并转换编码得到参数值,下篇文章将会带领大家调试具体的函数生成过程。
在调试以及分析中有问题可以加群互相讨论技术
点击链接加入群聊:脚本&爬虫&web技术讨论