打开某乎,打开浏览器开发者工具,某乎主页随便搜索一个词,如 hello,找到接口如下:
aHR0cHM6Ly93d3cuemhpaHUuY29tL2FwaS92NC9zZWFyY2hfdjM/
该接口为 GET 请求,url 参数未加密,请求头参数有几个未知,如 x-zse-93,x-zse-96,x-zst-81,经测试,请求头必带的参数有 cookie、UA、x-zse-93、x-zse-96、x-zst-81。
一直往下滑翻页查看请求的变化可知,对于同一个关键词的不同翻页请求,仅 x-zse-96 不同,因此先查看此参数生成逻辑,全局搜索未找到有效位置,可以先尝试搜索其他参数,如 x-zse-93 或 x-zst-81,经尝试,找到了 x-zse-81 的生成位置如下:
经调试可知,x-zse-96 就在下方(tC)
可知,x-zse-96 = '2.0_' + tk
tk 就在上方, tk = tT.signature;
进入上方的 ed 方法可以找到 signature 的生成方法:
其中,tp 为如下类型的字符串:
即 x-zse-93 + URI + cookie中的d_c0 + x-zst-81
ty()函数如下:
function(tt, te, tr) {
return te ? tr ? tS(te, tt) : tO(te, tt) : tr ? tC(tt) : tE(tt)
};
经调试,走的是 tE(tt),tE 函数如下:
tE = function(tt) {
return tw(tC(tt))
}
不断循环调用其他函数,最终抠出相关代码并得到 ty()(tp) 的值(扣代码就自己扣吧)
得到里面的参数后,再看外面的函数 tJ(ti).encrypt, 方法如下:
var D = function(tt) {
return __g._encrypt(encodeURIComponent(tt))
};
一步步调试发现,套用了太多层,扣代码较麻烦,观察发现,这是一个 webpack 打包的代码,所以采用扣 webpack 的方式。(扣 webpack 也自己扣吧),扣完后全局导出就好了,如下:
然后运行测试,报错,需要补环境。可以先用一些可以自动生成环境的插件,如 v_jstools
生成的环境经测试可用,接着测试结果。
经测试,发现结果不是固定的,可能与时间或随机数有关,固定时间和随机数后再次测试:
浏览器下:
发现与浏览器环境下结果一致。
这样就得到了 tT.signature 即 tk 的正确值。
x-zse-96 = '2.0_' + tk
将其他参数写死,测试是通过的。