Перейти к содержимому

Блог

Телефонный профиль на компьютере: что делает его телефоном целиком

Вы работаете с ноутбука, а войти в аккаунт нужно так, будто в руках у вас телефон. Площадка спрашивает у страницы не одно значение, а десяток, и сверяет их между собой. Телефоном профиль делает не строка User agent, а аппарат целиком: экран, плотность пикселей, касания, видеокарта, память, шрифты и связь обязаны принадлежать одной модели. Ниже по порядку, что именно читает площадка и на каком расхождении рвётся телефон, собранный на компьютере.

Команда ARMANOS7 мин

Что площадка успевает прочитать до входа

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

Разойдётся любая пара, и дальше площадка смотрит уже не на аккаунт, а на машину за ним. Поэтому телефонным профиль делает не одно значение, а согласие всех сразу, от подписи до числа камер.

Что площадка спрашиваетЧто отвечает настоящий телефон
User agentAndroid и слово Mobile в конце строки
Подсказки клиентаПлатформа Android, архитектура arm, модель аппарата
Экран и доступная площадьСовпадают: полосы меню у телефона нет
Плотность пикселейДробная: 2,625, 2,75, 3 или 3,75
Касания и указательПять касаний, грубый указатель, наведения нет
ВидеокартаСтрока ANGLE в том виде, в каком её пишет Android
Ядра и памятьВосемь ядер, 4 или 8 гигабайтов
ШрифтыАндроидный набор плюс шрифт производителя
СвязьТри поля, которых на рабочем столе нет

Телефон нельзя собрать из чужих кусков

На рабочем столе разные люди правда собирают разные машины, и экран одного производителя рядом с видеокартой другого никого не удивляет. С телефоном так не бывает: модель задаёт всё сразу, и заменить в ней одну часть нельзя даже отвёрткой.

Поэтому ваш профиль получает аппарат целиком, а не набор значений по отдельности, и правки руками к отдельным частям аппарата не применяются. Аппаратов в наборе 22, планшетов 7, и за каждой строкой стоит модель, которую правда продавали.

  • Экран и плотность пикселей

    От 360 на 780 до 412 на 919 точек вёрстки, плотность от 2,625 до 3,75. Восемь разных экранов на весь набор.

  • Видеокарта

    Производитель и отрисовщик приходят парой, и разных пар в наборе двенадцать.

  • Ядра и память

    Восемь ядер у всех, память 4 или 8: выше восьми браузер не называет никогда.

  • Шрифты оболочки

    Google Sans у Pixel, SamsungOne у Samsung, MiSans у Xiaomi. Рядом в подкладку для рисования кладутся шрифты вашей машины: иначе буквы не нарисуются вовсе, а странице этот список не отдаётся.

Камеры и микрофоны считаются по-телефонному

Число устройств захвата читает страница, которой разрешили записывать: сколько микрофонов, сколько динамиков, сколько камер. У телефона камер две или три, а микрофон и динамик чаще по одному, и профиль отвечает так же.

Настольная машина отвечает иначе: камера одна, а микрофонов и выходов звука бывает по два и по три из-за гарнитур и мониторов. Телефон с одной камерой и тремя микрофонами это ещё одна пара, которой не бывает.

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

Предел кучи у телефона вдвое ниже

Кроме объёма памяти страница читает предел кучи скриптов, и у телефона он считается иначе: четверть памяти против половины у рабочего стола. Восемь гигабайт памяти дают телефону два гигабайта кучи, а настольной машине четыре.

Считается это в самом профиле, а не в движке, и по одному правилу для всех аппаратов набора. Телефон с настольным пределом кучи выдал бы себя тем же способом, что и телефон с настольным окном.

User agent у телефона сокращён

Chrome на Android давно не пишет в подписи ни модель, ни настоящую версию системы: там стоит «Android 10; K» у любого аппарата. Настоящая модель живёт только в подсказках клиента, и отдаётся она по запросу сайта, а не в первом заголовке.

Поэтому строка «Android 14; Pixel 7» в подписи выдаёт подделку с первого заголовка запроса. У вашего профиля модель уезжает ровно туда, куда её кладёт живой Chrome, и никуда больше.

Касания и указатель проверяются одной строкой

Три вопроса площадка задаёт подряд: есть ли ontouchstart, отвечает ли (pointer: coarse), отвечает ли (hover: none). Телефон отвечает «да» на все три, рабочий стол на все три отвечает «нет».

Смешанного ответа не даёт ни одна живая машина, и стоит такая проверка одну строку. Точек касания у телефона пять, ровно столько называет Chrome на Android, и у профиля их столько же.

Окно оказывается шире объявленного экрана

Настольная сборка Chromium не умеет окон уже пятисот точек: попросите 360, и получите 500. Экран профиль объявляет в 360, и окно выходит шире собственного экрана, чего у аппарата в руках не бывает.

На странице, объявившей свой размер под телефон, такого не бывает, и площадка видит это одним сравнением. Без такого объявления живой Android раскладывается на 980 точек при экране 360, и окно там честно шире экрана. Телефонное окно получает размер аппарата уже после запуска, и новая вкладка получает его тоже.

Чужой кадр считается отдельно

Реклама и проверки на ботов часто сидят в кадре с другого адреса, а такой кадр живёт своим процессом. Без наряда внутри него телефон противоречил бы сам себе: снаружи экран телефона, внутри весь рабочий стол. Наряд туда доходит, и замер на двух настоящих окнах это подтверждает.

Планшет не отвечает как телефон

Chrome на планшете не пишет в подписи слово Mobile и говорит про себя «не мобильный», поэтому сайты отдают ему настольную вёрстку, и это правильное поведение живого планшета. Планшет со словом Mobile спорит сам с собой в первом же заголовке.

Экран у планшета лежит длинной стороной поперёк, а плотность пикселей полтора или два, ниже любой телефонной. Планшетных моделей в наборе 7, и телефонная плотность в 2,625 и выше туда не попадает.

Связь телефон описывает тремя лишними полями

У Chrome на Android есть три поля, которых на рабочем столе нет вовсе: type, downlinkMax и ontypechange. Площадка спрашивает это одной строкой про navigator.connection.

Открыть поля мало: без подмены они отдают значения того компьютера, за которым вы сидите, а «Android» с бесконечным потолком скорости заметнее, чем отсутствие полей. Поэтому у телефонного профиля потолок согласован со скоростью и взят из таблицы самого браузера: 11, 54 и 600 для Wi-Fi, 42 и 100 для быстрой сотовой связи. Сорок два это HSPA+, сто это LTE, и берутся они там, где браузер объявил четвёртое поколение.

Сорок профилей и ни одной чужой части

Обещание «аппарат целиком» проверяется исполнением, а не чтением: сорок телефонных профилей выводятся из своих зёрен, и у всех сорока экран, плотность, видеокарта, ядра, память и шрифты сверяются с одной строкой набора аппаратов.

Профиль, у которого хоть одна часть пришла бы от соседней модели, красит проверку красным. Такой же круг проходят планшеты, и телефонная плотность в планшетной строке проходит его так же плохо.

Как проверить свой профиль за минуту

Откройте в профиле окно разработчика и прочитайте четыре ответа подряд. Живая машина отвечает согласованно, а подделка расходится на первом же из них, и искать дальше уже незачем.

Если хоть одно показание спорит с соседним, профиль читается как рабочий стол, назвавшийся телефоном. Площадке при этом всё равно, где стоит ваша машина.

  1. 1

    Экран и окно рядом

    screen.width и window.innerWidth на странице, объявившей размер под телефон: там окно шире экрана выдаёт подделку.

  2. 2

    Касания и указатель

    navigator.maxTouchPoints, ontouchstart, (pointer: coarse) и (hover: none): все четыре по-телефонному или ни одного.

  3. 3

    Подпись и подсказки

    В подписи «Android 10; K», в подсказках Android, arm и настоящая модель аппарата.

Чего это не утверждает

  • Это не утверждает, что телефонный профиль неотличим от аппарата в руках. Сошедшиеся ответы убирают противоречия, а поведение, история аккаунта и платёжные данные остаются как были.
  • Это не утверждает, что каждая площадка читает все перечисленные значения. Кто-то смотрит три, кто-то двадцать, и свой список не публикует никто.
  • Приложение площадки на настоящем аппарате читает систему, а не браузер, и профиль с компьютера туда не заходит вовсе. Речь здесь только про то, что видит страница.
  • Три поля связи открываются только на том ядре браузера, которое умеет подменить их значения. На старом ядре профиль остаётся без них, а не отдаёт ваши собственные.

Где это можно увидеть самому

Каждое число выше выходит из кода, который можно открыть и запустить.

Аппараты лежат списком: экран, плотность пикселей, видеокарта, ядра, память и шрифты одной строкой на модель
packages/shared/src/index.js
Ни одна часть аппарата не приходит от другого, и это исполняется на сорока профилях
apps/desktop/test/mobile-really-mobile.js
Окно просят размером с аппарат, и запомненный настольный размер телефону не возвращают
apps/desktop/test/mobile-window.js
Три поля связи открываются только тому движку, который умеет подменить их значения
apps/desktop/test/поля-связи-телефона.js
Телефон и настольный профиль открыты рядом в настоящем браузере, и показания спрошены у самой страницы
apps/desktop/test/телефон-живьём.js

Вопросы

Площадка видит, что телефон открыт с компьютера?
Она видит ответы страницы, а не то, где стоит машина. Ловят не компьютер, а несогласованность: экран от одного аппарата, видеокарта от другого, окно шире экрана.
Зачем окно размером с телефон, если монитор большой?
Окно телефона равно экрану телефона. На странице, объявившей размер под телефон, окно шире экрана выдало бы подделку; на странице без такого объявления шире бывает и у настоящего аппарата. Место окна на мониторе остаётся вашим.
Можно выбрать конкретную модель?
Да, аппарат выбирается списком в окне профиля «Отпечаток > Изменить значения > Аппарат», и выбранный приходит целиком. Вместе с моделью меняются экран, плотность пикселей, видеокарта, ядра, память и шрифты.
Планшет это тот же телефон?
Нет. Планшет говорит про себя «не мобильный» и не пишет Mobile в подписи, поэтому сайты отдают ему настольную вёрстку. Планшетных моделей в наборе 7.
Меняет ли что-нибудь прокси?
Адрес приходит со стороны, а все перечисленные ответы рождаются на машине перед вами. Ни экран, ни касания, ни видеокарту прокси не поправит.
Сценарии на телефонном профиле работают так же?
Да, но нажатие на телефоне это касание, а не щелчок мышью. Поэтому на телефонном профиле шаги шлют касание: иначе страница получала бы touchstart без click и сценарий вставал бы на первом нажатии.

Посмотрите, чем отвечает ваш браузер

Проверка читает 12 значений и никуда их не отправляет.