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以适应您的使用场景:

  1. CSS验证 (css-validation): 在解析内容过滤规则时启用CSS验证
  2. 内容拦截格式转换 (content-blocking): 支持将ABP风格规则转换为苹果的内容拦截格式
  3. 外部域名解析 (embedded-domain-resolver): 允许使用外部域名解析实现
  4. 资源解析 (resource-assembler): 从uBlock Origin的格式解析资源
  5. 线程安全 (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);
}

这个示例展示了如何:

  1. 从文件加载过滤规则
  2. 创建广告拦截引擎
  3. 检查网络请求是否应该被拦截
  4. 获取内容过滤规则

要运行这个示例,您需要先下载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)
}

这个完整示例展示了如何:

  1. 初始化规则引擎并加载规则(支持从文件加载)
  2. 添加性能优化选项和资源重定向规则
  3. 设置自定义回调来监控拦截行为
  4. 测试不同类型的网络请求拦截
  5. 获取页面元素隐藏规则
  6. 处理资源重定向逻辑

要使用此示例,你需要:

  1. 创建一个filters.txt文件包含你的过滤规则(可选)
  2. 在Cargo.toml中添加adblock依赖
  3. 根据实际需求调整测试请求和重定向资源

这个示例综合了提供内容中的所有主要功能点,可以直接运行测试广告拦截功能。

回到顶部