buzz/which-browser-parser

PHP 用户代理嗅探库

v2.1.9 2023-10-23 18:14 UTC

This package is auto-updated.

Last update: 2024-08-23 20:09:19 UTC


README

这个分支是为了继续 WhichBrowserParser 的辉煌

这是一个极其复杂且几乎完全无用的浏览器嗅探库。之所以无用,是因为你不应该使用浏览器嗅探。所以,现在就停止吧,去读一些关于特性检测的内容。我是认真的。走开。你以后会感谢我的。

thinhbuzz/Parser-PHP

WhichBrowser 的 PHP 版本,用于服务器端。完全兼容 PHP 7.0 或更高版本,包括 PHP 8。

Build Coverage Status License Latest Stable Version

关于 WhichBrowser

但为什么是几乎完全无用而不是完全没有用? 嗯,规则总有例外。进行浏览器嗅探有合理的原因:提高用户体验或收集有关你网站上使用哪些浏览器的情报。我的网站是 html5test.com,我想知道哪些分数属于哪个浏览器。为此,你需要一个浏览器嗅探库。

为什么它如此复杂?
因为每个人都在说谎。说实话,没有哪个浏览器是完全诚实的。几乎所有的浏览器都说自己是 Netscape 5,而几乎所有的 WebKit 浏览器都说自己是基于 Gecko。甚至现在的 Internet Explorer 11也不再声称自己是 IE,而是一个类似 Gecko 的未命名浏览器。而且情况变得更糟。这就是为什么它很复杂。

它提供哪些信息? 你会得到一个包含浏览器、渲染引擎、操作系统和设备信息的好对象。它提供了名称、版本,甚至是设备制造商和型号。WhichBrowser 非常顽强。它提供的信息是其他人没有的。例如

JUC (Linux; U; 2.3.6; zh-cn; GT-I8150; 480*800) UCWEB8.7.4.225/145/800  
UC Browser 8.7 on a Samsung Galaxy W running Android 2.3.6

Android 从未提及

Mozilla/5.0 (Series40; Nokia501/10.0.2; Profile/MIDP-2.1 Configuration/CLDC-1.1) Gecko/20100401 S40OviBrowser/3.0.0.0.73  
Nokia Xpress 3.0.0 on a Nokia Asha 501 running Nokia Asha Platform

尽管用户代理头部声称为 Series40 设备,但我们知道它实际上运行的是 Asha 平台,我们还知道 OviBrowser 已更名为 Nokia Xpress。

Opera/9.80 (X11; Linux zvav; U; zh) Presto/2.8.119 Version/11.10  
Opera Mini on a Nokia 5230 running Series60 5.0

用户代理头部看起来像 Linux 上的 Opera 11.10,但我们知道它是 Opera Mini。我们甚至可以从其他头部中确定真实的操作系统和设备型号。

要求

WhichBrowser 需要 PHP 7.0 或更高版本,并支持 PHP 8。WhichBrowser 兼容 PSR-4 自动加载标准,并遵循 PSR-1 和 PSR-2 编码风格。

如何安装它

你可以通过 Composer 安装 WhichBrowser,这是 PHP 的标准包管理器。该包名为 buzz/which-browser-parser

composer require buzz/which-browser-parser

你可以通过运行简单的命令轻松更新 WhichBrowser。

composer update buzz/which-browser-parser

你应该尽可能经常运行此命令。你可能甚至想考虑为此设置一个 cron 作业。

如何使用它

第一步需要 Composer 自动加载器

<?php

    require 'vendor/autoload.php';

第二步是创建一个新的 WhichBrowser\Parser 对象。该对象将包含库能找到的关于浏览器的所有信息。该对象有一个必需的参数,即浏览器发送的头部信息,或用户代理字符串。使用头部信息是首选的,因为它将允许更好的检测,但如果您只有用户代理字符串,这也将有效。

例如

$result = new WhichBrowser\Parser(getallheaders());

$result = new WhichBrowser\Parser($_SERVER['HTTP_USER_AGENT']);

变量 $result 现在包含了一个对象,您可以对其进行查询以获取信息。有各种方式访问这些信息。

首先,您可以调用 toString() 函数以获取可读性强的标识

"You are using " . $result->toString();
// You are using Chrome 27 on OS X Mountain Lion 10.8

另一种可能性是查询对象

$result->isType('desktop');
// true

$result->isType('mobile', 'tablet', 'media', 'gaming:portable');
// false

$result->isBrowser('Maxthon', '<', '4.0.5');
// false

$result->isOs('iOS', '>=', '8');
// false

$result->isOs('OS X');
// true

$result->isEngine('Blink');
// true

您也可以直接访问这些属性

$result->browser->toString();
// Chrome 27  

$result->engine->toString();
// Blink

$result->os->toString();
// OS X Mountain Lion 10.8

或直接访问这些属性的某些部分

$result->browser->name;
// Chrome

$result->browser->name . ' ' . $result->browser->version->toString();
// Chrome 27

$result->browser->version->value;
// 27.0.1453.110

$result->engine->name;
// Blink

最后,您也可以直接查询版本

$result->browser->version->is('>', 26);
// true

$result->os->version->is('<', '10.7.4');
// false

选项

在创建Parser对象时,可以通过将数组作为第二个参数传递来设置额外的选项。

禁用机器人检测

在某些情况下,您可能希望禁用机器人检测。这允许机器人故意欺骗WhichBrowser,以便您可以获取机器人试图模仿的用户代理身份。当您想使用WhichBrowser在您的网站的不同变体之间切换,并确保爬虫看到正确的网站变体时,这特别有用。例如,模拟移动设备的机器人将看到您网站的移动版。

$result = new WhichBrowser\Parser(getallheaders(), [ 'detectBots' => false ]);

启用结果缓存

WhichBrowser支持PSR-6兼容的缓存适配器,用于在请求之间缓存结果。使用缓存特别有用,如果您在网站的每个页面上都使用WhichBrowser,并且用户访问多个页面。在第一次访问期间,将解析标头并将结果缓存。在后续访问中,将使用缓存的结果,这比再次解析标头要快得多。

其他类型的缓存(如APC、Doctrine、Memcached、MongoDB、Redis等)也有可用适配器。这些适配器的配置各不相同,但一旦配置完成,您只需在创建Parser对象时将其作为选项传递,或者使用setCache()函数之后设置它。WhichBrowser已测试可与PHP Cache提供的适配器一起工作。有关提供适配器的其他软件包列表,请参阅Packagist

例如,如果您想启用基于memcached的缓存,您需要安装额外的composer软件包

composer require cache/memcached-adapter

并将对WhichBrowser/Parser的调用更改为以下内容

$client = new \Memcached();
$client->addServer('localhost', 11211);

$pool = new \Cache\Adapter\Memcached\MemcachedCachePool($client);

$result = new WhichBrowser\Parser(getallheaders(), [ 'cache' => $pool ]);

$client = new \Memcached();
$client->addServer('localhost', 11211);

$pool = new \Cache\Adapter\Memcached\MemcachedCachePool($client);

$result = new WhichBrowser\Parser();
$result->setCache($pool);
$result->analyse(getallheaders());

您还可以指定缓存结果应在多少秒后被丢弃。默认值为900秒或15分钟。如果您认为WhichBrowser在缓存中使用的内存过多,应降低此值。您可以通过设置cacheExpires选项或将它作为setCache()函数的第二个参数传递来实现。

API参考

解析器对象

创建一个新的WhichBrowser\Parser对象后,它包含许多属性和函数。所有这些属性都是保证存在的。

属性

  • browser
    一个包含有关浏览器本身信息的对象
  • engine
    一个包含有关渲染引擎信息的对象
  • os
    一个包含有关操作系统信息的对象
  • device
    一个包含有关设备信息的对象

函数

getType()
返回device对象的typesubtype属性。如果存在子类型,它将连接到类型,并用分号分隔,例如:mobile:smartgaming:portable。如果子类型不适用,它只返回类型,例如:desktopereader

isType($type [,$type [,$type [,$type]]])
如果使用单个参数,该函数返回true如果参数与device对象的type属性匹配。参数可以可选地通过将子类型连接到类型并用分号分隔来提供子类型。它可以使用多个参数,在这种情况下,函数返回true如果其中一个参数匹配。如果没有参数匹配,它返回false

isMobile()
如果浏览器是手机、平板电脑、电子阅读器、相机、便携式媒体播放器、手表或便携式游戏机等移动设备,则返回true。否则返回false

isBrowser($name [, $comparison, $version])
用于查询浏览器对象的 nameversion 属性。该函数可以包含一个参数,用于基于 name 进行简单比较,或者包含三个参数,用于同时比较 nameversion。第一个参数始终包含浏览器的名称。第二个参数是一个字符串,可以是 <<===>> 之一。第三个参数是一个整数、浮点数或字符串,包含版本信息。您可以使用版本号如 1010.7'10.7.4'。有关版本比较的更多信息,请参阅 Version 对象的 is() 函数。

isEngine($name [, $comparison, $version])
用于查询 engine 对象的 nameversion 属性。该函数与 isBrowser 完全相同。

isOs($name [, $comparison, $version])
用于查询 os 对象的 nameversion 属性。该函数与 isBrowser 完全相同。

isDetected()
实际上检测到了浏览器,还是我们没有检测到任何内容?

toString()
获取检测到的浏览器的人类可读表示,包括操作系统和设备信息。

浏览器对象

WhichBrowser\Model\Browser 类的对象用于主 WhichBrowser\Parser 对象的 browser 属性,并包含多个属性。如果某个属性在此情况下不适用,则将为 null 或未定义。

属性

  • name
    包含浏览器名称的字符串
  • alias
    包含浏览器替代名称的字符串
  • version
    包含浏览器版本信息的版本对象
  • stock
    布尔值,如果浏览器是操作系统的默认浏览器,则为 true,否则为 false
  • channel
    包含发行渠道的字符串,例如 'Nightly' 或 'Next'。
  • mode
    可以包含浏览器操作模式的字符串,例如 'proxy'。
  • hidden
    布尔值,如果浏览器没有名称且是操作系统的默认浏览器,则为 true。
  • family
    包含有关浏览器属于哪个家族信息的对象
  • using
    包含有关浏览器使用哪种类型的 webview 信息的对象

函数

isFamily($name)
该浏览器的家族是否有此名称,或者浏览器本身是否有此名称。

isUsing($name)
浏览器是否使用具有提供的名称的 webview。

getName()
获取浏览器名称

getVersion()
获取浏览器版本

toString()
获取检测到的浏览器的人类可读表示

引擎对象

WhichBrowser\Model\Engine 类的对象用于主 WhichBrowser\Parser 对象的 engine 属性,并包含多个属性。如果某个属性在此情况下不适用,则将为 null 或未定义。

属性

  • name
    包含渲染引擎名称的字符串
  • version
    包含有关渲染引擎版本信息的版本对象

函数

getName()
获取渲染引擎名称

getVersion()
获取渲染引擎版本

toString()
获取检测到的渲染引擎的人类可读表示

操作系统对象

WhichBrowser\Model\Os 类的对象用于主 WhichBrowser\Parser 对象的 os 属性,并包含多个属性。如果某个属性在此情况下不适用,则将为 null 或未定义。

属性

  • name
    包含操作系统名称的字符串
  • version
    包含有关操作系统版本信息的版本对象
  • family
    一个包含操作系统所属家族信息的对象

函数

isFamily($name)
这个操作系统的家族是否有这个名字,或者操作系统本身有这个名字。

getName()
获取操作系统的名字

getVersion()
获取操作系统的版本

toString()
获取检测到的操作系统的可读表示形式

设备对象

使用 WhichBrowser\Model\Device 类的对象用于 WhichBrowser\Parser 主对象的 device 属性,并包含多个属性。如果某个属性在这种情况下不适用,它将为 null 或 undefined。

属性

  • 类型
    包含浏览器类型的字符串。
  • 子类型
    包含浏览器子类型的字符串。
  • 已识别
    一个布尔值,如果设备已被正面识别则为 true。
  • 制造商
    包含设备制造商的字符串,例如 'Apple' 或 'Samsung'。
  • 型号
    包含设备型号的字符串,例如 'iPhone' 或 'Galaxy S4'。

type 属性可以包含以下列表中的任何值

  • 桌面
  • 移动
  • 个人数字助理 (PDA)
  • 数字增强通讯 (DECT)
  • 平板电脑
  • 游戏
  • 电子阅读器
  • 媒体
  • 耳机
  • 手表
  • 模拟器
  • 电视
  • 显示器
  • 相机
  • 打印机
  • 标识
  • 白板
  • 开发板
  • 飞行
  • 家电
  • GPS
  • 汽车
  • 销售点 (POS)
  • 机器人
  • 投影仪

如果 type 是 "mobile",则 subtype 属性可以包含以下列表中的任何值

  • 功能
  • 智能

如果 type 是 "gaming",则 subtype 属性可以包含以下列表中的任何值

  • 游戏机
  • 便携式

函数

getManufacturer()
获取制造商的名字

getModel()
获取型号的名字

toString()
获取检测到的设备的可读表示形式

家族对象

使用 WhichBrowser\Model\Family 类的对象用于 WhichBrowser\Model\BrowserWhichBrowser\Model\Os 对象的 family 属性,并包含多个属性。如果某个属性在这种情况下不适用,它将为 null 或 undefined。

属性

  • name
    包含家族名字的字符串
  • version
    包含家族版本信息的版本对象

函数

getName()
获取家族的名字

getVersion()
获取家族的版本

toString()
获取家族的可读表示形式

使用对象

使用 WhichBrowser\Model\Using 类的对象用于 WhichBrowser\Model\Browser 对象的 using 属性,并包含多个属性。如果某个属性在这种情况下不适用,它将为 null 或 undefined。

属性

  • name
    包含 webview 名字的字符串
  • version
    包含 webview 版本信息的版本对象

函数

getName()
获取 webview 的名字

getVersion()
获取 webview 的版本

toString()
获取 webview 的可读表示形式

版本对象

使用 WhichBrowser\Model\Version 类的对象用于 browserengineos 对象的 version 属性,并包含多个属性和函数。如果某个属性在这种情况下不适用,它将为 null 或 undefined。

属性


  • 包含原始版本号的字符串。
  • alias
    包含版本号别名的字符串,例如 Windows 的 '5.1' 对应 'XP'。
  • 昵称
    包含版本号昵称的字符串,例如 OS X 的 '10.14' 对应 'Mojave'。
  • 详细信息
    包含应打印的版本号数字的整数。

函数

is($version)is($comparison, $version)
使用此函数可以轻松比较两个版本。如果您只指定一个参数,此函数将返回两个版本是否相同。您还可以指定两个参数,在这种情况下,第一个参数包含比较运算符,例如 <<===>>。第二个参数是要比较的版本。您可以使用类似 1010.7'10.7.4' 的版本,但请注意,1010.0 不同。例如,如果我们的操作系统版本是 10.7.4

$result->os->version->is('10.7.4');
// true

$result->os->version->is('10.7');
// true

$result->os->version->is('10');
// true

$result->os->version->is('10.0');
// false

$result->os->version->is('>', '10');
// false

$result->os->version->is('>', '10.7');
// false

$result->os->version->is('>', '10.7.3');
// true