七麦数据请求参数analisys的算法
2024-03-17 17:33:41

七麦数据的APP数据是通过 xhr 动态请求的。为了反爬虫,url 中有一个名为analisys的参数,
分析过程可以参考这篇文章(【python专场】20220806 qimai爬虫请求参数加密analisys解析以及代理使用)。
原文中的算法已经失效,不过还好新的算法改动不大。
我分析了一下后用 js 写出了解密方法(2022年12月2日测试有效),这样看会比较清晰,其实并不复杂,只是官方的 js 都经过混淆了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function setAnalysis(fullUrl) {
const secret = 'xyz517cda96abcd';
const diffTime = (new Date()).getTime() - 1661224081041;

const url = new URL(fullUrl);

// 查询参数转字符串
const params = Object.fromEntries(url.searchParams.entries());
let query = [];
for (const key in params) {
if (key == 'analysis')
continue;
query.push(params[key]);
}
query = decodeURIComponent(query.sort().join(''));

const temp = `${btoa(query)}@#${url.pathname}@#${diffTime}@#3`;
let arr = new Uint8Array(temp.length);
for (const k in temp) {
const i = parseInt(k);
arr[k] = temp.charCodeAt(i) ^ (secret.charCodeAt((i + 10) % secret.length));
}
const analysis = btoa(String.fromCharCode.apply(null, arr));
console.debug(`analysis: ${temp} > ${analysis}`);

url.searchParams.set('analysis', analysis);
return url.href;
}

使用方式:输入一个完整URL,得到可访问的URL

1
2
let url = 'https://api.qimai.cn/andapp/detail?appid=1&market=1';
console.log(setAnalysis(url));

定位算法

算法有个固定的时间戳1661224081041,通过它可以定位到算法函数。官方analisys的计算过程如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
try {
var n;
f || F != s || (n = (0,
i[Wt])(m),
s = c[x][k][Pt] = -(0,
i[Wt])(l) || +new z[W] - a2 * n);
var e, r = +new z[W] - (s || H) - 1661224081041,
a = [];
return void 0 === t[Zt] && (t[Zt] = {}),
z[Z][i7](t[Zt])[M](function(n) {
if (n == p)
return !B;
t[Zt][N2](n) && a[b](t[Zt][n])
}),
a = a[Ot]()[I1](_),
a = (0,
i[jt])(a),
a = (a += v + t[Jt][T](t[Mt], _)) + (v + r) + (v + 3),
e = (0,
i[jt])((0,
i[qt])(a, d)),
-B == t[Jt][j](p) && (t[Jt] += (-B != t[Jt][j](Rn) ? Hn : Rn) + p + B1 + z[V1](e)),
t
} catch (t) {}

其中1661224081041就是时间戳,表示的是北京时间2022-08-23 11:08:01

如果以后变更算法仍然采用减去时间戳的方式,则可以在浏览器的调试器中按正则搜索”- [0-9]{13}”,这样就很容易定位到算法函数。