当我查看 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","repo":"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”方式执行此操作,我可能会跌至第二个没有错误的分支。