如何从PHP获取唯一的浏览器二进制路径标识?

问题描述 投票:0回答:1

在 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 相同的结果。

php path user-agent
1个回答
0
投票

我认为过滤 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% 以上。

© www.soinside.com 2019 - 2024. All rights reserved.