обнаружение браузера на стороне сервера? Node.js - PullRequest
56 голосов
/ 28 мая 2011

Большинство реализаций, которые я видел, предназначены для обнаружения браузера на стороне клиента. Мне просто интересно, можно ли было сделать обнаружение браузера перед отправкой каких-либо ресурсов клиенту.

Спасибо.

Ответы [ 15 ]

0 голосов
/ 24 февраля 2019

[Вот еще один вариант или ассимиляция для вашего рассмотрения.]

Более универсален и упрощен.

Вы можете передать запрос или любой объект со свойством 'headers', или это может быть свойство headers, и вы можете выбрать любую метку для поиска параметра объекта или заголовков или самой строки агента пользователя.

Он использовал ранее опубликованное регулярное выражение для проверки мобильных и таблиц и просто возвращает этот результат, но сначала освящая ввод, можно подключать различные вещи.

Вы даже можете переопределить регулярное выражение по умолчанию, необязательно передаваемое в качестве аргумента. {Я оставлю это дальнейшее продолжение вдохновленным.} Также можно использовать другой способ по умолчанию использовать глобально хранимый пользовательский агент из запроса, если он находится в области действия и т. Д.

mobTabCheck: function( ua, lbl, rgx ) {  /* mobile tablet check; UserAgent or request, or any object with optional search label  */
    if( ua === und ) return false;
    if( ua !== und && ua.constructor !== String ) {
        if( lbl === und ) lbl = 'user-agent';
        if( ua.headers !== und ) ua = ua.headers[ lbl ];
        else ua = ua[ lbl ];
    }
    if( rgx === und ) rgx = /Mobile|iP(hone|od|ad)|Android|BlackBerry|IEMobile|Kindle|NetFront|Silk-Accelerated|(hpw|web)OS|Fennec|Minimo|Opera M(obi|ini)|Blazer|Dolfin|Dolphin|Skyfire|Zune/;
    if( rgx.constructor === String ) rgx = new RegExp( rgx );
    return rgx.test( ua );
}

Это регулярное выражение пришло отсюда ... https://gist.github.com/dalethedeveloper/1503252/931cc8b613aaa930ef92a4027916e6687d07feac

Раствор 98%. Я не знаю, проверяет ли он планшеты, как следует из названия моей функции.

Неужели название этой функции (и некоторые аргументы) следует переименовать, может быть? ... serachObjectForLabelThatMatchesThisRegex

за исключением того, что все значения по умолчанию делают его предметом с одним аргументом.

Кроме того, я оставляю функцию установленной в качестве значения ключа, которое вы можете сохранить так, как предпочитаете ... просто пообещайте мне не использовать var или const, если вы его используете.

let mobTabCheck = function() {};
0 голосов
/ 28 января 2019

Мощный npm useragent .Useragent позволяет анализировать строку пользовательского агента с высокой точностью, используя специально настроенные регулярные выражения для сопоставления в браузере.Эта база данных необходима для обеспечения правильного анализа каждого браузера, поскольку каждый поставщик браузеров реализует свою собственную схему пользовательского агента.Вот почему обычные парсеры пользовательских агентов имеют серьезные проблемы, потому что они, скорее всего, будут анализировать неправильное имя браузера или путать версию механизма рендеринга с реальной версией браузера.

0 голосов
/ 13 января 2016

Возможно, вы захотите взглянуть на Apache DeviceMap .

Библиотеки JavaScript из коробки прямо сейчас на стороне клиента, но многое будет работать на Node.JS илиУгловой аналогичным образом.В отличие от простого сопоставления с шаблоном UA-строк, в своем репозитории описания устройств (DDR) на основе стандартов W3C DeviceMap поставляется с широким диапазоном устройств и семейств устройств.

0 голосов
/ 27 октября 2015

Я немного улучшил код @ duck5auce, чтобы он стал действительно полезным и поддерживающим IE 10-12 (Edge).

var getDevice = function(ua) {
    var $ = {active: false, subactive: false};

    if (/mobile/i.test(ua)) {
        $.active = 'mobile';
        $.Mobile = true;
    }

    if (/like Mac OS X/.test(ua)) {
        $.active = 'iOS';
        $.iOS = /CPU( iPhone)? OS ([0-9\._]+) like Mac OS X/.exec(ua)[2].replace(/_/g, '.');
        if (/like Mac OS X/.test(ua)) {
            $.subactive = 'iPhone';
            $.iPhone = /iPhone/.test(ua);
        }
        if (/like Mac OS X/.test(ua)) {
            $.subactive = 'iPad';
            $.iPad = /iPad/.test(ua);
        }
    }

    if (/Android/.test(ua)) {
        $.active = 'Android';
        $.Android = /Android ([0-9\.]+)[\);]/.exec(ua)[1];
    }

    if (/webOS\//.test(ua)) {
        $.active = 'webOS';
        $.webOS = /webOS\/([0-9\.]+)[\);]/.exec(ua)[1];
    }

    if (/(Intel|PPC) Mac OS X/.test(ua)) {
        $.active = 'Safari';
        $.Safari = /(Intel|PPC) Mac OS X ?([0-9\._]*)[\)\;]/.exec(ua)[2].replace(/_/g, '.') || true;
    }

    if (/Windows NT/.test(ua)) {
        $.active = 'IE';
        $.IE = /Windows NT ([0-9\._]+)[\);]/.exec(ua)[1];
    }
    if (/MSIE/.test(ua)) {
        $.active = 'IE';
        $.IE = /MSIE ([0-9]+[\.0-9]*)/.exec(ua)[1];
    }
    if (/Trident/.test(ua)) {
        $.active = 'IE';
        $.IE = /Trident\/.*rv:([0-9]+[\.0-9]*)/.exec(ua)[1];
    }
    if (/Edge\/\d+/.test(ua)) {
        $.active = 'IE Edge';
        $.IE = /Edge\/(\d+)/.exec(ua)[1];
    }

    return $.active + ' ' + $[$.active] + ($.subactive && ' ' + $.subactive + ' ' + $[$.subactive]);
};
0 голосов
/ 06 апреля 2013

Если вы хотите управлять мобильным устройством в слое шаблонов, я просто написал для этого модуль. https://github.com/Fresheyeball/isMobile-node

...