Генератор User-Agent: актуальные строки, которые не устарели
Работает в браузере — ничего из введённого не отправляется нам.
Строка, заявляющая версию браузера, снятую три релиза назад, — примета, а не маскировка. Такие строки собираются из версии вашего собственного браузера там, где её можно прочитать, поэтому они остаются актуальными, и список не нужно никому поддерживать.
Версии взяты из вашего браузера (), поэтому они по определению актуальны. Мы не можем определить версию для этого семейства из вашего браузера, поэтому здесь используется наша таблица, последний раз проверенная вручную в . Проверьте текущую версию, прежде чем использовать её там, где это важно.
Шаблон десктопа — это одна точная строка: реальные браузеры одной версии и платформы отправляют одно и то же, и если её менять, ваш станет единственным отличающимся. Мобильные шаблоны варьируют версию ОС и модель — реальные устройства действительно так делают.
Собирается прямо в браузере из шаблонов на странице. Ничего не запрашивается и не отправляется — генератор работает без подключения к сети.
Почему сгенерированный user-agent обычно не решает проблему
Об этом стоит сказать до инструмента, а не после него. Замена строки user-agent — первое, что пытаются сделать, когда скрапер начинают блокировать, и сама по себе она редко помогает: строка — самое дешёвое, что читает сайт, и почти никогда не единственное.
Запрос приходит с user-agent, набором заголовков в определённом порядке, параметрами TLS-рукопожатия, характерными для клиентской библиотеки, и, если выполняется JavaScript, несколькими десятками браузерных значений. Если вы выдаёте себя за Chrome на Windows, а ваша HTTP-библиотека отправляет собственный порядок заголовков и собственный TLS-отпечаток, получается запрос, который не совпадает ни с одним реальным браузером. Для блокировщика это более сильный сигнал, чем был бы у простого, честного python-requests/2.31.0.
А вот где актуальный и правильный user-agent действительно важен — это обратный случай: у вас запущен настоящий браузер, всё остальное в запросе подлинное, а строка — единственное устаревшее значение. Так бывает чаще, чем кажется: строку один раз вставляют в конфиг, а потом она работает два года.
Как этот генератор остаётся актуальным
Именно здесь большинство генераторов ошибается. Жёстко заданная таблица версий точна в ту неделю, когда выходит, и тихо устаревает через месяц; строка с версией Chrome, снятой три релиза назад, — это флаг, а не маскировка. Chrome выпускает мажорную версию примерно раз в четыре недели.
Поэтому номера версий здесь берутся из вашего браузера везде, где мы можем их прочитать. Если вы в Chrome, шаблоны Chrome используют версию, на которой вы действительно работаете; она актуальна по определению и не требует обслуживания с нашей стороны. То же с Firefox, Edge и Safari. Только когда мы не можем определить семейство по вашему браузеру — запрашиваем строки Firefox, находясь в Chrome, — страница откатывается к таблице, которую мы ведём вручную, и прямо об этом сообщает, с датой последней проверки, вместо того чтобы делать вид, что данные свежие.
Почему десктопные шаблоны не варьируются
Можно заметить, что запрос десяти строк Chrome для Windows даёт одну. Это сделано намеренно, и это противоположность тому, что делает большинство генераторов. Каждый настоящий Chrome на 64-битной Windows заданной версии отправляет побайтово одинаковый user-agent: в строке вообще нет деталей, специфичных для машины. Генератор, который менял бы минорную версию или перемешивал токены, выдал бы десять строк, которые не отправлял ни один браузер, и каждая из них по отдельности подозрительнее настоящей.
Мобильные шаблоны отличаются, потому что отличаются реальные устройства: версия Android и строка модели действительно различаются от аппарата к аппарату, и пул одинаковых Android-агентов так же странен, как пул разных десктопных агентов.
Где строка появляется, а где нет
«Смена user-agent» означает разное в разных местах, и эти места не всегда согласуются между собой — а это само по себе один из способов обнаружить несоответствие.
- Заголовок User-Agent. Уходит с каждым запросом, включая запросы за картинками и таблицами стилей. Именно его выставляет HTTP-библиотека, и только его видит сервер, если JavaScript не выполняется.
- navigator.userAgent. Его читают скрипты на странице. Расширение, которое подменяет заголовок, но не это свойство, создаёт противоречие, которое найдёт одна строка JavaScript — и многие расширения делают именно так.
- Client Hints. Набор отдельных заголовков (Sec-CH-UA и родственные), которые современные браузеры на Chromium отправляют вместе со строкой. В них бренд, версия и платформа в структурированном виде, и именно туда Chrome переносит подробности, убранные из строки. Подменить строку, когда Client Hints говорят правду, — частое и легко обнаруживаемое несоответствие.
- И нигде — для TLS. Рукопожатие происходит до того, как отправлен хоть один заголовок, и его параметры опознают клиентскую библиотеку независимо от того, что вы задали. Поэтому запрос из Python, который выдаёт себя за Chrome, ловят раньше, чем прочитан user-agent.
Коротко: если задать строку в одном месте и не задать в остальных, получится клиент, который не совпадает ни с чем реальным. Работаете через браузер — меняйте её тем, что меняет всё сразу; работаете через библиотеку — примите, что строка тут наименьшая из проблем.
Как пользоваться и не сделать хуже
- Согласуйте платформу со всем остальным. Строка macOS с машины, где набор шрифтов и client hints от Windows, — противоречие, и проверка отпечатка покажет, какие значения вас выдают.
- Не отправляйте мобильную строку с десктопного соединения. Агент iPhone при экране 2560×1440, без поддержки касаний и с адресом дата-центра достаточно конкретен, чтобы выглядеть намеренным.
- Меняйте устройства, а не версии. Если пул должен выглядеть разнообразным, варьируйте платформу и устройство. Три версии Chrome на одинаковом железе — это не разнообразие, это браузер посреди обновления.
- Перегенерируйте периодически. Что бы вы ни вставили в конфиг сегодня, оно устареет на том же четырёхнедельном цикле, что и у всех. Если вы берёте строки из своего браузера здесь, то, вернувшись после нескольких обновлений, получите актуальные.
- Сначала приведите в порядок остальную часть запроса. Если вы собираете данные HTTP-библиотекой, а не браузером, порядок заголовков и отпечаток TLS важнее строки. Берите клиент, который имитирует браузер на этом уровне, или запускайте настоящий браузер.
Чтобы проверить, что на самом деле утверждает уже имеющаяся у вас строка — в том числе запускает ли кто-нибудь ещё такую версию, — вставьте её в парсер user-agent.
Вопросы о Генератор user-agent
Почему на запрос десяти десктопных строк я получаю одну?
Потому что каждый настоящий Chrome одной и той же версии на 64-битной Windows отправляет ровно одну и ту же строку — в ней нет ничего машинно-специфичного. Десять разных строк были бы десятью строками, которые не отправил ни один браузер, и каждая подозрительнее настоящей. Мобильные шаблоны действительно различаются, потому что реальные устройства правда разные.
Эти номера версий актуальны?
Там, где мы можем прочитать версию вашего собственного браузера, — да, по определению: шаблоны Chrome используют тот Chrome, в котором вы работаете. Для семейства, которое нельзя прочитать из вашего браузера, страница обращается к таблице, которую мы поддерживаем вручную, и сообщает, когда её последний раз проверяли.
Перестану ли я попадать под блокировки, если сменю user-agent?
Сама по себе — обычно нет. Строка — самое дешёвое, что читает сайт, и почти никогда не единственное: порядок заголовков, TLS-отпечаток и несколько дюжин значений браузера тоже проверяются. Строка Chrome из HTTP-библиотеки Python не соответствует ни одному реальному браузеру и является лучшим сигналом, чем честная.
Отправляется ли вам что-нибудь, когда я генерирую?
Нет. Шаблоны находятся на странице, а строки собираются в вашем браузере. Генератор работает при отключённом соединении.
Можно ли использовать их для парсера?
Можно, и это будут корректные строки. Поможет ли это — зависит от остальной части запроса: если вы используете HTTP-библиотеку, а не браузер, сначала исправьте порядок заголовков и TLS-отпечаток, потому что их проверяют чаще, чем строку.
Должен ли каждый запрос в пуле использовать другой user-agent?
Меняйте платформу и устройство, а не версию. Несколько версий одного и того же браузера на одинаковом оборудовании выглядят как браузер в процессе обновления, а не как несколько человек. А двести запросов с одной и той же побайтово идентичной строкой — самый простой шаблон для блокировки.