В бета-сборке Telegram для macOS 13.0.283320 от 15 октября появился новый экран QR-кода профиля. В коде он называется QR-студией: фон и узор вокруг кода собираются из коллекционного подарка, из премиум-эмодзи или из цвета. На том же экране есть переключатель «Remove message fee»: он превращает QR-код и ссылку из него в пропуск мимо платы за сообщения — тот, кто по ней пришёл, пишет владельцу бесплатно. Касается это тех, кто берёт звёзды за входящие сообщения, и тех, кто им пишет. Пока функции есть только в бете для Mac, а в открытой схеме API их нет.
Что появилось в сборке 13.0.283320
Бета macOS раздаётся через фид обновлений mac-updates.telegram.org. 15 октября в нём вышли три сборки подряд: 283318 утром, 283320 и 283321 днём. Интерфейс обеих функций появляется в 283320 — модуль QrStudioUI и файл ядра NoPaidMessagesToken. Описания типов API для бесплатной ссылки лежали в клиенте уже с утренней 283318, но без экрана, который бы их вызывал. Сборка 283321 вышла через сорок минут после 283320 и обе функции сохранила.
Тексты новых экранов в бете написаны прямо в коде по-английски, на платформу переводов они пока не попали. Исключение — две служебные строки чата о бесплатной ссылке: они добавлены в файл локализации той же сборки.
Как работает ссылка без платы за сообщения
В Telegram можно назначить цену в звёздах за сообщения от тех, кто не в контактах. Кому-то конкретному плату можно снять и сейчас — вручную, добавив человека в исключения: в схеме API для этого есть метод account.toggleNoPaidMessagesException. Бета добавляет второй путь: исключение выдаётся ссылкой, и вписывать собеседника руками не нужно.
Включается это переключателем «Remove message fee» на экране QR-кода. После этого в коде и в ссылке из него лежит токен — в клиенте он называется noPaidMessagesToken. Тот, кто открыл такую ссылку, видит «You can now message …» с именем владельца, и его сообщения после этого бесплатны. В чате у обоих остаётся служебная строка: у владельца — «… used your link to message you for free», у пришедшего — «You used …’s link to message for free».
Срок у токена задаётся тем же экраном:
| Строка в бете | Что происходит |
|---|---|
| «Expire after 1 minute» | код действует минуту — «This code will expire in 1 minute» |
| «This code no longer expires» | код бессрочный |
| «New code created. The old one no longer works.» | код перевыпущен, старая ссылка перестала работать |
| «Restore message fee» | плата вернулась — «Your message fee applies again» |
Минутный код, по всей видимости, рассчитан на встречу вживую: показать QR с экрана, дать отсканировать — и через минуту картинка, пересланная дальше, уже ничего не открывает. Просроченную или отозванную ссылку клиент встречает сообщением «This free message link is invalid or has expired», сервер в этом случае отвечает ошибкой NO_PAID_MESSAGES_TOKEN_INVALID.
Чем это отличается от ссылки «добавить в контакты»
У Telegram давно есть временная ссылка-приглашение в контакты: в открытой схеме это contacts.exportContactToken, ответ exportedContactToken несёт адрес и срок действия. В бете рядом с ним появился парный тип exportedNoPaidMessagesToken и служебное сообщение messageActionNoPaidMessagesTokenUsed. Обоих в открытой схеме слоя 230 нет. Устроены они по той же схеме — сервер выдаёт токен со сроком, клиент кладёт его в ссылку, — но токен не добавляет в контакты, а только снимает плату за сообщения.
Как устроена QR-студия
Экран QR-кода профиля в Telegram существует давно, в мобильных клиентах его раскрашивают темами чатов. QR-студия заменяет их тремя вкладками — в коде qr_studio_tab_gift, qr_studio_tab_emoji и qr_studio_tab_color:
- Подарок. Под кодом ложится фон коллекционного подарка, а вокруг повторяется его символ — тем же узором, которым оформлен сам подарок.
- Эмодзи. Узор собирается из премиум-эмодзи — кастомных эмодзи из паков, доступных с Telegram Premium.
- Цвет. Фон из палитры цветов.
Рядом кнопка дня и ночи: каждый вариант рисуется в светлой и тёмной версии. Набор фонов клиент не хранит, а запрашивает у сервера списком shareThemeBackdrops и кеширует — у типа есть вариант shareThemeBackdropsNotModified, которым сервер отвечает «список не менялся».
Выбранное оформление сохраняется не на устройстве, а на сервере, как настройка аккаунта: в ядре это ShareTheme с вариантами shareThemeGift, shareThemeEmoji, shareThemeColor и shareThemeDefault, а подарок для фона передаётся типом inputShareThemeGift. Значит, один и тот же QR-код будет выглядеть одинаково на всех устройствах владельца. Готовую карточку можно выгрузить картинкой — в модуле есть отдельная сцена экспорта с кодом, узором и стикером.
У перевыпуска кода своя анимация: слои экрана называются QrStudioShatter, QrStudioAshLayer и QrStudioParticle. Судя по именам, старый код при замене рассыпается в пепел, а на его месте собирается новый, — для кода, который только что перестал работать, проводы честные.




