#user-agent #bot #browser #crawler

bin+lib isbot

检测用户代理是否为已知的机器人

4个版本

0.1.3 2022年6月18日
0.1.2 2022年4月20日
0.1.1 2022年4月3日
0.1.0 2022年3月27日

1440Web编程

Download history 281/week @ 2024-04-16 237/week @ 2024-04-23 290/week @ 2024-04-30 413/week @ 2024-05-07 261/week @ 2024-05-14 301/week @ 2024-05-21 223/week @ 2024-05-28 292/week @ 2024-06-04 430/week @ 2024-06-11 338/week @ 2024-06-18 295/week @ 2024-06-25 257/week @ 2024-07-02 258/week @ 2024-07-09 228/week @ 2024-07-16 228/week @ 2024-07-23 206/week @ 2024-07-30

982 每月下载量
ngxav 中使用

MIT 许可证

1.5MB
174

isbot

CI codecov Security Audit Crate API

Rust库,用于通过用户代理字符串检测机器人。

特性

  • 关注速度、简单性,并确保真实浏览器不会被错误地识别为机器人
  • 在超过 12k 个机器人用户代理和 180k 个浏览器用户代理上进行测试 - 更新的机器人浏览器列表作为集成测试套件的一部分下载
  • 易于作为中间件插件到Actix、Rocket或其他Rust Web框架
  • 包含默认的机器人用户代理正则表达式集合,可选地在编译时包含
  • 允许在运行时手动添加和删除用户代理模式

用法

将以下内容添加到您的 Cargo.toml

[dependencies]
isbot = "0.1.2"

以下示例使用默认的机器人模式正确识别 Googlebot-Image 用户代理为机器人,并将 Opera 用户代理识别为浏览器。

use isbot::Bots;

let bots = Bots::default();

assert_eq!(bots.is_bot("Googlebot-Image/1.0"), true);
assert_eq!(bots.is_bot("Opera/9.60 (Windows NT 6.0; U; en) Presto/2.1.1"), false);

中间件:Actix或Rocket

isbot 可以作为中间件添加,以启用全局或按处理程序拒绝已知的机器人。

Actix示例

在Actix中使用 isbot 有多种方式。一种方式是将 Bots 实例作为状态传递到应用数据中。例如

use isbot::Bots;

struct AppState {
    bots: Bots,
}

let state = AppState {
    bots: Bots::default(),
};
let app = App::new()
    .app_data(web::Data::new(state))
    .route("/", web::get().to(index));

请求处理程序可以使用 Bots 数据来过滤掉机器人

async fn index(req: HttpRequest, data: web::Data<AppState>) -> HttpResponse {
    if let Some(user_agent) = get_user_agent(req.headers()) {
        if data.bots.is_bot(user_agent) {
            return HttpResponse::Forbidden().body("Bots not allowed");
        }
    }
    HttpResponse::Ok().body("Home")
}

另一种选择是使用Actix的 wrap_fn 函数添加中间件,并全局拒绝来自机器人的所有请求。这两个示例以及其他选项和细节可以在测试示例中看到

自定义

可以通过添加或删除模式来自定义机器人用户代理模式,使用 appendremove 方法。

添加机器人模式

要添加新的机器人模式,使用 append 指定正则表达式模式的数组。例如

let mut bots = isbot::Bots::default();

assert_eq!(bots.is_bot("Mozilla/5.0 (CustomNewTestB0T /1.2)"), false);

bots.append(&[r"CustomNewTestB0T\s/\d\.\d"]);

assert_eq!(bots.is_bot("Mozilla/5.0 (CustomNewTestB0T /1.2)"), true);

删除机器人

要删除机器人模式,使用 remove 并指定要删除的现有模式的数组。例如,为了删除Chrome Lighthouse用户代理模式以表示它不是机器人

let mut bots = isbot::Bots::default();

bots.remove(&["Chrome-Lighthouse"]);

assert_eq!(bots.is_bot("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36 Chrome-Lighthouse"), false);

自定义机器人列表

默认的用户代理正则表达式模式在bot_regex_patterns.txt文件中管理。

如果您不想使用默认的机器人模式,可以提供自己的列表。由于默认的机器人模式在编译时自动添加到库中,您应该首先禁用默认功能。默认情况下启用了include-default-bots功能,因此定义在bot_regex_patterns.txt中的模式在编译时包含在库中。

您可以通过禁用默认功能然后包含自己的机器人正则表达式来排除模式。为此,在您的Cargo.toml依赖定义中将default-features设置为false。例如

[dependencies]
isbot = { version = "0.1.1", default-features = false }

然后使用Bots::new()提供以换行符分隔的正则表达式列表。例如

use isbot::Bots;

let custom_user_agent_patterns = r#"
^Googlebot-Image/
bingpreview/"#;

let bots = Bots::new(custom_user_agent_patterns);
assert_eq!(bots.is_bot("Googlebot-Image/1.0"), true);

测试

为了确保验证最新的用户代理,测试用例数据从多个来源下载。

要下载最新的测试数据固定文件,运行download_fixture_data.rs可执行文件

cargo run --bin download_fixture_data --features="download-fixture-data"

这将更新fixtures目录中的文件。

单元测试和集成测试

要运行所有单元和集成测试

cargo test

Actix测试

要验证对Actix示例的更改,请运行以下命令

cargo test --example actix_example

Rocket测试

要验证对Rocket示例的更改,请运行以下命令

cargo test --example rocket_example

哲学

由于没有明确的界限来定义机器人用户代理和真实浏览器用户代理,因此机器人检测是一个灰色区域。一些库专注于广泛地将机器人分类,并尽可能多地识别它们,存在风险,即真实的用户浏览器可能被误认为是机器人。

这个库的重点是识别已知的机器人,同时主要确保不会错误地将真实用户或浏览器标记为机器人。所有机器人用户代理模式都经过大量真实浏览器和机器人模式的验证,以消除误报。

例如,以下用户代理字符串被各种库和数据中心识别为机器人和真实浏览器

Mozilla/5.0 (Linux; Android 4.2.1; CUBOT GT99 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19

致谢

其他语言有许多出色的机器人检测库,以及维护机器人和使用代理识别数据的出色开发者。这个库从许多库中汲取灵感,特别是

语言
https://github.com/omrilotan/isbot JavaScript
https://github.com/JayBizzle/Crawler-Detect/ PHP
https://github.com/matomo-org/device-detector PHP
https://github.com/fnando/browser Ruby
https://github.com/biola/Voight-Kampff Ruby

以下数据源被直接使用或作为静态测试数据和下载的用户代理识别的灵感来源

数据源 备注
user-agents.net 用户代理数据库
myip.ms 已知的网络机器人和蜘蛛列表
monperrus 机器人、爬虫和蜘蛛使用的用户代理集合
ua-core 用于构建Browserscope用户代理解析器的语言端正则表达式文件和数据

贡献

查看贡献指南。

许可

isbot在MIT许可下分发。有关详细信息,请参阅LICENSE

依赖关系

~2.1–4MB
~71K SLoC