#filter #list #update #content #directive #fetch #ad-guard

adguard-flm

这个包代表了一个用于管理AdGuard过滤列表的库。

1 个不稳定版本

0.5.0 2024年8月23日

#452数据库接口

自定义许可

1MB
7.5K SLoC

过滤列表管理库核心

概述

这个包代表了一个用于管理AdGuard过滤列表的库。

这个库可以

  • 获取过滤列表
  • 存储下载的过滤列表
  • 执行过滤列表更新
  • ... 更多

过滤分析

从过滤内容中解析的元标签列表

  • ! Title - 过滤器的名称。
  • ! Description - 过滤器的详细描述。
  • ! Version - 过滤器的当前版本。
  • ! Expires - 过滤器的过期期限。将转换为秒。 请参阅测试示例 如果元数据中缺少此字段,则使用配置中的全局值。在更新过滤器之前,如果此值小于该值,则将其检查并调整为较低边界 (3600)。
  • ! Homepage - 过滤器的网站/主页。
  • ! TimeUpdated - 此过滤器在注册表中更新的时间。格式:2024-08-13T13:30:53+00:00
  • ! Last modified - TimeUpdated 的别名。格式:2024-08-13T12:26.703Z。您可以为这两个字段选择一个格式。
  • ! Diff-Path - 差分更新信息
  • ! License - 过滤器许可链接。
  • ! Checksum - 过滤器的base64(md5-checksum)。在更新/安装过滤器之前,将计算并比较校验和。请参阅源代码这里

库支持的过滤器预处理器指令列表

请参阅AdGuard预处理器指令

库支持

  • !#include 文件路径 - 将文件内容包含到过滤器中并处理。文件路径必须是
    • 与父过滤器的相同源绝对URL。
    • 相对URL。
    • 文件URL(仅当父过滤器的URL具有file方案时)。
  • !#if/!#endif/!#else - 条件编译指令。它们可以嵌套。支持的令牌
    • () - 括号
    • true/false - 布尔值
    • && || - AND/OR运算符
    • ! - NOT运算符
    • 来自配置的编译器常量文本。例如,windowsmac等。它的工作方式是这样的:如果遇到的常量在configuration.compiler_conditional_constants列表中,则条件变为true,否则为false

请参阅测试以获取更多信息
for all directives - 这里

for include - 这里
for if/endif/else - 这里

用法

为库外观创建和设置配置

let mut configuration = Configuration::default();

// Sets urls for filters indices.
configuration.metadata_url = "https://filters.adtidy.org/extension/safari/filters.json".to_string();
configuration.metadata_locales_url = "https://filters.adtidy.org/extension/safari/filters_i18n.json".to_string();

// Sets locale. Will be used for returning localized strings for filters,
// groups, and tags, where applicable.
configuration.locale = "pt_PT".to_string();

// Creates facade instance
let flm = FilterListManagerImpl::new(configuration);

如何创建和填充标准过滤器数据库

// Creates and configures the database. Populates the database with information
// from the filter indexes (filters metadata), the paths to which are specified
// in the configuration.
flm.pull_metadata();

// Then, downloads the contents of the filters.
flm.update_filters(true, 0, true);

[!NOTE] 默认情况下,应用程序使用当前工作目录(cwd)中的数据库运行,数据库文件名基于格式 agflm_{configuration.filter_list_type.to_string()} 生成。对于标准过滤器,文件路径将是 $CWD/agflm_standard.db

对自定义过滤器的操作

库将所有过滤器分为三类

  1. 索引过滤器 - 通过解析索引(注册表)创建的过滤器。
  2. 自定义过滤器 - 通过使用库的方法添加(并编辑)的用户过滤器。
  3. 特殊过滤器 - 由库的脚本预配置的自定义过滤器。

您可以通过参考数据库常量文件来检查特殊和自定义过滤器的指标。

// Installs a custom filter.
let custom_filter = flm.install_custom_filter_list(
    String::from("https://example.com/custom_filter.txt"),
    true, // The filter list is marked as trusted.
    String::from("Custom title"),
    String::from("Custom description")
);

// Edit metadata.
flm.update_custom_filter_metadata(
    custom_filter.id,
    String::from("new title"),
    false // The filter list is marked as not trusted.
);

// Turn on this filter.
flm.enable_filter_lists(vec![custom_filter.id], true);

// Remove this filter.
flm.delete_custom_filter_lists(vec![custom_filter.id]);

直接从字符串安装自定义过滤器,而不是下载。

let string_contents = String::from(r"
! Checksum: ecbiyIyplBZKLeNzi64pGA
...
! JS API START
#%#var AG_onLoad=function(func){if(document.readyState==="complete"||document.readyState==="interactive")func();else
... 
");
flm.install_custom_filter_from_string(
    1719505304i64, // last_download_time value. Explanation: Can we update filter? Answer: (filter.last_download_time + filter.expires < now()) 
    true, // Enabled
    true, // Trusted
    string_contents,
    None,
    None
);

自定义过滤器规则的操作

// Saves the structure containing the filter rules.
flm.save_custom_filter_rules(rules_for_new_local_custom_filter);

// You can save only disabled rules for the filter list 
flm.save_disabled_rules(filter.id, disabled_rules_list);

获取操作

// Retrieves all filters from the database.
// Returns Vec<FullFilterList>.
flm.get_full_filter_lists();

// Retrieves a filter by its ID from the database.
// Returns Optional<FullFilterList>.
flm.get_full_filter_list_by_id(id);

FullFilterList参考

其他(所有)操作

外观接口

依赖关系

~37–51MB
~878K SLoC