【问题标题】:How do I tell if a user is using Brave as their browser?如何判断用户是否使用 Brave 作为浏览器?
【发布时间】:2016-04-09 22:25:22
【问题描述】:

我一直在搞乱 Brave 浏览器 (https://www.brave.com/),我不知道如何确定用户是否在使用 Brave。我用一个简单的文档来输出用户代理:

<script>document.write(navigator.userAgent);</script>

我得到:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.108 Safari/537.36

这对我的情况并没有真正的帮助。有谁知道如何确定在 PHP 或 JavaScript 中使用 Brave 的人?谢谢!

【问题讨论】:

  • 我无法在 Mac 上重现此内容。 navigator.userAgent 在从brave.com 新下载的 Mac 版 Brave 的控制台中给了我:"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) brave/0.9.0 Chrome/49.0.2623.108 Brave/0.37.3 Safari/537.36"(请参阅brave/0.9.0 部分识别浏览器是勇敢的)
  • 我也无法重现这个得到基本相同的 UA 字符串。
  • udger.com/resources/ua-list - 没有给出勇敢、怪异的用户代理字符串。
  • 假装它是 chrome;为什么你需要知道它是勇敢的呢? afaik,勇敢的支持与 chrome 相同的技术。如果需要,使用特征检测,而不是浏览器嗅探。
  • 一个用例说明了为什么你想知道它是否勇敢是如果你有一个页面可以自动检测正在访问的浏览器以显示有关该浏览器的特定浏览器扩展的信息。虽然勇敢是基于 chrome 技术构建的,但目前勇敢的只有少数官方认可的扩展,安装非认可的扩展目前有点闲聊。

标签: javascript php html


【解决方案1】:

从 2020 年 4 月起,您可以使用 this detection method 获得关于用户是否使用 Brave 的布尔答案:

(navigator.brave && await navigator.brave.isBrave() || false)

【讨论】:

  • 这是正确的答案,甚至得到了一位勇敢的开发者github.com/brave/brave-browser/issues/… 的证实
  • 这会导致 Chrome 中出现“Uncaught SyntaxError: Unexpected identifier”,不太理想。
  • 有没有没有await关键字的替代品?当没有其他浏览器甚至定义navigator.brave 时,我为什么还要调用那个东西(不检查它是否可调用)。我想这部分测试就足够了,剩下的只是有问题。我的版本:!!navigator.brave
  • 这在桌面浏览器上运行良好。但是,它似乎不适用于移动设备。有人有适用于所有设备的 sn-p 吗?
【解决方案2】:

有一种方法可以检查用户是否正在使用勇敢而无需任何 api 调用。 我创建了下面的函数,如果它勇敢,则返回 false 或 True

function isBrave() {
  if (window.navigator.brave != undefined) {
    if (window.navigator.brave.isBrave.name == "isBrave") {
      return true;
    } else {
      return false;
    }
  } else {
    return false;
  }
}

document.getElementById("ans").innerHTML = isBrave();
Is this Brave? <span id="ans"></span>

【讨论】:

  • 这是一个很好的答案答案,它更快。但这不适用于 android 和其他一些使用移动应用程序的设备。
【解决方案3】:

Kohjah Breese 的解决方案无法在 Android 上检测 Brave(例如,Chrome 被检测为 Brave)。但正如他所说,“如果你在 DuckDuckGo 中搜索 [what's my user agent],他们将返回 Brave。”然后你可以使用 Duckduckgo 的 API 来判断他们的浏览器是否勇敢:

var request = new XMLHttpRequest()

request.open('GET', 'https://api.duckduckgo.com/?q=useragent&format=json', true)

request.onload = function () {
  var data = JSON.parse(this.response)
  var isBrave = data['Answer'].includes('Brave');
  if(isBrave){
    console.log( isBrave );
  }
}

request.send()

【讨论】:

【解决方案4】:

勇敢的出现在window对象中有一些不同的对象。我不确定它们在 Brave 版本中的连续性如何,但我注意到 window.navigator 对象中有两个被空白:插件和 mimeTypes。由于 Brave 旨在成为一个隐私浏览器,我认为这是一个很好的机会,这些将保持空白。所以我的检查是检查它们的长度。

请注意,您还需要先检查浏览器是否为桌面;您似乎无法检测到 Brave Mobile 浏览器;下面的代码将选择许多移动浏览器

var agent = navigator.userAgent.toLowerCase();
var isChrome = /chrome|crios/.test(agent) && ! /edge|opr\//.test(agent);
var isBrave = isChrome && window.navigator.plugins.length === 0 && window.navigator.mimeTypes.length === 0;
if(isBrave)
    console.log( isBrave );

如果您在 DuckDuckGo 中搜索 [what's my user agent],他们将返回 Brave。如果您打开附加的 JS 文件,您会发现可以检测 Brave 的精细浏览器检测。

【讨论】:

  • 我刚试过这个,isChrome 在最新的 Brave 中是 trueisBravefalse
【解决方案5】:

用户代理中的“勇敢”在 0.9 版本中被删除。

来自changelog

从用户代理 HTTP 标头中删除 Brave 以减少 指纹。

【讨论】:

  • 还有几十种方法可以检测到它。 Brave 在许多方面表现不同。任何浏览器都可以通过特征检测来检测。
  • @Bangkokian Brave 特意试图避免被检测到 - 他们认为网站能够找出您正在使用的浏览器是对隐私的侵犯。
  • @abhibeckert 没关系。我真的不在乎他们“试图”做什么或他们“认为”什么是对隐私的侵犯。勇敢是可检测和可阻止的。
  • @Bangkokian - 你能告诉我至少一种检测方法吗?已经尝试了好几天......没有任何解决方案:(
  • @mariobgr 一种方法,调用一个勇敢的资源,如果请求几乎立即失败,那么用户就在勇敢。这种方法可能有误报,所以要小心,但它作为一种快速而肮脏的方法是有效的
【解决方案6】:

2020 年。更新解决方案:

Chrome 现在为窗口对象添加了一个新键:googletag,而不是旧键:google

这是现在的工作代码:

const ua = window.navigator.userAgent.toLowerCase();
const isChrome = /chrome|crios/.test(ua) && ! /edge|opr\//.test(ua)
const isBrave = isChrome && ! window.googletag;

【讨论】:

  • 我刚刚测试了这个,这不再有效。我得到了 isChrome: true 和 isBrave: false ...
  • 这里也一样,只是测试了一下,还是不行。 isBrave 在 Chrome 上最终显示为“真”。
【解决方案7】:

Brave 有一个类Brave,在页面加载时创建并添加到导航器中作为navigator.brave。它有一个返回承诺的方法:Brave.prototype.isBrave() 使用这三个你可以创建一个勇敢的浏览器检查(像这样):

var isBrave = false;
if(window.Brave&&navigator.brave&&navigator.brave.isBrave){
    isBrave = 'probable';//or some other value, as you wish
    navigator.brave.isBrave().then(function(r){
        if(r)isBrave = true;
    });
}

【讨论】:

  • 我有点困惑为什么所有额外的代码都是必要的,当然测试navigator.brave !== undefined 就足够了,或者我错过了什么
  • 会的,但我只是在想人们会改变事物。有人可能希望你认为他们很勇敢,而实际上他们并不勇敢。或者反过来。如果您对此不担心,而大多数人不担心,那么就可以了。
【解决方案8】:

正如其他答案所指出的,Brave 没有自己的用户代理。但是,您可以很容易地对其进行指纹识别,以将其与 Google Chrome 区分开来。当前版本 0.23.19 版具有至少 40 个独特的特征,可以将其与其他浏览器区分开来。我在this article 中对此进行了更详细的介绍。然而,这是一个荒谬的解决方案。请只是ask Brave to restore their own User-Agent 字符串。

【讨论】:

  • 我有一种感觉 Brave 正在隐藏自己,因为它试图避免它内置的广告删除功能被所有执行诸如“我们注意到您正在使用广告拦截器”之类的网站所采用并且基本上强迫你的喉咙膨胀或看不到页面。我想说的是,美国开发人员不要制作这样的网站,而不是要求 Brave 恢复。或具有自动启动视频但没有退出选项的网站
【解决方案9】:

Brave 具有与 Chrome 相同的用户代理。但是 Chrome 本身向 window 对象添加了很多(目前为 1768 个)特定于 chrome 的属性。其中之一是 window.google。所以检测 Brave 非常简单(就目前而言):

const ua = window.navigator.userAgent.toLowerCase();
const isChrome = /chrome|crios/.test(ua) && ! /edge|opr\//.test(ua)
const isBrave = isChrome && ! window.google;

真勇敢,哈哈。

【讨论】:

  • 至于 2019 年 7 月,这是行不通的。 Chrome 和 Brave 都返回“isBrave: true”。 :(
【解决方案10】:

当我查看 window.google 或 window.googletag 或 window.Brave 的窗口对象时,我使用了这段代码,它们不再存在。所以我查看了 window 对象,它们已经不存在了。

const keys = Object.keys(window);

console.log(keys);

所以之前写的关于检测 Brave 的三个窗口对象不再起作用了。

我也尝试了 duckduckgo.com 方法,但根本没有提到勇敢,我从这个页面上直接获取了代码 >

https://api.duckduckgo.com/?q=useragent&format=json

并尝试了 AJAX 并将其粘贴到浏览器地址栏中,但它不返回 Brave 它返回(我现在在 Brave 中)这个 >

{"Abstract":"","AbstractSource":"Wikipedia","AbstractText":"","AbstractURL":"https://en.wikipedia.org/wiki/UserAgent","Answer": "你的用户代理:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36","AnswerType":"useragent","Definition":"" ,"DefinitionSource":"","DefinitionURL":"","Entity":"","Heading":"UserAgent","Image":"","ImageHeight":0,"ImageIsLogo":0," ImageWidth":0,"Infobox":"","Redirect":"","RelatedTopics":[],"Results":[],"Type":"E","meta":{"attribution": null,"blockgroup":null,"created_date":null,"description":"Wikipedia","designer":null,"dev_date":null,"dev_milestone":"live","developer":[{"name ":"DDG 团队","type":"ddg","url":"http://www.duckduckhack.com"}],"example_query":"nikola tesla","id":"wikipedia_fathead", "is_stackexchange":null,"js_callback_name":"wikipedia","live_date":null,"maintainer":{"github":"duckduckgo"},"name":"Wikipedia","perl_module":"DDG:: Fathead::Wikipedia","producer":null,"production_state":"onl ine","re​​po":"fathead","signal_from":"wikipedia_fathead","src_domain":"en.wikipedia.org","src_id":1,"src_name":"Wikipedia","src_options":{ "目录":"","is_fanon":0,"is_mediawiki":1,"is_wikipedia":1,"language":"en","min_abstract_length":"20","skip_abstract":0,"skip_abstract_paren" :0,"skip_end":"0","skip_icon":0,"skip_image_name":0,"skip_qr":"","source_skip":"","src_info":""},"src_url":null ,"status":"live","tab":"关于","topic":["productivity"],"unsafe":0}}

所以这不起作用,其他进行浏览器嗅探的网站不会仅显示 Chrome 或 Netscape 的 Brave,例如粘贴该用户代理:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36

进入本网站的盒子>>

https://webbrowsertools.com/useragent/?method=normal&verbose=false

并且有 3 种检测方法,navigator 对象,以及两个不同的 JavaScript 文件 platform.js 和 ua-parser.js。他们都没有勇敢。

此页面也没有> https://www.iplocation.net/(它使用请求标头来获取用户代理) 或 > https://whichbrowser.net/(据说使用了一种复杂的方法来检测您正在使用的真实浏览器,但只显示 Chrome)

我尝试了许多其他站点,例如那些请求标头或导航器对象都没有工作的站点。

此外,当我测试插件或 mimetypes 时,我会得到一个插件列表,如果我想要它们,我还会得到一个长度为 2 的 MimeTypes 及其详细信息,这样该方法也不再起作用了。

因此我使用了来自> http://blog.strictly-software.com/2022/01/testing-for-brave-browser.html的这个函数

我知道通过扩展和注入代码,我们可以轻松地将属性添加到窗口或导航器对象,如果我们不能,那么用户代理切换器将不存在。

这个函数似乎试图通过未来证明 a) 希望有一天 Brave 能像以前一样拥有自己的用户代理,不久前我记得在用户代理字符串中看到过 Brave。 b) 同样希望像一个答案所说的那样,Brave 属性将返回给窗口对象,例如 window.Brave,因为它不再存在。

它首先检查 Window 对象上的 Mozilla 特定属性以排除该属性,然后对 Brave 进行一些积极的测试并使用各种回退。

由于除 FireFox 之外的大多数现代浏览器现在都基于 Chromium、Chrome、Edge、Brave、Opera,因此它排除了用户代理正则表达式测试作为最后手段的那些。但是,前两个分支应该检测它是否勇敢。

由于某种原因,即使当我在代码部分中发布时在我的页面中完美缩进,它仍然缺少顶行和底行,所以这就是函数和结尾 } 没有正确缩进的原因

function IsBrave(ua){

var isBrave = false;

// user-agent may or may not be passed in if not get current navigator agent
ua = (ua === null || ua === undefined) ? ua = window.navigator.userAgent : ua;

ua = ua.toLowerCase();

// make sure not it's not Mozilla by looking for a Moz specific property on the window object
if("mozInnerScreenX" in window){        
    return isBrave;
}else{
    // everything in JavaScript is over writable we could do this to pass the next test 
    // but then where would we stop as every object even window/navigator can be overwritten or changed...?
    // window.chrome="mozilla";
    // window.webkitStorageInfo = "mozilla";

    // make sure its chrome and webkit
    if("chrome" in window && "webkitStorageInfo" in window){
        // it looks like Chrome and has webkit
        if("brave" in navigator && "isBrave" in navigator.brave){
            isBrave = true;
        // test for Brave another way the way the framwwork Prototype checks for it
        }else if(Object.prototype.toString.call(navigator.brave) == '[object Brave]'){
            isBrave = true;         
        // have they put brave back in window object like they used to
        }else if("Brave" in window){
            isBrave = true;         
        // hope one day they put brave into the user-agent
        }else if(ua.indexOf("brave") > -1){
            isBrave = true;
        // make sure there is no mention of Opera or Edge in UA
        }else if(/chrome|crios/.test(ua) && /edge?|opera|opr\//.test(ua) && !navigator.brave){
            isBrave = false;            
        }
    }

    return isBrave;

}

当然,它并不完美,但它对我有用,如果你不希望所有的后备和面向未来,该网站也有一个单行。

var w=window,n=w.navigator; // shorten key objects
let isBrave = !("mozInnerScreenX" in w) && ("chrome" in w && "webkitStorageInfo" in w && "brave" in n && "isBrave" in n.brave) ? true : false;

我对其进行了更新,以便对 Brave 的第二次测试是原型测试,因为我正在做的另一种方式只是以不同的方式重复第一次。此外,如果对象不存在,我正在测试跌倒,将 navigator.brave.IsBrave() 更改为 IsBraver() 会导致错误,但以 navigator.brave 的“isBraver”方式执行此操作,我可能会跌至第二个没有错误的分支。

【讨论】:

    猜你喜欢
    • 2011-06-01
    • 2013-02-09
    • 2016-12-05
    • 2011-01-01
    • 2013-03-31
    • 2010-09-09
    • 1970-01-01
    • 2012-04-28
    相关资源
    最近更新 更多