惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
D
Docker
腾讯CDC
J
Java Code Geeks
大猫的无限游戏
大猫的无限游戏
The Cloudflare Blog
Martin Fowler
Martin Fowler
MongoDB | Blog
MongoDB | Blog
博客园 - Franky
博客园 - 三生石上(FineUI控件)
Recent Announcements
Recent Announcements
F
Fortinet All Blogs
IT之家
IT之家
WordPress大学
WordPress大学
M
MIT News - Artificial intelligence
爱范儿
爱范儿
Microsoft Azure Blog
Microsoft Azure Blog
Vercel News
Vercel News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
小众软件
小众软件
N
Netflix TechBlog - Medium
T
Tailwind CSS Blog
Engineering at Meta
Engineering at Meta
博客园 - 【当耐特】

乌帮图

2021 年 8 月跑步记录:配速很低 | 乌帮图 GitHub 已停止支持 Git 密码验证 | 乌帮图 2021 年 6 月&7 月跑步记录 使用 OpenArk 查找系统全局快捷键 | 乌帮图 2021 年 5 月跑步记录:状态不错 | 乌帮图 腾讯体育直播源调试 | 乌帮图 PP体育直播源调试摘要 | 乌帮图 央视频移动网页版 ckey | 乌帮图 2021 年 4 月跑步记录:重新启航 | 乌帮图
七麦数据 analysis 加密参数 | 乌帮图
作者是 乌帮图。 · 2021-10-07 · via 乌帮图

有个需求是要监控几十个APP每天在各个应用市场中的评分或评论情况,对于苹果 App Store、华为等提供了网页端应用市场的厂商来说,采集比较方便,但其他一些只能在APP端查看且加固过的就很麻烦了。还好已经有现成的工具提供了这些:七麦是一个提供 iOS&Android 应用市场多维度数据的平台,想必其也是通过爬虫采集。

虽然可以注册账号后登陆逐个检索查看所需信息,但还是用自动化来避免重复机械操作。这里以App Store中的微信为例。

七麦analysis加密

观察“检索近一个月评论详情时”的请求过程,发现有个每次请求都会变化的 analysis 加密参数,如下:

请求地址:https://api.qimai.cn/app/comment
请求参数:

analysis: dQ51TyxjAEd/YwBHdR12TylwWRZ9dF9HfXR5TyldfRB5YiBEfXR5V31adVJ5bA8CeDVbAH1kYQB+QgNPdQ5mXgN3SFpSXWJcYglxCQZ8Z1xwEx9RQEAfWwtaVQFaQiETAQEIAAQICVUGDlYEdkIB
appid: 414478124
country: cn
sword: 
commentType: default
star: all
sdate: 2021-09-03 00:00:00
edate: 2021-10-02 23:59:59

sdateedate :数据检索的起止时间
star:评论星级
commentType:评论种类
sword:可以搜索关键平台
country:上架地区
appid:每个APP对应的id
analysis这就是本文要找的 analysis 加密参数了

一眼看到 analysis 的值,有点像经过 base64 编码的,因为多次请求发现它的长度一定会被4整除且有时出现等号,decode 后是些不能直接显示的字符,可能先有过处理。

按以往步骤,先直接搜索 analysis 但找不到有过定义的地方,那就看请求调用的堆栈,在https://static.qimai.cn/static/js/6089.0c2b807f5a6250372f2f.js这个 js 里开始,下断点后往上一步步查看调用,找到生成 analysis 的地方:

r().interceptors.request.use((function(e) {
    try {
        if (!p && null == f) {
            var t = (0, n.ej)(u);
            f = c.default.prototype.difftime = -(0, n.ej)(m) || +new Date - 1e3 * t
        }
        var a, o = +new Date - (f || 0) - 1515125653845,
        r = [];
        return void 0 === e.params && (e.params = {}),
        Object.keys(e.params).forEach((function(t) {
            if (t == h) return ! 1;
            e.params.hasOwnProperty(t) && r.push(e.params[t])
        })),
        r = r.sort().join(""),
        r = (0, n.cv)(r),
        r += d + e.url.replace(e.baseURL, ""),
        r += d + o,
        r += d + 1,
        a = (0, n.cv)((0, n.oZ)(r, l)),
        -1 == e.url.indexOf(h) && (e.url += ( - 1 != e.url.indexOf("?") ? "&": "?") + h + "=" + encodeURIComponent(a)),
        e
    } catch(e) {}
}
//n.cv方法
function h(e) {
    return function(e) {
        try {
            return btoa(e)
        } catch(t) {
            return Buffer.from(e).toString("base64")
        }
    } (encodeURIComponent(e).replace(/%([0-9A-F]{2})/g, (function(e, t) {
        return i("0x" + t)
    })))
}
//n.oZ方法
function g(e, t) {
    t || (t = s());
    for (var a = (e = e.split("")).length, n = t.length, o = "charCodeAt", r = 0; r < a; r++) e[r] = i(e[r][o](0) ^ t[(r + 10) % n][o](0));
    return e.join("")
}
//参数l赋值
var l = (0, n.nF)("qimai|Technology", 1)
//n.nF方法
function v(e, t, a) {
    var n, o, r = void 0 === a ? 2166136261 : a;
    for (n = 0, o = e.length; n < o; n++) r ^= e.charCodeAt(n),
    r += (r << 1) + (r << 4) + (r << 7) + (r << 8) + (r << 24);
    return t ? ("0000000" + (r >>> 0).toString(16)).substr( - 16) : r >>> 0
}

继续下断点,发现每次变化的参数只有几个:

  • 第5行的参数f来自 cookie 中的 syncd 的值,这里可以固定;
  • 第7行的参数 o 来自当前时间戳和 f
  • 第14行 r 将请求参数的数组拼接成字符串;
  • 第15行的 n.cv 方法是 base64,接着继续拼接 do 等参数;
  • 第19行有 n.cvn.oZ 两个方法,n.cv 前面已经说了是 base64,n.oZ则是遍历参数后按位异或后再拼接。传入的参数 rll 通过 n.nF 方法计算后为固定值 00000008d78d46a。
  • 最后的计算出的参数 a 即为analysis。

七麦analysis加密

另外注意:请求需带 cookie,且官方对每个 IP 地址的请求数量有限制,短时间内请求过多则会出现 IP 被限制的提示。

Python代码放在GitHub