Rust广告拦截库adblock的使用:高效过滤规则引擎与隐私保护解决方案
Rust广告拦截库adblock的使用:高效过滤规则引擎与隐私保护解决方案
adblock-rust是Brave浏览器原生广告拦截器的引擎,可作为库供任何人使用。它具有以下特性:
- 网络拦截
- 内容过滤
- 资源替换
- 支持Hosts语法
- 支持uBlock Origin语法扩展
- 支持iOS内容拦截语法转换
- 可编译为原生代码或WASM
- Rust绑定
- JS绑定
- 社区维护的Python绑定
- 高性能
开始使用
adblock-rust可用于多种项目,包括浏览器、研究工具和代理。可能也适合您的项目!
安装
在项目目录中运行以下Cargo命令:
cargo add adblock
或者在Cargo.toml中添加以下行:
adblock = "0.10.1"
示例代码
以下是使用adblock-rust的基本示例:
use adblock::engine::Engine;
use adblock::lists::{FilterSet, FilterFormat};
fn main() {
// 创建过滤器集
let mut filter_set = FilterSet::new(true);
// 添加一些基本过滤规则
filter_set.add_filter_list("||example.com^$third-party", FilterFormat::Standard);
// 创建广告拦截引擎
let blocker = Engine::from_filter_set(filter_set, true);
// 检查URL是否应该被拦截
let should_block = blocker.check_network_urls(
"https://example.com/ads.js",
"https://example.com",
"script"
);
println!("Should block: {}", should_block.matched);
}
可选特性
通过Cargo特性可以调整adblock-rust以适应您的使用场景:
- CSS验证 (
css-validation
): 在解析内容过滤规则时启用CSS验证 - 内容拦截格式转换 (
content-blocking
): 支持将ABP风格规则转换为苹果的内容拦截格式 - 外部域名解析 (
embedded-domain-resolver
): 允许使用外部域名解析实现 - 资源解析 (
resource-assembler
): 从uBlock Origin的格式解析资源 - 线程安全 (
unsync-regex-caching
): 启用规则匹配速度和内存使用的优化
完整示例
以下是一个更完整的示例,展示如何使用adblock-rust加载EasyList规则并检查URL:
use adblock::engine::Engine;
use adblock::lists::{FilterSet, FilterFormat};
use std::fs;
fn main() {
// 加载EasyList规则文件
let filter_list = fs::read_to_string("easylist.txt")
.expect("Failed to read filter list");
// 创建过滤器集并添加规则
let mut filter_set = FilterSet::new(true);
filter_set.add_filters(&filter_list, FilterFormat::Standard);
// 创建广告拦截引擎
let blocker = Engine::from_filter_set(filter_set, true);
// 测试几个URL
let test_cases = vec![
("https://example.com/ads.js", "https://example.com", "script"),
("https://example.com/content.jpg", "https://example.com", "image"),
("https://tracker.com/track.js", "https://example.com", "script")
];
for (url, source, resource_type) in test_cases {
let result = blocker.check_network_urls(url, source, resource_type);
println!("URL: {}, Blocked: {}, Reason: {:?}",
url,
result.matched,
result.filter
);
}
// 检查内容过滤规则
let cosmetic_result = blocker.url_cosmetic_resources("https://example.com");
println!("Cosmetic filters: {:?}", cosmetic_result);
}
这个示例展示了如何:
- 从文件加载过滤规则
- 创建广告拦截引擎
- 检查网络请求是否应该被拦截
- 获取内容过滤规则
要运行这个示例,您需要先下载EasyList规则文件并将其放在项目目录中。
1 回复
以下是基于提供内容的完整示例demo,整合了多个功能点:
// 完整示例:集成广告拦截、元素隐藏和资源重定向功能
use adblock::engine::Engine;
use adblock::lists::FilterSet;
use adblock::resources::Resource;
use std::fs::File;
use std::io::Read;
fn main() {
// 1. 初始化规则集合
let mut filter_set = FilterSet::new(true);
// 从文件加载规则 (示例文件需提前准备)
if let Ok(loaded_set) = load_rules_from_file("filters.txt") {
filter_set = loaded_set;
} else {
// 添加默认规则
filter_set.add_filters(vec![
"||example.com/ads/*",
"##.ad-banner",
"@@||example.com/ads/whitelisted-ad.jpg",
"example.com##.popup",
"||tracking.example.com^$third-party"
]);
}
// 2. 创建规则引擎并优化
let mut engine = Engine::from_filter_set(filter_set, true);
engine.with_tags(vec!["ads", "privacy"]);
// 3. 添加重定向资源
let blank_js = Resource {
name: "blank-js".to_string(),
aliases: vec![],
kind: "application/javascript".to_string(),
content: base64::encode("(function() {})()"),
};
engine.use_resources(&vec![blank_js]);
// 4. 设置回调函数
engine.set_network_filter_callback(|request, filter| {
println!("拦截请求: {} \n规则: {}", request.url, filter.raw_line);
true
});
// 5. 测试网络请求拦截
let test_requests = vec![
("https://example.com/ads/banner.jpg", "https://example.com", "image"),
("https://example.com/content.jpg", "https://example.com", "image"),
("https://tracking.example.com/stats", "https://example.com", "script")
];
for (url, source_url, request_type) in test_requests {
let request = adblock::request::Request::new(url, source_url, request_type).unwrap();
let result = engine.check_network_request(&request);
println!("请求 {} 拦截结果: {}", url, result.matched);
// 检查是否有重定向
if let Some(redirect) = engine.get_redirect_url(url) {
println!("需要重定向到资源: {}", redirect);
}
}
// 6. 获取元素隐藏规则
let url = "https://example.com";
let cosmetic_resources = engine.url_cosmetic_resources(url);
println!("页面 {} 需要隐藏的元素: {:?}", url, cosmetic_resources.hide_selectors);
}
// 从文件加载过滤规则的函数
fn load_rules_from_file(path: &str) -> Result<FilterSet, std::io::Error> {
let mut file = File::open(path)?;
let mut contents = String::new();
file.read_to_string(&mut contents)?;
let mut filter_set = FilterSet::new(true);
let rules: Vec<&str> = contents.lines().collect();
filter_set.add_filters(rules);
Ok(filter_set)
}
这个完整示例展示了如何:
- 初始化规则引擎并加载规则(支持从文件加载)
- 添加性能优化选项和资源重定向规则
- 设置自定义回调来监控拦截行为
- 测试不同类型的网络请求拦截
- 获取页面元素隐藏规则
- 处理资源重定向逻辑
要使用此示例,你需要:
- 创建一个
filters.txt
文件包含你的过滤规则(可选) - 在Cargo.toml中添加adblock依赖
- 根据实际需求调整测试请求和重定向资源
这个示例综合了提供内容中的所有主要功能点,可以直接运行测试广告拦截功能。