【问题标题】:How do I detect Chromium specifically vs. Chrome?我如何专门检测 Chromium 与 Chrome?
【发布时间】:2023-12-18 15:41:01
【问题描述】:

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

【问题讨论】:

    标签: google-chrome user-agent detection chromium


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      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 引擎中),那你为什么要发现区别呢?

      【讨论】:

      • 谢谢!我猜你的意思可能是navigator.plugins[i].name? (转移s。:p)
      • 毫无价值,这仅适用于桌面版 Chrome。
      • 很遗憾,我的 Mac 版 Chromium 39 返回“true”!
      【解决方案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;
      }
      

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

      【讨论】:

      • 这对我在 Chrome 94.0.4606.81 上不起作用。它返回 true 而它是 Chrome,而不是 Chromium!
      【解决方案4】:

      这是另一种方式,使用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。谢谢。

      【讨论】:

      • 在 2021/10 年在 Windows 7 上的 Chrome 94 上测试。它有效!
      【解决方案5】:

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

      您可以检查 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 年 10 月仍然有效。
      【解决方案6】:

      无法对 https://*.com/a/68428992/14238203Josh Answer 发表评论。

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

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

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

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

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

      【讨论】: