这是一个极其复杂且几乎完全无用的浏览器嗅探库。无用,因为您不应该使用浏览器嗅探。所以现在就停下来,去阅读一些有关特征检测的内容。我是认真的。离开。以后你会感谢我的。
用于服务器上的 WhichBrowser 的 PHP 版本。与 PHP 7.0 或更高版本完全兼容,包括 PHP 8。
还提供:
哪个浏览器/解析器-JavaScript
与服务器上的 Node.js 一起使用的 WhichBrowser 的 JavaScript 版本
哪个浏览器/服务器
用 PHP 编写的服务器,提供 JavaScript API 以供在浏览器中使用
但为什么几乎完全没用又不是完全没用呢?嗯,规则总有例外。进行浏览器嗅探是有充分理由的:改善用户体验或收集有关您网站上使用的浏览器的情报。我的网站是 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
尽管 useragent 标头声称是 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
useragent 标头看起来像 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 ' ;
第二步是创建一个新的WhichBrowserParser
对象。该对象将包含库可以找到的有关浏览器的所有信息。该对象有一个必需的参数,可以是浏览器发送的标头,也可以是用户代理字符串。使用标头更好,因为它可以更好地进行检测,但如果您只有 useragent 字符串,这也可以工作。
例如:
$ 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,这样您就可以获取机器人试图模仿的 useragent 的身份。当您想要使用 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()
函数来完成此操作。
创建新的WhichBrowserParser
对象后,它包含许多属性和函数。所有这些属性都保证存在。
特性:
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])
用于查询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()
获取检测到的浏览器的人类可读表示,包括操作系统和设备信息。
WhichBrowserModelBrowser
类的对象用于主WhichBrowserParser
对象的browser
属性,并包含许多属性。如果某个属性在这种情况下不适用,它将为 null 或未定义。
特性:
name
alias
version
stock
channel
mode
hidden
family
using
功能:
isFamily($name)
这个浏览器家族有这个名字吗,或者浏览器本身有这个名字吗?
isUsing($name)
浏览器是否使用带有提供名称的 webview。
getName()
获取浏览器的名称
getVersion()
获取浏览器版本
toString()
获取检测到的浏览器的人类可读表示
WhichBrowserModelEngine
类的对象用于主WhichBrowserParser
对象的engine
属性,并包含许多属性。如果某个属性在这种情况下不适用,它将为 null 或未定义。
特性:
name
version
功能:
getName()
获取渲染引擎的名称
getVersion()
获取渲染引擎的版本
toString()
获取检测到的渲染引擎的人类可读表示
WhichBrowserModelOs
类的对象用于主WhichBrowserParser
对象的os
属性,并包含许多属性。如果某个属性在这种情况下不适用,它将为 null 或未定义。
特性:
name
version
family
功能:
isFamily($name)
该操作系统的家族是否具有此名称,或者操作系统本身是否具有此名称。
getName()
获取操作系统的名称
getVersion()
获取操作系统的版本
toString()
获取检测到的操作系统的人类可读表示
WhichBrowserModelDevice
类的对象用于主WhichBrowserParser
对象的device
属性,并包含许多属性。如果某个属性在这种情况下不适用,它将为 null 或未定义。
特性:
type
subtype
identified
manufacturer
model
type
属性可以包含以下列表中的任何值:
如果type
为“mobile”,则subtype
属性可以包含以下列表中的任何值:
如果type
是“游戏”, subtype
属性可以包含以下列表中的任何值:
功能:
getManufacturer()
获取制造商名称
getModel()
获取模型名称
toString()
获取检测到的设备的人类可读表示
WhichBrowserModelFamily
类的对象用于WhichBrowserModelBrowser
和WhichBrowserModelOs
对象的family
属性,并包含许多属性。如果属性在这种情况下不适用,它将为 null 或未定义。
特性:
name
version
功能:
getName()
获取家人的姓名
getVersion()
获取家庭版本
toString()
获取家庭的人类可读表示
WhichBrowserModelUsing
类的对象用于WhichBrowserModelBrowser
对象的using
属性,并包含许多属性。如果属性在这种情况下不适用,它将为 null 或未定义。
特性:
name
version
功能:
getName()
获取网络视图的名称
getVersion()
获取webview的版本
toString()
获取网络视图的人类可读表示
WhichBrowserModelVersion
类的对象用于browser
、 engine
和os
对象的version
属性,并包含许多属性和函数。如果属性在这种情况下不适用,它将为 null 或未定义。
特性:
value
alias
nickname
details
功能:
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