七麦数据的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}”,这样就很容易定位到算法函数。