DeviceDetector:一个 User Agent 就能识别设备类型

做 Web 开发的人,多少都遇到过需要识别用户设备的场景。

手机端展示手机页面,桌面端展示桌面页面,爬虫来了直接拦截。这些事情听起来简单,真要自己写一套 User Agent 解析逻辑,会发现浏览器、操作系统、设备型号的组合是个无底洞。

正文顶部截图

DeviceDetector 是 Matomo 团队维护的一个 PHP 库,专门做这件事。它解析 User Agent 字符串和 Client Hints,从中提取设备类型、浏览器、操作系统、品牌型号等信息。

能识别哪些东西

DeviceDetector 的识别范围很广。

设备类型方面,它能区分智能手机、功能机、平板、游戏主机、便携媒体播放器、车载浏览器、电视、智能音箱、摄像头、可穿戴设备、外设等十多种类别。

客户端方面,它能识别浏览器、RSS 阅读器、移动应用、个人信息管理工具、媒体播放器、代码库。每种类型下面还有细分,光浏览器就覆盖了上百种。

操作系统和品牌型号也在识别范围内。拿到一个 User Agent,它能告诉你这是 Android 还是 iOS,是三星还是小米,具体是哪个型号。

它还能识别爬虫。Googlebot、Bingbot、各种 SEO 工具的爬虫,都能被标记出来。

怎么用

通过 Composer 安装,一行命令搞定:

composer require matomo/device-detector

使用方式也很直接。传入 User Agent 字符串,调用 parse(),然后按需取结果。

$userAgent = $_SERVER['HTTP_USER_AGENT'];
$dd = new DeviceDetector($userAgent);
$dd->parse();

if ($dd->isBot()) {
    $botInfo = $dd->getBot();
} else {
    $clientInfo = $dd->getClient();
    $osInfo = $dd->getOs();
    $device = $dd->getDeviceName();
    $brand = $dd->getBrandName();
    $model = $dd->getModel();
}

判断设备类型的方法很丰富。isSmartphone()isTablet()isTV()isConsole()isCarBrowser(),基本上能想到的设备类型都有对应的方法。

README区域截图

如果你只需要检测是不是爬虫,不想跑完整的解析流程,可以直接用 BotParser:

$botParser = new BotParser();
$botParser->setUserAgent($userAgent);
$result = $botParser->parse();

if (!is_null($result)) {
    return; // 是爬虫,不做处理
}

Client Hints 支持

除了传统的 User Agent,DeviceDetector 也支持 Client Hints。Client Hints 是浏览器通过 HTTP 头主动提供设备信息的机制,比 User Agent 更准确。

使用时需要在服务端声明支持 Client Hints,然后通过 ClientHints::factory($_SERVER) 传入即可。这个是可选的,不传也能正常工作。

性能和缓存

默认情况下,DeviceDetector 使用内置的内存数组缓存。如果需要跨请求缓存,它支持多种缓存后端:PSR-6、PSR-16、Doctrine、Laravel Cache 都能接入。

$cache = new \Symfony\Component\Cache\Adapter\ApcuAdapter();
$dd->setCache(new \DeviceDetector\Cache\PSR6Bridge($cache));

这个设计比较实用。在高流量场景下,解析 User Agent 是个频繁操作,接上 Redis 或 APCu 能省不少开销。

其他语言版本

DeviceDetector 原版是 PHP 写的,但社区已经移植到了很多语言:

  • JavaScript/TypeScript/NodeJS
  • Python 3
  • Ruby
  • Go
  • Java
  • Rust
  • Elixir
  • Crystal
  • .NET

如果你的项目不是 PHP,可以直接搜对应语言的版本。大部分都是从这个库的规则文件移植过去的,识别能力基本一致。

YAML 规则文件

DeviceDetector 的核心其实不是 PHP 代码,而是那些 YAML 规则文件。所有设备型号、浏览器特征、爬虫签名都定义在 YAML 文件里。它默认用 Spyc 解析 YAML,也支持换成 Symfony YAML 或 PECL YAML 扩展。

这意味着它的识别能力取决于规则文件的更新频率。Matomo 是一个成熟的网站分析平台,用户量大,规则文件的维护是比较持续的。

测试和质量

项目有完整的 PHPUnit 测试套件,配合 PHPStan 做静态分析,PHPCS 做代码风格检查。YAML 规则文件也有专门的校验流程,包括正则表达式验证。

从 CI 配置来看,代码质量把控比较严格。

适合什么场景

DeviceDetector 适合需要做设备识别的 Web 项目。比如:响应式页面根据设备类型返回不同内容、统计分析系统区分移动端和桌面端流量、反爬虫系统标记机器人访问、广告投放系统根据设备型号选择素材。

3500 多个 Star 不算多,但这个库已经维护了很多年,是 Matomo 这个知名分析平台的核心组件之一。稳定性和规则覆盖度都经过了大量生产环境的验证。

量、反爬虫系统标记机器人访问、广告投放系统根据设备型号选择素材。

3500 多个 Star 不算多,但这个库已经维护了很多年,是 Matomo 这个知名分析平台的核心组件之一。稳定性和规则覆盖度都经过了大量生产环境的验证。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐