#user-agent #product-os #rocket #uap #uap-core

user-agent-parser

一个解析器,用于从用户代理中获取产品、操作系统、设备、CPU和引擎信息,灵感来源于 https://github.com/faisalman/ua-parser-js 和 https://github.com/ua-parser/uap-core

17个版本

0.3.6 2023年11月3日
0.3.4 2022年11月4日
0.3.3 2022年5月10日
0.3.1 2022年3月19日
0.2.1 2019年9月17日

#217解析实现

Download history 159/week @ 2024-04-23 188/week @ 2024-04-30 243/week @ 2024-05-07 235/week @ 2024-05-14 205/week @ 2024-05-21 169/week @ 2024-05-28 149/week @ 2024-06-04 92/week @ 2024-06-11 117/week @ 2024-06-18 172/week @ 2024-06-25 201/week @ 2024-07-02 142/week @ 2024-07-09 970/week @ 2024-07-16 1052/week @ 2024-07-23 1094/week @ 2024-07-30 1099/week @ 2024-08-06

4,259 每月下载
3 个crate中(2个直接) 使用

MIT 许可证

56KB
1K SLoC

用户代理解析器

CI

一个解析器,用于从用户代理中获取产品、操作系统、设备、CPU和引擎信息,灵感来源于 https://github.com/faisalman/ua-parser-jshttps://github.com/ua-parser/uap-core

用法

您可以创建一个 regexes.yaml 文件或从 https://github.com/ua-parser/uap-core 复制一个。

这是 regexes.yaml 的一个简单示例。

user_agent_parsers:
  - regex: '(ESPN)[%20| ]+Radio/(\d+)\.(\d+)\.(\d+) CFNetwork'
  - regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)\.(\d+(?:pre|))'
    family_replacement: 'Firefox ($1)'
  - regex: '(Android) Eclair'
    v1_replacement: '2'
    v2_replacement: '1'

os_parsers:
  - regex: 'Win(?:dows)? ?(95|98|3.1|NT|ME|2000|XP|Vista|7|CE)'
    os_replacement: 'Windows'
    os_v1_replacement: '$1'

device_parsers:
  - regex: '\bSmartWatch *\( *([^;]+) *; *([^;]+) *;'
    device_replacement: '$1 $2'
    brand_replacement: '$1'
    model_replacement: '$2'

然后,使用关联函数 from_path(如果您的YAML数据在内存中,则使用 from_str)创建一个 UserAgentParser 实例。

use user_agent_parser::UserAgentParser;

let ua_parser = UserAgentParser::from_path("/path/to/regexes.yaml").unwrap();

使用 parse_* 方法并输入用户代理字符串以获取信息。

use user_agent_parser::UserAgentParser;

let ua_parser = UserAgentParser::from_path("/path/to/regexes.yaml").unwrap();

let user_agent = "Mozilla/5.0 (X11; Linux x86_64; rv:10.0) Gecko/20100101 Firefox/10.0 [FBAN/FBIOS;FBAV/8.0.0.28.18;FBBV/1665515;FBDV/iPhone4,1;FBMD/iPhone;FBSN/iPhone OS;FBSV/7.0.4;FBSS/2; FBCR/Telekom.de;FBID/phone;FBLC/de_DE;FBOP/5]";

let product = ua_parser.parse_product(user_agent);

println!("{:#?}", product);

//    Product {
//        name: Some(
//            "Facebook",
//        ),
//        major: Some(
//            "8",
//        ),
//        minor: Some(
//            "0",
//        ),
//        patch: Some(
//            "0",
//        ),
//    }

let os = ua_parser.parse_os(user_agent);

println!("{:#?}", os);

//    OS {
//        name: Some(
//            "iOS",
//        ),
//        major: None,
//        minor: None,
//        patch: None,
//        patch_minor: None,
//    }

let device = ua_parser.parse_device(user_agent);

println!("{:#?}", device);

//    Device {
//        name: Some(
//            "iPhone",
//        ),
//        brand: Some(
//            "Apple",
//        ),
//        model: Some(
//            "iPhone4,1",
//        ),
//    }

let cpu = ua_parser.parse_cpu(user_agent);

println!("{:#?}", cpu);

//    CPU {
//        architecture: Some(
//            "amd64",
//        ),
//    }

let engine = ua_parser.parse_engine(user_agent);

println!("{:#?}", engine);

//    Engine {
//        name: Some(
//            "Gecko",
//        ),
//        major: Some(
//            "10",
//        ),
//        minor: Some(
//            "0",
//        ),
//        patch: None,
//    }

parse_* 方法的结果实例的生存期取决于用户代理字符串和 UserAgentParser 实例。要使其独立,请调用 into_owned 方法。

use user_agent_parser::UserAgentParser;

let ua_parser = UserAgentParser::from_path("/path/to/regexes.yaml").unwrap();

let product = ua_parser.parse_product("Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.12) Gecko/20101027 Ubuntu/10.04 (lucid) Firefox/3.6.12").into_owned();

Rocket 支持

此crate支持Rocket框架。您只需为此crate启用 rocket 功能即可。

[dependencies.user-agent-parser]
version = "*"
features = ["rocket"]

Rocket 管理一个 UserAgentParser 实例,并且此crate的 ProductOSDeviceCPUEngine 模型(加上 UserAgent 模型)可以作为 请求守卫 使用。

#[macro_use]
extern crate rocket;

use user_agent_parser::{UserAgentParser, UserAgent, Product, OS, Device, CPU, Engine};

#[get("/")]
fn index(user_agent: UserAgent, product: Product, os: OS, device: Device, cpu: CPU, engine: Engine) -> String {
    format!("{user_agent:#?}\n{product:#?}\n{os:#?}\n{device:#?}\n{cpu:#?}\n{engine:#?}",
            user_agent = user_agent,
            product = product,
            os = os,
            device = device,
            cpu = cpu,
            engine = engine,
    )
}

#[launch]
fn rocket() -> _ {
    rocket::build()
        .manage(UserAgentParser::from_path("/path/to/regexes.yaml").unwrap())
        .mount("/", routes![index])
}

测试

# git clone --recurse-submodules git://github.com/magiclen/user-agent-parser.git

git clone git://github.com/magiclen/user-agent-parser.git

cd user-agent-parser

git submodule init
git submodule update --recursive

cargo test

Crates.io

https://crates.io/crates/user-agent-parser

文档

https://docs.rs/user-agent-parser

许可证

MIT

依赖项

~3–34MB
~561K SLoC