11

Is there a way to detect if a visitor to my site is running Chromium as opposed to Google Chrome? Even basic UA sniffing (which I know is bad practice) would suffice for my particular case, but it appears that Chromium and Chrome share the same UA string – is that correct? Is there any other way that I can differentiate between the two?

4

6 回答 6

7

新的 Chromium 版本也有 PDF 插件。
但他们也有 Chromium 插件,所以如果任何插件以“Chromium”开头,那就是 Chromium:

function isChromium()
{ 

    for (var i = 0, u="Chromium", l =u.length; i < navigator.plugins.length; i++)
    {
        if (navigator.plugins[i].name != null && navigator.plugins[i].name.substr(0, l) === u)
            return true;
    }

    return false;
}

此外,使用它来识别 Microsoft Chredge(又名 Anaheim)

function isEdg()
{ 

    for (var i = 0, u="Microsoft Edg", l =u.length; i < navigator.plugins.length; i++)
    {
        if (navigator.plugins[i].name != null && navigator.plugins[i].name.substr(0, l) === u)
            return true;
    }

    return false;
}
于 2017-10-31T15:11:42.370 回答
5

Chrome 带有内置的 PDF 阅读器,而 Chromium 没有。
您可以使用 JavaScript 检测到这一点:

function isChrome() { // Actually, isWithChromePDFReader
    for (var i=0; i<navigator.plugins.length; i++)
        if (navigator.plugins[i].name == 'Chrome PDF Viewer') return true;
    return false;
}

这种方法不是 100% 可靠的,因为用户可以将 PDF 阅读器二进制文件从 Chrome 复制到他们的 Chromium 目录,请参阅Ask Ubuntu 上的这个答案

Chromium 和 Chrome 之间几乎没有区别(当然不是在渲染或 JavaScript 引擎中),那么您为什么要发现区别呢?

于 2013-06-24T16:06:47.010 回答
3

以下是适用于 Chromium 42 及更高版本的 Paul W. 答案的变体:

function isChromium() { // Actually, isWithChromiumPDFReader
    for (var i=0; i<navigator.plugins.length; i++)
        if (navigator.plugins[i].name == 'Chromium PDF Viewer') return true;
    return false;
}

这当然只有在用户没有禁用插件的情况下才有效。

于 2016-08-28T09:23:41.603 回答
2

从 Chromium 84 开始,有一种称为 User-Agent Client Hints参考的新方法

您可以检查 userAgentData 属性是否存在并查找品牌数据。它将返回一个看起来像这样的数组。

[{
    "brand": " Not;A Brand",
    "version": "99"
}, {
    "brand": "Google Chrome",
    "version": "91"
}, {
    "brand": "Chromium",
    "version": "91"
}]

userAgentData.brands 将包含不同顺序的不同值,因此不要依赖出现在某个索引处的内容。而是检查该属性是否存在于数组中。

if (navigator.userAgentData) {
    let vendors = window.navigator.userAgentData.brands;
    if (vendors.filter(e => e.brand === 'Google Chrome').length > 0) {
        console.log('Chrome')
    } else {
        console.log('Chromium')
    }
}
于 2021-07-18T12:17:13.003 回答
2

这是另一种方式,使用SpeechSynthesis功能。

Google Chrome 浏览器提供 TTS 语音,而 Chromium 浏览器(包括 Brave)不提供。语音可以手动安装,espeak(在 linux 上)但是Google 语音都以 开头Google,而手动安装的语音则没有。据我所知,Chrome 的声音是适当的,而不是免费的。

声音的集合是一个数组,其中每个声音如下所示:

{
    voiceURI: "Google Deutsch",
    name: "Google Deutsch",
    lang: "de-DE",
    localService: false,
    default: true
}

我们只需要找到一个名字/URI 以Google 开头的...

function hasGoogleVoices() {
    return window.speechSynthesis.getVoices()
      .some(v => /^google/i.test(v.name));
}

(在 Linux 上测试 Chrome、Brave、Chromium 和 Firefox)请有人检查 Safari 和 Windows。谢谢。

于 2020-09-03T12:56:31.930 回答
0

无法评论https://stackoverflow.com/a/68428992/14238203 Josh Answer。

在最新的 Chrome 和 Chromium(2021 年 10 月)上,一些解决方案对两者都返回 true,因此我不得不找到不同的解决方案。

我采用了https://stackoverflow.com/a/63724166/14238203 Fliptopbox 代码并实施了 Josh 的回答。

const isChrome = navigator.userAgentData.brands.some((v) => /^google/i.test(v.brand));

Josh 回答的问题是,如果您在加载页面时尝试此操作,getVoices() 将返回空数组,直到加载所有声音(页面完成加载)此处的承诺解决方案 - https://stackoverflow.com/一个/59786665/14238203

对于我的用例,getVoices() 有点麻烦,所以我使用了用户代理提示解决方案。

于 2021-10-24T22:52:57.960 回答