AdBlock Script for WebView

Parse ABP Cosmetic rules to CSS and apply it.

目前為 2022-10-16 提交的版本,檢視 最新版本

作者
Lemon399
評價
0 0 0
版本
2.3.0
建立日期
2022-10-01
更新日期
2022-10-16
尺寸
22.6 KB
授權條款
GPL-3.0
腳本執行於
所有網站

将 ABP 中的元素隐藏规则转换为 CSS 使用, 配合 AdGuard 的解析库
用于增强 Android 系统上套壳 (WebView) 浏览器的广告拦截能力 。

这个脚本用 TypeScript 编写,源代码见 这里

适用用户

这个脚本的用户面非常窄 ... 因为:

  1. 电脑的浏览器通常可以安装 广告拦截 插件,用不到它。:)
  2. Safari 也可以安装插件,用不到它。:)
  3. Android 上面有一些浏览器支持插件,用不到它。:)
  4. 如果用户愿意安装 AdGuard APP 或者更高级的东西,也用不到它。:)
  5. 如果浏览器的 广告拦截 支持下面描述的语法,就没必要用它。:)
  6. 很多套壳浏览器不支持油猴 API,用不了它。:)

如果你非常幸运,不属于上面所有情况,可以试试它 :)

脚本功能与行为

主要流程,请参考以下 DOT :

Graphviz DOT
digraph Run {
    ordering=in;

    subgraph Condition {
        node [shape = "diamond";];
        手动禁用;
        规则为空;
        检查更新;
        预存为空;
        预存需要更新;
        已经应用预存;
        已经应用预存_2;
    }
    
    脚本退出 [shape = "square";];
    
    手动禁用 -> 创建启用菜单 [label = "是"; color = forestgreen;];
    创建启用菜单 -> 脚本退出;
    手动禁用 -> 创建禁用菜单 [label = "否"; color = tomato;];
    创建禁用菜单 -> 预存为空;
    预存为空 -> 读取规则,创建更新菜单 [label = "是"; color = forestgreen;];
    预存为空 -> 应用预存 [label = "否"; color = tomato;];
    应用预存 -> 创建更新菜单 -> 预存需要更新;

    预存需要更新 -> 读取规则,创建更新菜单 [label = "是"; color = forestgreen;];
    预存需要更新 -> 检查更新 [label = "否"; color = tomato;];

    读取规则,创建更新菜单 -> 规则为空;
    规则为空 -> 强制下载规则 [label = "是"; color = forestgreen;];
    规则为空 -> 转换规则,保存到预存 [label = "否"; color = tomato;];
    转换规则,保存到预存 -> 已经应用预存;
    已经应用预存 -> 检查更新 [label = "是"; color = forestgreen;];
    已经应用预存 -> 应用规则 [label = "否"; color = tomato;];
    应用规则 -> 检查更新;
    检查更新 -> 下载规则 [label = "有"; color = forestgreen;];
    检查更新 -> 脚本退出 [label = "无"; color = tomato;];
    强制下载规则 -> 已经应用预存_2;
    已经应用预存_2 -> 脚本退出 [label = "是"; color = forestgreen;];
    已经应用预存_2 -> 应用规则_2 [label = "否"; color = tomato;];
    应用规则_2 -> 脚本退出;
    下载规则 -> 脚本退出;
}

更新流程 :

  1. 强制更新 ? 继续 : (当前日期 != 记录日期) ? 继续 : 退出
  2. (对每个规则地址:)
    1. "在线更新" 是否开启 ? 继续 : 退出 (只依靠 @resource)
    2. HEAD 请求获取响应头 成功 ? 继续 : 退出
    3. 响应头里有规则内容 ? 直接更新存储 : 继续
    4. 响应头里有 ETag ? ( 与存储一致 ? (没有更新,退出) : 继续 ) : (不提供 ETag,继续)
    5. GET 请求获取规则内容 成功 ? 更新存储和 ETag : 退出
  3. 更新记录日期,合并规则

脚本菜单 :

  1. "禁用拦截" : 对特定网站域名禁用脚本,切换以后页面会刷新
  2. "点击更新" : 点击可手动更新规则,更新完毕自动刷新页面,后面的是最近更新时间
  3. "点击清空" : 点击可清空 Values 里的规则、日期、ETag,前面 :
    如果是 "规则",则说明没有预存 CSS,运行时转换了规则,数字为 应用规则数 / 规则总行数
    如果是 "CSS",则应用了预存的 CSS,数字为 不准确 的 CSS 选择器数量

内置规则

目前内置由 @大萌主 提供的两套规则,十分感谢 :)

浏览器兼容情况

无法支持的浏览器 :

  • PP 浏览器: 因脚本资源过大 (?) ,安装此脚本会导致浏览器闪退 。
  • 海阔世界: 脚本依赖获取失败 。
  • 米侠 浏览器: 规则下载超时,并且不支持 @resource,脚本获取不到任何规则 。
  • Infinity: 无法安装脚本,原因未知 。
  • Rains 浏览器: 运行新版脚本会过早中断,如有需要请使用 2.1.5 。
  • M 浏览器: 运行新版脚本会过早中断,如有需要请使用 2.1.5 。

对于 Via 浏览器 :

  1. Via 浏览器的跨域接口无法下载大文件,因此较大的规则无法自动更新。
    需要 更新重新安装 脚本才可更新规则。
  2. Via 浏览器不支持脚本菜单,因此 手动更新 清空规则 网站禁用 功能不可用。

对于 X 浏览器 :

  1. X 浏览器的跨域接口无法下载大文件,因此较大的规则无法自动更新。
    需要 更新重新安装 脚本才可更新规则。
  2. X 浏览器的跨域接口不支持 HEAD 方法,无法通过此方法查询规则更新状态。

对于 MDM 浏览器 :

  1. MDM 浏览器无法存储过大的规则,需要 更新重新安装 脚本才可更新规则。
  2. MDM 浏览器的跨域接口 HEAD 方法不返回 ETag,无法通过此方法查询规则更新状态。

对于 B 仔浏览器 :

  1. 安装以后,需要进入设置,将此脚本 执行时机 改为 网页加载后 ,否则不会运行。
  2. B 仔浏览器无法存储过大的规则,需要 更新重新安装 脚本才可更新规则。
  3. B 仔浏览器的跨域接口疑似无法下载大文件,因此较大的规则无法自动更新。
    需要 更新重新安装 脚本才可更新规则。

对于 Top 浏览器 :

  1. Top 浏览器 不支持脚本菜单,因此 手动更新 清空规则 网站禁用 功能不可用。
  2. Top 浏览器无法存储过大的规则,也无法读取内容过大的 @resource
    只能依靠每次下载规则来应用,流量 过小的用户 慎用
  3. 为规避风险,Top 浏览器在正规企业网站不会运行任何脚本,包括此脚本。

对于 书签地球 :

  1. 书签地球 不支持脚本菜单,因此 手动更新 清空规则 网站禁用 功能不可用。
  2. 书签地球 的存储无法跨域读取,导致访问每个不同的网站都会下载并存储规则,
    流量 和 手机存储 过小的用户 慎用
  3. 书签地球 不支持 @resource ,导致脚本无法获取 禁用了在线更新 的规则。

外部依赖库许可声明

此脚本引用了 AdGuard 的解析库 ExtendedCss
附 ExtendedCss 许可声明:

(文件注释)

/*! extended-css - v1.3.16 - Thu Sep 15 2022
* https://github.com/AdguardTeam/ExtendedCss
* Copyright (c) 2022 AdGuard. Licensed GPL-3.0
*/

(标准声明填充)

    ExtendedCss
    Copyright (C) 2022 AdGuard

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.

从 2.1.2 开始,此脚本不再直接引用 bext-lib ,
而是抽取了其中的两个函数,并做了修改。
从 2.3.0 开始,不再使用 runNeed,只使用 runOnce。

附 bext-lib 许可声明 :

MIT License

Copyright (c) 2022 ikkz

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

细节

如何修改规则

单条规则

可以在 80 行那里添加单条 ABP 元素规则,请务必确认在下面 "支持的语法" 中。

订阅规则

给它取个英文单词的名字,然后需要修改三个地方 :

脚本头 资源

// @resource 名字 规则地址

脚本头 跨域白名单

// @connect 规则地址的域名

OnlineRules.push 里面加个对象

    {
      标识: "名字",
      地址: "规则地址",
      在线更新: !!1, // 1 开启 0 关闭
      筛选后存储: !!1,
    },

注意,只有最后一个对象末尾可以不加逗号

支持的语法

域名匹配
! 一般的元素规则
###id
example.com###id

! 多域名
example.com,example.org###id

! 排除子域名
example.com,~www.example.com###id

! TLD 通配
example.*###id
类型
隐藏 放行 内容 ExtendedCss
## #@# 标准 CSS 选择器
#?# #@?# 扩充的 CSS 选择器
#$# #@$# 标准 CSS 规则
#$?# #@$?# 扩充的 CSS 规则
扩充的选择器
  • :has(...)
  • :-abp-has(...)
  • [-ext-has="..."]
  • :has-text(...)
  • :contains(...)
  • :-abp-contains(...)
  • [-ext-contains="..."]
  • :matches-css(...)
  • [-ext-matches-css="..."]
  • :matches-css-before(...)
  • [-ext-matches-css-before="..."]
  • :matches-css-after(...)
  • [-ext-matches-css-after="..."]
  • :matches-attr(...)
  • :nth-ancestor(...)
  • :upward(...)
  • :xpath(...)
  • :remove()
  • :not(...)
  • :if-not(...)

不支持的语法

类型
  • #%# #@%#
  • ##+ #@#+
  • ##^
  • $$ $@$
域名修饰符
[$domain="example.com"]###id
[$path="/index"]###id
扩充的选择器
  • :matches-path(...)
  • :min-text-length(...)
  • :watch-attr(...)
  • :-abp-properties(...)
  • :matches-property(...)
预处理指令
  • !#include
  • !#if !#endif
其它
  1. #$# 在 AdBlock Plus 中为 Snippet Filter,此脚本不支持
  2. 仅支持 AdGuard 风格的写法,比如 CSS 值不应用引号包裹,CSS 值中的括号必须转义,若是遇到 uBlock Origin 写法的规则会导致扩充类规则全部失效