Блог
Телефонный профиль на компьютере: что делает его телефоном целиком
Команда ARMANOS7 мин
Что площадка успевает прочитать до входа
Страница читает вашу машину обычными вопросами, и разрешения ни на один из них она не спрашивает. Ответы приходят порознь, а складываются в одно устройство, и складывает их площадка, а не вы.
Разойдётся любая пара, и дальше площадка смотрит уже не на аккаунт, а на машину за ним. Поэтому телефонным профиль делает не одно значение, а согласие всех сразу, от подписи до числа камер.
| Что площадка спрашивает | Что отвечает настоящий телефон |
|---|---|
| User agent | Android и слово 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
Экран и окно рядом
screen.width и window.innerWidth на странице, объявившей размер под телефон: там окно шире экрана выдаёт подделку.
- 2
Касания и указатель
navigator.maxTouchPoints, ontouchstart, (pointer: coarse) и (hover: none): все четыре по-телефонному или ни одного.
- 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 и сценарий вставал бы на первом нажатии.
Рядом с этим
Приложение и страница
Что читает приложение на аппарате и чего никогда не увидит страница в браузере.
Подсказки клиента
Куда уехала модель аппарата после того, как её убрали из строки User agent.
Окно шире экрана
То же противоречие на настольном профиле и с меньшими числами.
Бесплатная проверка отпечатка
12 значений, прочитанных в вашем браузере, и ни одного запроса наружу.
Посмотрите, чем отвечает ваш браузер
Проверка читает 12 значений и никуда их не отправляет.