如何采集有签名机制的App或网站的数据

签名机制是现在App和网站反采集常见的手段,我们先来看一下什么是签名机制。

我们以永辉生活微信小程序为例(我们曾做过一个采集永辉超市超级物种所有店铺商品的项目),当我们抓包分析时会发现其所有的HTTPS请求中都有一个sign参数(如下图所示)。

如何采集有签名机制的App或网站的数据
如果我们尝试修改其它参数,构造一个自己的请求,会发现无法得到有效的数据(如下图所示)。

如何采集有签名机制的App或网站的数据
APP服务端是如何知道我们篡改了这个请求呢?

实际上这个sign参数是一个校验值,它是根据HTTP请求中其它参数计算出来的,算法是App开发者自己定义的。App服务端接收到HTTP请求后会根据特定算法计算出该请求的校验值,如果与提交的校验值sign参数不一致,那么就认为这是一个无效的请求。

对于我们来说这个校验算法是未知的,所以我们无法构造出有效的HTTP请求。这样就算我们抓包分析出了数据接口,也是“无能为力”,这样就达到的反采集的目的。

不光是App,一些Web网站也在使用签名机制来反采集,比如京东到家(https://daojia.jd.com/html/index.html,我们曾采集过京东到家全国店铺的数据)这个网站,所有的Ajax请求都有一个signKey参数,如下图所示。
如何采集有签名机制的App或网站的数据
再比如京东掌柜宝(http://zgb.m.jd.com/category.html ,我们曾采集过京东掌柜宝全品类的数据),所有的Ajax请求都有一个sign参数,如下图所示。
如何采集有签名机制的App或网站的数据
那么如何采集这类有签名机制的App或者网站呢?

鲲之鹏的技术人员结合自己的项目经历,总结出如下两个思路:

  1. 找到校验算法。

    一旦我们知道了校验算法,就能根据需要修改请求中的各项参数(例如 关键词、经纬度、翻页),构造出有效的请求。只要App或者网站没有改版(校验算法没变),就能一直对其进行采集。

    对于安卓APP,我们可以反编译APK文件,通过阅读Java源码找到算法。对于网站来说,我们可以通过阅读其JS代码掌握算法。

    不过难度往往都会很大,因为APK通常会将算法隐藏在.so二进制库内,网站也将JS进行混淆处理。所以,这个思路实现成本往往较高。

  2. 模拟操作App或网站。

    让其自动发出有效的请求,然后通过自动化抓包模块(比如 mitmproxy)拦截HTTP(S)请求,再从应答数据中解析出感兴趣的数据。

    有的校验算法是和参数没有关系的,只是校验值有有效期。一个典型的例子就是蔚蓝地图这个App(我们曾采集过蔚蓝地图的企业监管记录文书),它的每个数据请求中都有一个叫做miyao的参数(如下图所示),其有效期约为10分钟。如何采集有签名机制的App或网站的数据
    也就是说我们拿到一个miyao值可以在10分钟之内构造出有效的请求(其它参数都可以修改),10分钟之后就需要再获取一个新的校验值。对于这种情况我们可以通过模拟操作App让其不断产生新的miyao值,再通过自动化抓包模块获取并交由采集程序使用。

    对于模拟App操作,我们可以使用AndroidViewClient或者直接调用adb命令。对于模拟网站(浏览器)操作,我们可以使用Selenium、Slimerjs或者Chrome DevTools Protocol。这些技术在我们之前的文章里都曾做过介绍,这里不再赘述。

    这个思路实现成本相对较低。