Как мне узнать, использует ли пользователь Brave в качестве браузера?

Я возился с браузером 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, как Gecko) Chrome/49.0.2623.108 Safari/537.36

что не очень помогает мне в моей ситуации. Кто-нибудь знает, как определить, кто использует Brave в PHP или JavaScript? Спасибо!

11 ответов

Решение

"Храбрый" в пользовательском агенте был удален в версии 0.9.

Из журнала изменений:

Удален Brave из HTTP-заголовка User Agent, чтобы уменьшить количество отпечатков пальцев.

По состоянию на апрель 2020 года вы можете использовать этот метод обнаружения, чтобы получить логический ответ о том, использует ли пользователь Brave или нет:

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

Есть способ проверить, использует ли пользователь brave без каких-либо вызовов api. Я создал функцию ниже, которая возвращает false или True, если ее Brave

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>

Решение Kohjah Breese не работает для обнаружения Brave на Android (например, Chrome определяется как Brave). Но, как он сказал: "Если вы будете искать в DuckDuckGo [какой у меня агент пользователя], они вернут Brave". Затем вы можете использовать API Duckduckgo, чтобы узнать, является ли ваш браузер Brave:

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()

Храбрый появляется, имеет несколько различных объектов в объекте окна. Я не уверен, насколько они смежные в разных версиях Brave, но я заметил два в объекте window.navigator, которые не отображаются: плагины и mimeTypes. Так как Brave предназначен для использования в качестве браузера конфиденциальности, я думаю, что это хороший шанс, что они останутся пустыми. Так что я проверю, чтобы проверить их длину.

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 [что такое мой пользовательский агент], они вернут Brave. Если вы откроете вложенные файлы JS, вы обнаружите сложное обнаружение браузера, которое может обнаружить Brave.

У Brave такой же пользовательский агент, как и у Chrome. Но сам Chrome добавляет множество (на данный момент 1768) специфичных для Chrome свойств к объекту окна. Одним из них является window.google. Так что обнаружить Храброго довольно просто (на данный момент):

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

Так смело, лол.

У храброго нет собственного User-Agent, как указано в других ответах. Тем не менее, вы можете легко идентифицировать его, чтобы отличить его от Google Chrome. Текущий выпуск, версия 0.23.19, имеет как минимум 40 уникальных характеристик, которые отличают его от других браузеров. Я более подробно расскажу об этом в этой статье. Однако это нелепое решение. Пожалуйста, просто попросите Brave восстановить собственную строку User-Agent.

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;

У храбрости есть класс 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;
    });
}

Следуя некоторым комментариям, достаточно проверить,window.braveопределено. Смотрите этот комментарий .

Я использую этот фрагмент кода, как когда я искал в объекте окна для window.google или window.googletag или window.Brave их больше не было. Итак, я посмотрел в окно объекта, и они больше не существовали.

константные ключи = Object.keys(окно);

console.log(ключи);

Таким образом, три оконных объекта, о которых было написано для обнаружения Brave, больше не работают.

Я также попробовал метод duckduckgo.com, но в нем вообще не упоминается храбрость. Я буквально взял код с этой страницы >

https://api.duckduckgo.com/?q=useragent&amp;amp;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, например Gecko) Chrome/97.0.4692.99 Safari/537.36","AnswerType":"useragent","Definition":"","DefinitionSource ":"","DefinitionURL":"","Сущность":"","Заголовок":"UserAgent","Изображение":"","ImageHeight":0,"ImageIsLogo":0,"ImageWidth": 0,"Информационное окно":"","Перенаправление":"","RelatedTopics":[],"Результаты":[],"Тип":"E","meta":{"атрибуция":null,"blockgroup":null,"created_date":null,"description":"Wikipedia","designer":null,"dev_date":null,"dev_milestone":"live" ,"разработчик":[{"имя":"Команда DDG","тип":"ddg","url":"http://www.duckduckhack.com"}],"example_query":"никола тесла" ,"id":"wikipedia_fathead","is_stackexchange":null,"js_callback_name":"wikipedia","live_date":null,"maintainer":{"github":"duckduckgo"},"name":"Wikipedia" ,"perl_module":"DDG::Fathead::Wikipedia","производитель":null,"production_state":"онлайн","repo":"fathead","signal_from":"wikipedia_fathead","src_domain":"en.wikipedia.org","src_id":1,"src_name":"Википедия","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,"статус" :"live","tab":"О нас","тема":["производительность"],"небезопасно":0}}fathead","signal_from":"wikipedia_fathead","src_domain":"en.wikipedia.org","src_id":1,"src_name":"Википедия","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":["производительность"],"небезопасно":0}}fathead","signal_from":"wikipedia_fathead","src_domain":"en.wikipedia.org","src_id":1,"src_name":"Википедия","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":["производительность"],"небезопасно":0}}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":"О программе" ,"тема":["производительность"],"небезопасно":0}}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":"О программе" ,"тема":["производительность"],"небезопасно":0}}src_id":1,"src_name":"Википедия","src_options":{"каталог":"","is_fanon":0,"is_mediawiki":1,"is_wikipedia":1,"язык":"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":"About","topic":["productivity"],"unsafe":0 }}src_id":1,"src_name":"Википедия","src_options":{"каталог":"","is_fanon":0,"is_mediawiki":1,"is_wikipedia":1,"язык":"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":"About","topic":["productivity"],"unsafe":0 }}"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":"About","topic ":["производительность"],"небезопасно":0}}"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":"About","topic ":["производительность"],"небезопасно":0}}"src_info":""},"src_url":null,"status":"live","tab":"About","topic":["productivity"],"unsafe":0}}"src_info":""},"src_url":null,"status":"live","tab":"About","topic":["productivity"],"unsafe":0}}

Так что это не сработало, и другие сайты, которые анализируют браузер, не показывают Brave ни только Chrome, ни Netscape, например, вставьте этот пользовательский агент:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, например Gecko) Chrome/97.0.4692.99 Safari/537.36

в коробку на этом сайте >>

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

и есть 3 метода обнаружения, объект навигатора и два разных файла JavaScript platform.js и ua-parser.js. Никто из них не получает Brave.

Эта страница также не > https://www.iplocation.net/ (которая использует заголовки запроса для получения пользовательского агента) или > https://whatbrowser.net/ (которая предположительно использует сложный метод для определения реального браузера, который вы используете). используют, но просто показывает Chrome)

Я пробовал много других сайтов, таких как заголовки запроса или объект Navigator, и ни один из них не работал.

Кроме того, когда я тестирую плагины ИЛИ MIME-типы, я получаю список плагинов, а также получаю длину 2 для MimeTypes и их детали, если я хочу, чтобы этот метод больше не работал.

Поэтому я использовал эту функцию из > http://blog.strictly-software.com/2022/01/testing-for-brave-browser.html.

Я знаю, что с помощью расширений и встроенного кода мы могли бы легко добавлять свойства к окну или объекту навигатора, если бы мы не могли, то переключатели агента пользователя не существовали бы.

Эта функция, кажется, пытается доказать будущее, а) надеясь, что однажды у Brave будет свой собственный пользовательский агент, как раньше, не так давно я помню, как видел Brave в строке пользовательского агента. б) Также, надеясь, что один ответ сказал, что свойство Brave будет возвращено объекту окна, например, window.Brave, поскольку его больше нет.

Сначала он проверяет наличие определенного свойства Mozilla в объекте Window, чтобы исключить его, прежде чем выполнять некоторые положительные тесты для 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;

Я обновил его, чтобы 2-й тест для Brave был тестом прототипа, а другой способ, который я делал, был просто повторением 1-го в другом порядке. Также я тестировал провал, если объекты не существовали, и изменение navigator.brave.IsBrave() на IsBraver() вызывало ошибку, но делая это с помощью «isBraver» в navigator.brave, я мог провалиться до 2-го ветвь без ошибок.

Другие вопросы по тегам