在 PHP 脚本中,我想获得一个唯一的浏览器 ID,但不像用户代理 (
$_SERVER["HTTP_USER_AGENT"]
) 那样唯一,因为 UA 随着每个版本的变化而变化。我尝试删除 UA 字符串中的所有数字来避免版本依赖性,但这会产生副作用,即在省略 UA 字符串中的数字时,像 Brave(Chrome 克隆)这样的“克隆”浏览器具有与 Chrome 本身相同的用户代理。
我认为使用浏览器二进制文件(即像 /Applications/Firefox.app/Contents/Resouces/MacOS/Firefox
或 /usr/bin/firefox
)对于每个浏览器和版本都是唯一的。但我怎样才能实现这条路径(或其他唯一ID)?
编辑:问题是我想获得一个唯一的浏览器 ID,该 ID 与版本号无关,但克隆的浏览器应与原始浏览器不同。因此 Firefox 与 Waterfox 或 Chrome 与 Brave 应该有所不同,但 Firefox 132 应该返回与 Firefox 130 相同的结果。
我认为过滤 HTTP_USER_AGENT 字符串是最好的解决方案。它允许您在不捕获版本号的情况下识别浏览器。然而,缺点是,您最终可能会得到“未知”浏览器。当然,您可以存储这些信息,并找到一种过滤字符串的方法。
由于 HTTP_USER_AGENT 字符串共享通用关键字,因此过滤字符串的顺序很重要。
这是一个如何实现它的示例(我使用了 switch 语句,因为它可以更轻松地了解解决方案是如何设计的)。
<?php
$userAgent = $_SERVER['HTTP_USER_AGENT'];
switch (true) {
// Check for Samsung Internet. I think it might include 'Chrome' so check it early
case (strpos($userAgent, 'SamsungBrowser') !== false):
$browser = 'Samsung Internet';
break;
// Brave needs to be checked before Google Chrome
case (strpos($userAgent, 'Brave') !== false):
$browser = 'Brave';
break;
// Opera also includes 'Chrome'
case (strpos($userAgent, 'OPR') !== false):
$browser = 'Opera';
break;
// Microsoft Edge includes 'Chrome'
case (strpos($userAgent, 'Edg') !== false):
$browser = 'Edge';
break;
// QQ Browser also includes 'Chrome'
case (strpos($userAgent, 'QQBrowser') !== false):
$browser = 'QQ Browser';
break;
// UC Browser also includes 'Chrome'
case (strpos($userAgent, 'UCBrowser') !== false):
$browser = 'UC Browser';
break;
// Android browser
case (strpos($userAgent, 'Android')):
$browser = 'Android Browser';
break;
// Now we can check for Google Chrome
case (strpos($userAgent, 'Chrome') !== false):
$browser = 'Chrome';
break;
// Firefox is easy :)
case (strpos($userAgent, 'Firefox') !== false):
$browser = 'Firefox';
break;
// Safari must be after Chrome because Chrome includes 'Safari'
// Here a double-check that it doesn't include 'Chrome'
case (strpos($userAgent, 'Safari') !== false && strpos($userAgent, 'Chrome') === false):
$browser = 'Safari';
break;
// Unknown
default:
$browser = 'Unknown';
break;
}
echo "The browser being used is: " . $browser;
?>
此类解决方案的缺点是您可能有很多未知数。然而,这些是 https://gs.statcounter.com/ 确定的前 10 名浏览器。他们占全球市场的 98% 以上。