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 在 解析实现
4,259 每月下载
在 3 个crate中(2个直接) 使用
56KB
1K SLoC
用户代理解析器
一个解析器,用于从用户代理中获取产品、操作系统、设备、CPU和引擎信息,灵感来源于 https://github.com/faisalman/ua-parser-js 和 https://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的 Product
、OS
、Device
、CPU
、Engine
模型(加上 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
许可证
依赖项
~3–34MB
~561K SLoC