主页:aHR0cHM6Ly93d3cueGlhb2hvbmdzaHUuY29tL2V4cGxvcmU=
打开某某书主页,打开浏览器开发者工具,随便点击一个主页tab栏,如影视,找到相关接口为:
aHR0cHM6Ly9lZGl0aC54aWFvaG9uZ3NodS5jb20vYXBpL3Nucy93ZWIvdjEvaG9tZWZlZWQ=
根据测试,需逆向请求头中的 X-S 参数,全局搜索 headers["X-S 很容易找到位置,如下, headers["X-s"] = f["X-s"] = window._webmsxyw(p, u), p,u都为明文参数(不同类别下参数可能不同):
查看 window._webmsxyw 方法的来源文件,可以看到是一个自执行函数,复制到新的页面,控制台执行后输出 window._webmsxyw 发现有该方法,
且执行 window._webmsxyw(p, u) 也是有正确结果的,因此只需复制出代码本地补环境即可。
补环境代码,补环境教程:https://www.bilibili.com/video/BV1aiqJY6Ewd
function setProxy(proxyObjs) {for (let i = 0; i < proxyObjs.length; i++) {const handler = `{get: function(target, property, receiver) {if (property!="Math" && property!="isNaN"){if (target[property] && typeof target[property] !="string" && Object.keys(target[property]).length>3){}else{console.log("方法:", "get ", "对象:", "${proxyObjs[i]}", " 属性:", property, " 属性类型:", typeof property, ", 属性值:", target[property]);}}return target[property];},set: function(target, property, value, receiver) {console.log("方法:", "set ", "对象:", "${proxyObjs[i]}", " 属性:", property, " 属性类型:", typeof property, ", 属性值:", value, ", 属性值类型:", typeof target[property]);return Reflect.set(...arguments);}}`;eval(`try {${proxyObjs[i]};${proxyObjs[i]} = new Proxy(${proxyObjs[i]}, ${handler});} catch (e) {${proxyObjs[i]} = {};${proxyObjs[i]} = new Proxy(${proxyObjs[i]}, ${handler});}`);}
}setProxy(['window', 'document', 'navigator', 'screen', 'localStorage', 'location'])
补出环境后即可本地调用。
对于搜索接口,多个 search_id参数, 全局搜索 searchId,然后调试可知,生成位置如下:
tn.searchId = t || r ? u()(a = "".concat(Xe.value, "@")).call(a, (0,
D.M)()) : rn()
调试可知,走的是 rn(),继续调试得到最终生成函数如下:
function c() {
var e, n = 2147483646;
if (null === (e = window) || void 0 === e || !e.BigInt) {
var t = a()()
, r = Math.ceil(Math.random() * n)
, o = t.toString() + r.toString();
return i()(o, 10).toString(36)
}
var u = BigInt(a()())
, l = BigInt(Math.ceil(Math.random() * n));
return u <<= BigInt(64),
(u += l).toString(36)
}
其中 a() 为 Date.now(), 这样就得到了 search_id 的生成函数。
测试结果通过: