intelogie / parser
PHP的用户代理嗅探库
Requires
- php: >=5.4.0
- psr/cache: ^1.0
Requires (Dev)
- cache/array-adapter: ^0.3.0
- icomefromthenet/reverse-regex: dev-master
- league/csv: ^8.0
- phpunit/php-code-coverage: ^2.2|^3.0
- phpunit/phpunit: ^4.0
- satooshi/php-coveralls: ^0.6.1
- squizlabs/php_codesniffer: 2.5.*
- symfony/yaml: ^2.7
README
这是一个极其复杂且几乎完全无用的浏览器嗅探库,是用PHP编写的。之所以无用,是因为你不应该使用浏览器嗅探。所以,马上停止,去读一读有关功能检测的内容。我是认真的。走开。将来你会感谢我的。
如果你正在寻找WhichBrowser的JavaScript API,请访问WhichBrowser/Server项目。
但为什么是“几乎完全无用”而不是“完全无用”?
嗯,总有例外。进行浏览器嗅探有合理的原因:为了提升用户体验或收集有关网站上使用的浏览器的情报。我的网站是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 5.4或更高版本,并支持PHP 7和HHVM。WhichBrowser与PSR-4自动加载标准兼容,并遵循PSR-1和PSR-2编码风格。
如何安装
您可以使用Composer安装WhichBrowser - PHP的标准包管理器。该包的名称为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 参考
Parser 对象
创建一个新的 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])
用于查询浏览器对象的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
一个布尔值,如果浏览器没有名称且是操作系统的默认浏览器则为truefamily
包含有关该浏览器属于哪个家族的信息的对象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。
属性
类型
包含浏览器类型的字符串。子类型
包含浏览器子类型的字符串。已识别
一个布尔值,如果设备已被积极识别则为真。制造商
包含设备制造商的字符串,例如 'Apple' 或 'Samsung'。型号
包含设备型号的字符串,例如 'iPhone' 或 'Galaxy S4'。
type
属性可以包含以下列表中的任何值
- 桌面
- 移动
- 平板
- 游戏
- 耳机
- 电子阅读器
- 媒体
- 模拟器
- 电视
- 显示器
- 相机
- 标识
- 白板
- 汽车
- pos
- 机器人
如果 type
为 "mobile",则 subtype
属性可以包含以下列表中的任何值
- 功能
- 智能
如果 type
为 "gaming",则 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'。详细信息
包含应打印的版本号数字的整数。
函数
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