简记在Chromium内核浏览器上编辑网络请求
SaKongA Lv1

Before This:

最近在研究UniApp相关的简单开发,由于不太喜欢去看完整且漫长的开发教程,相比之下,喜欢拿例子来举一反三,正好UniApp有自己的DCloud插件市场,提供了众多的还算不错的UniApp页面模板等资源,所以从这里面下载资源的次数还是比较多的的。后面用了一段时间之后,发现部分插件资源需要赞赏/观看广告后,才能下载使用,由于是学习时期,暂时没有太多的预算在这个部分(其实还是我比较穷),所以果断选择广告观看下载,然后就出现了各种报错,导致无法正常观看广告下载,于是就有了绕过观看广告的想法。

1. 熟悉

我们点击下载插件后,会弹出需要观看广告的提示,然后需要进行扫描二维码,等待手机端完成观看后,点击“我已看完并关闭广告”,会开始进行下载。

2. 分析

根据这个流程分析,页面需要知道我们是否看完了广告?这个行为的实现,可以通过WebSocket与服务器建立连接,等待服务器的响应,也可以是通过JS来不断发送HttpRequest到服务器,来获取我们是否完成广告的观看,而我们的一个思路就是劫持服务器返回的响应数据,然后进行分析修改。
这边我们保持在需要进行扫描二维码的页面,按下F12打开开发者工具,切换到网络栏后,发现JS脚本在不停的发送XHR格式的HttpRequest,而Request的名称为“watch-done-plugin-ad”,即广告播放完成,查看其响应如下:

1
2
3
4
{
"ret": 1001, //这是一个状态码,表示发生了错误,通常状态码1000及以上表示请求失败或有错误发生。
"desc": "\u60a8\u5c1a\u672a\u5b8c\u6210\u89c2\u770b\u63d2\u4ef6\u5e7f\u544a\uff0c\u8bf7\u5148\u4f7f\u7528\u624b\u673a\u5fae\u4fe1\u626b\u7801\u6253\u5f00\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u5e76\u89c2\u770b\u5e7f\u544a" // 这个字段是返回的描述信息,使用了Unicode编码,解码后为:“您尚未完成观看插件广告,请先使用手机微信扫码打开微信小程序并观看广告”。
}

一般情况下,ret字段表示请求的状态或结果代码。对于成功的请求,常见的ret值通常是以下两种:

1
2
ret: 0:表示请求成功,没有错误发生。
ret: 200:在某些系统中,也会使用200来表示成功,类似于HTTP状态码的200 OK。

通常,ret值为0或200是最常见的成功标志。

现在我们就来着手修改这个返回的数据,由于Chromium中无法直接修改响应数据,所以我们这边只能通过直接修改JS中的request字段或者通过第三方扩展插件来实现,我这边推荐我正在用的扩展插件:Ajax Interceptor Tools

3. 修改响应值

安装扩展后,在扩展中添加一个新组,新组中默认会添加一个规则,这边我们编辑规则,方法选择POST,后面“matching interface”中填入POST请求中URL的Path部分,如我的请求URL为

1
https://ext.dcloud.net.cn/plugin/watch-done-plugin-ad

那Path部分为/plugin/watch-done-plugin-ad,最后就是修改整个响应部分,我们从浏览器开发工具中复制整个响应部分,然后进行修改。修改示例如下:
image
在这个例子中,主要修改ret结果代码,我们分别尝试0和200,然后重新操作下载,幸运的是,修改为0的时候,就已经可以正常下载了。

Final:

  • 一些反思
    在这个例子中,想要实现免广告下载的途径其实还有很多,比如,在网站中,有一部分资源是不用观看广告的,我们在请求下载时,网站会检测这个资源的下载条件,是观看广告还是需要付费,所以我们其实还可以通过修改这部分来实现我们的目的。总之,这个例子其实还是很简单的,也是想帮助遇到这个问题的朋友,通过这个方法,来临时救急一下。希望DCloud官方及时修复一下吧,DCloud鸡肋的地方还是蛮多的,最简单的例子就是把Android SDK放到垃圾网盘当中,不知道是图什么。。
由 Hexo 驱动 & 主题 Keep
访客数 访问量