zhuchunshu / whichbrowser-parser
PHP的用户代理嗅探库
Requires
- php: >=5.4.0
- psr/cache: ^1.0 || ^2.0 || ^3.0
Requires (Dev)
- cache/array-adapter: ^1.1
- icomefromthenet/reverse-regex: 0.0.6.3
- php-coveralls/php-coveralls: ^2.0
- phpunit/php-code-coverage: ^5.0 || ^7.0
- phpunit/phpunit: ^6.0 || ^8.0
- squizlabs/php_codesniffer: ^3.5
- symfony/yaml: ~3.4 || ~4.0
Suggests
- cache/array-adapter: Allows testing of the caching functionality
This package is auto-updated.
Last update: 2024-09-30 02:00:07 UTC
README
这是一个极其复杂且几乎完全无用的浏览器嗅探库。之所以无用,是因为你不应该使用浏览器嗅探。所以,现在就停止吧,去读一读关于特性检测的文章。我是认真的。请走开。将来你会感谢我的。
WhichBrowser/Parser-PHP
适用于服务器的WhichBrowser的PHP版本。完全兼容PHP 7.0或更高版本,包括PHP 8。
也有可用
-
WhichBrowser/Parser-JavaScript
适用于Node.js的WhichBrowser的JavaScript版本 -
WhichBrowser/Server
用PHP编写的服务器,为浏览器提供JavaScript API
关于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(PHP的标准包管理器)来安装WhichBrowser。该软件包名为whichbrowser/parser
。
composer require whichbrowser/parser
您可以通过运行一个简单的命令轻松更新WhichBrowser。
composer update whichbrowser/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
对象的type
和subtype
属性。如果存在子类型,它将连接到类型,并通过分号分隔,例如:mobile:smart
或gaming:portable
。如果子类型不适用,它只返回类型,例如:desktop
或ereader
。
isType($type [,$type [,$type [,$type]]])
如果使用单个参数,该函数返回如果参数与device
对象的type
属性匹配,则返回true
。参数可以可选地通过将子类型连接到类型并通过分号分隔来提供子类型。它可以使用多个参数,在这种情况下,如果其中一个参数匹配,则函数返回true
。如果没有参数匹配,则返回false
。
isMobile()
如果浏览器是手机、平板、电子阅读器、相机、便携式媒体播放器、手表或便携式游戏机等移动设备,则返回true
。否则返回false
。
isBrowser($name [, $comparison, $version])
用于查询浏览器对象的name
和version
属性。该函数可以包含一个基于name
的简单比较参数,或三个参数来比较name
和version
。第一个参数始终包含浏览器的名称。第二个参数是一个字符串,可以是<
、<=
、=
、=>
或>
。第三个是一个整数、浮点数或包含版本的字符串。您可以使用类似于10
、10.7
或'10.7.4'
的版本。有关版本比较的更多信息,请参阅Version
对象的is()
函数。
isEngine($name [, $comparison, $version])
用于查询引擎对象的name
和version
属性。此函数与isBrowser
完全相同。
isOs($name [, $comparison, $version])
用于查询操作系统对象的name
和version
属性。此函数与isBrowser
完全相同。
isDetected()
实际上检测到浏览器,还是我们未能检测到任何内容?
toString()
获取检测到的浏览器的人类可读表示形式,包括操作系统和设备信息。
浏览器对象
WhichBrowser\Model\Browser
类的对象用于主WhichBrowser\Parser
对象的browser
属性,并包含多个属性。如果某个属性在此情况下不适用,则将为null或undefined。
属性
name
包含浏览器名称的字符串alias
包含浏览器的替代名称的字符串version
包含有关浏览器版本信息的版本对象stock
布尔值,如果浏览器是操作系统的默认浏览器则为true,否则为falsechannel
包含分发渠道的字符串,即'Nightly'或'Next'。mode
可以包含浏览器操作模式的字符串,例如'proxy'。hidden
布尔值,如果浏览器没有名称且是操作系统的默认浏览器,则为true。family
包含有关此浏览器所属家族信息的对象using
包含有关浏览器使用的webview类型的对象
函数
isFamily($name)
此浏览器的家族是否有此名称,或浏览器本身是否有此名称。
isUsing($name)
浏览器是否使用具有提供名称的webview。
getName()
获取浏览器名称
getVersion()
获取浏览器版本
toString()
获取检测到的浏览器的人类可读表示形式
引擎对象
WhichBrowser\Model\Engine
类的对象用于主WhichBrowser\Parser
对象的engine
属性,并包含多个属性。如果某个属性在此情况下不适用,则将为null或undefined。
属性
name
包含渲染引擎名称的字符串version
包含有关渲染引擎版本信息的版本对象
函数
getName()
获取渲染引擎名称
getVersion()
获取渲染引擎版本
toString()
获取检测到的渲染引擎的人类可读表示形式
操作系统对象
WhichBrowser\Model\Os
类的对象用于主WhichBrowser\Parser
对象的os
属性,并包含多个属性。如果某个属性在此情况下不适用,则将为null或undefined。
属性
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
是"移动",则subtype
属性可以包含以下列表中的任何值
- 功能
- 智能
如果type
是"游戏",则subtype
属性可以包含以下列表中的任何值
- 控制台
- 便携式
函数
getManufacturer()
获取制造商的名称
getModel()
获取型号的名称
toString()
获取检测到的设备的可读表示形式
家族对象
用于WhichBrowser\Model\Browser
和WhichBrowser\Model\Os
对象的family
属性的WhichBrowser\Model\Family
类的对象包含多个属性。如果属性在此情况下不适用,它将是null或undefined。
属性
name
包含家族名称的字符串version
包含有关家族版本信息的版本对象
函数
getName()
获取家族的名称
getVersion()
获取家族的版本
toString()
获取家族的可读表示形式
使用对象
用于WhichBrowser\Model\Browser
对象的using
属性的WhichBrowser\Model\Using
类的对象包含多个属性。如果属性在此情况下不适用,它将是null或undefined。
属性
name
包含webview名称的字符串version
包含webview版本的版本对象
函数
getName()
获取webview的名称
getVersion()
获取webview的版本
toString()
获取webview的可读表示形式
版本对象
用于browser
、engine
和os
对象的version
属性的WhichBrowser\Model\Version
类的对象包含多个属性和函数。如果属性在此情况下不适用,它将是null或undefined。
属性
值
包含原始版本号的字符串。alias
包含版本号的别名,例如Windows的'5.1'为'XP'。昵称
包含版本号的昵称,例如OS X的'10.14'为'Mojave'。详情
包含应打印的版本号数字的整数。
函数
is($version)
或is($comparison, $version)
使用此函数可以轻松地比较两个版本。如果您只指定一个参数,该函数将返回版本是否相同。您也可以指定两个参数,在这种情况下,第一个参数包含比较运算符,例如<
、<=
、=
、=>
或>
。第二个参数是要比较的版本。您可以使用版本号如10
、10.7
或'10.7.4'
,但请注意,10
与10.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