advicerobo / browserparser
PHP的用户代理嗅探库(兼容PHP 8的分支)
Requires
- php: >=8.1
- 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-19 13:25:59 UTC
README
此分支是必需的,因为项目似乎已被遗弃,但需要一些PHP 8.2的修复。见 => WhichBrowser#673 我们保留了相同的命名空间,因此您只需在composer.json中将nadar/parser替换为advicerobo/browserparser即可。
这是一个极其复杂且几乎完全无用的浏览器嗅探库。无用,因为您不应该使用浏览器嗅探。所以现在就停止,去读一些关于功能检测的东西。我是认真的。离开。您以后会感谢我的。
关于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的标准包管理器。该软件包名为whichbrowser/parser。
composer require advicerobo/browserparser:"dev-master"
您可以通过运行简单命令轻松更新WhichBrowser。
composer update advicerobo/browserparser:"dev-master"
您应该尽可能频繁地运行此命令。您甚至可以考虑为该目的设置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]]])
如果使用单个参数,函数返回true,如果该参数匹配device对象的type属性。参数可以可选地通过将子类型连接到类型并使用分号分隔来提供子类型。它可以使用多个参数,在这种情况下,函数返回true,如果其中一个参数匹配。如果没有参数匹配,它返回false。
isMobile()
如果浏览器是移动设备,如手机、平板、电子阅读器、相机、便携式媒体播放器、手表或便携式游戏机,则返回 true。否则返回 false。
isBrowser($name [, $comparison, $version])
用于查询 browser 对象的 name 和 version 属性。该函数可以包含一个参数进行基于 name 的简单比较,或者三个参数同时比较 name 和 version。第一个参数始终包含浏览器的名称。第二个参数是一个字符串,可以是 <、<=、=、=> 或 >。第三个是一个整数、浮点数或字符串,包含版本。您可以使用版本如 10、10.7 或 '10.7.4'。有关版本比较的更多信息,请参阅 Version 对象的 is() 函数。
isEngine($name [, $comparison, $version])
用于查询 engine 对象的 name 和 version 属性。此函数的工作方式与 isBrowser 完全相同。
isOs($name [, $comparison, $version])
用于查询 os 对象的 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属性可以包含以下列表中的任何值
- 桌面
- 移动
- 个人数字助理
- 无线电话
- 平板电脑
- 游戏
- 电子阅读器
- 媒体
- 耳机
- 手表
- 模拟器
- 电视
- 显示器
- 相机
- 打印机
- 标牌
- 白板
- 开发板
- 飞行中
- 家电
- GPS
- 汽车
- 销售点
- 机器人
- 投影仪
如果type是"移动",则subtype属性可以包含以下列表中的任何值
- 功能
- 智能
如果type是"游戏",则subtype属性可以包含以下列表中的任何值
- 控制台
- 便携式
函数
getManufacturer()
获取制造商名称
getModel()
获取型号名称
toString()
获取检测到的设备的可读表示形式
家族对象
使用WhichBrowser\Model\Family类的对象作为WhichBrowser\Model\Browser和WhichBrowser\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类的对象作为browser、engine和os对象的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