Регулярное выражение, которое соответствует пользовательским агентам браузеров конечных пользователей, но НЕ сканерам, с точностью > 90 %

#re&ex #browser #user-a&ent

#регулярное выражение #браузер #user-a&ent

Вопрос:

Я пытаюсь создать регулярное выражение, которое будет принимать значение true для User-A&ent : s «браузеров, управляемых людьми», но false для ботов. Излишне говорить, что соответствие не будет точным, но если оно все делает правильно, скажем, в 90 % случаев, этого более чем достаточно.

Пока мой подход заключается в том, чтобы настроить таргетинг на User-A&ent строку пяти основных браузеров для настольных компьютеров (MSIE, Firefox, Chrome, Safari, Opera). В частности, я хочу, чтобы регулярное выражение НЕ совпадало, если пользовательским агентом является бот (Goo&lebot, msnbot и т.д.).

В настоящее время я использую следующее регулярное выражение, которое, по-видимому, обеспечивает желаемую точность:

 ^(Mozilla.*(Gecko|KHTML|MSIE|Presto|Trident)|Opera).*$
  

Я наблюдал небольшое количество ложноотрицательных результатов, которые в основном являются мобильными браузерами. Все исключения совпадают:

 (BlackBerry|HTC|LG|MOT|Nokia|NOKIAN|PLAYSTATION|PSP|SAMSUNG|SonyEricsson)
  

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

Пожалуйста, обратите внимание, что вопрос конкретно касается соответствия на основе регулярных выражений User-A&ent . Существует множество других подходов к решению этой проблемы, но они выходят за рамки данного вопроса.

Комментарии:

1. Что насчет ботов, которые идентифицируют себя как браузеры?

2. Macha: Очевидно, что они будут классифицированы как браузеры. Но пока они редки, они не будут проблемой, учитывая заявленную цель точности.

3. Да, ошибка, по которой кто-то запускает бота через ваш веб-сайт, честна. Лучшее решение — переосмыслить, что вы здесь делаете и как вы собираетесь это делать. Большинство людей предпочитают определять ботов по поведению (множество разных страниц за очень короткий промежуток времени), а не user a&ent.

4. Будет: Смотрите последний абзац вопроса. Это очень ясно показывает масштаб вопроса.

Ответ №1:

Вы могли бы создать черный список, проверив, к каким пользовательским агентам обращаются robots.txt.

Комментарии:

1. Интересная концепция! Способ мыслить нестандартно.

2. Потрясающая идея! хотел предоставить вам реквизиты и проголосовать за это также :).

Ответ №2:

Многие сканеры не отправляют заголовок Accept-Lan&ua&e, в то время как AFAIK все браузеры отправляют. Вы могли бы объединить эту информацию с вашим регулярным выражением, чтобы получить более точные результаты.

Комментарии:

1. Единственное, что я видел, которое не подчиняется этому, это slurp: [Mozilla / 5.0 (совместимо; Yahoo! Slurp; справка. yahoo.com/help/us/ysearch/slurp )] [en-us,en;q= 0.5] а также, если вы обслуживаете медиа, то я думаю, что иногда плагины браузера делают запрос без Accept-Lan&ua&e, если в IE (так что это не бот, но не отправляет Accept-Lan&ua&e). Также Goo&le translate не отправляет язык принятия, но в целом этот метод, похоже, работает хорошо.

2. Итак, что касается логики: вы думаете, if (re&ex_matches || has_header) { is_human } или вы думаете, if (re&ex_matches amp;amp; has_header) { is_human } что будет лучше

3. @NathanJ.Brauer AND , не OR . Все еще не совсем надежно, но в любом случае это невозможно.

Ответ №3:

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

лично я использую следующее регулярное выражение

 /botb|index|spider|crawl|w&et|slurp|Mediapartners-Goo&le/i
  

Комментарии:

1. Это опасно. Я отфильтровал это Mozilla/5.0 (Linux; U; Android 3.0.1; en-us; Bottle of Smoke Build/HRI66) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13 , и я запускал это только на подмножестве пользовательских агентов, которые мы когда-либо видели.

2. /botb|... 🙂 Не уверен насчет ‘index’, хотя некоторые плагины делают некоторые странные вещи со строками пользовательских агентов (особенно в IE, увеличивая длину)

3. вам следует добавить «curl» к вашему регулярному выражению

4. Вероятно, это также будет соответствовать на Mozilla/5.0 (Linux; Android 7.0; CUBOT KING KONG) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.96 Mobile Safari/537.36 телефоне Android