如何检测Chromium与 chrome ?

rjzwgtxy  于 2023-06-03  发布在  Go
关注(0)|答案(7)|浏览(559)

有没有办法检测到我的网站访问者是否运行Chromium而不是Google Chrome?即使是基本的UA嗅探(我知道这是不好的做法)也足以满足我的特殊情况,但似乎Chromium和Chrome share the same UA string-这是正确的吗?有没有其他方法可以区分这两者?

6g8kf2rb

6g8kf2rb1#

注:

这不再起作用,因为现在所有基于Chrome的导航器都有所有插件
新的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(又名。阿纳海姆)

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;
}
gcmastyq

gcmastyq2#

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目录,请参阅this answer on Ask Ubuntu
Chromium和Chrome之间几乎没有区别(当然不是在渲染或JavaScript引擎上),那么为什么你想发现区别呢?

lymnna71

lymnna713#

从Chromium 84开始,有一个名为User-Agent Client Hints reference的新方法
您可以检查userAgentData属性是否存在并查找品牌数据。它将返回一个类似于下面的数组。

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

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')
    }
}
klsxnrf1

klsxnrf14#

以下是Paul W.的回答的变体,适用于Chromium版本42及以上:

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;
}

当然,这只适用于插件没有被用户禁用的情况。

iyfjxgzm

iyfjxgzm5#

这里是另一种方法,使用SpeechSynthesis功能。
Google Chrome浏览器提供TTS语音,而Chromium浏览器(包括勇敢)不。语音可以手动安装,使用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。谢谢

ds97pgxw

ds97pgxw6#

无法评论https://stackoverflow.com/a/68428992/14238203 Josh Answer。
在最新的Chrome和Chromium(2021年10月)上,一些解决方案对两者都返回true,所以我不得不找到一个不同的解决方案。
我把https://stackoverflow.com/a/63724166/14238203 fliptopbox代码和implemented乔希答案。
const isChrome = navigator.userAgentData.brands.some((v) => /^google/i.test(v.brand));
Josh answer的问题是,如果你在加载一个页面时尝试这个方法,getVoices()会返回空数组,直到所有的声音都被加载(页面完成加载)。
对于我的用例来说,getVoices()有点麻烦,所以我使用了用户代理提示解决方案。

zkure5ic

zkure5ic7#

经过搜索,这是我如何能够使它的工作。您可以使用navigator.userAgentData.brands [0].brand来获取用户浏览器所属的品牌。由于并非所有浏览器(以及较旧的Google Chrome版本)都支持此对象,因此您可能需要将其 Package 在try catch中,以防止出现未处理的异常错误。

if (userAgent.includes("Chrome")) {
  try {
    const userBrand = navigator.userAgentData.brands[0].brand;

    if (userBrand === 'Google Chrome') {
      // User is 100% using Google Chrome
    } else {
      // User is maybe using an older
      // version of Google Chrome released in 2021 without support for the 
      //userAgentData or they're using a Chromium browser
    }
  } catch (error) {
    // Since the navigator.userAgentData.brands doesn't exist
    // We need to handle the error. If it doesn't exist, the user is not using 
    //Google Chrome or once again is using an older version of Google Chrome
  }
}

相关问题