Про разработку ботов в Telegram написано много текстов, а про «тестовый дата-центр» практически ничего. Ранее Pavelgram освещал этот вопрос: он кратко рассказал, что такое тестовые серверы и как с ними работать. Я продолжу это начинание.

Эта статья — сборник разбросанной документации и результатов экспериментов. Под катом расскажу о технических особенностях тестового окружения для разработки, покажу примеры ботов и юзерботов. В качестве бонуса — история «о жизни в тестовом контуре».

Используйте навигацию, чтобы выбрать интересующий блок:

Тестовые дата-центры
Свои, откройте!
Прятки с официальными аккаунтами
Чего нельзя сделать
Инструменты разработчика
Жизнь в тесте
Заключение

Тестовые дата-центры


Серверы мессенджера распределены по всему миру. Набор серверов в одном регионе в терминах Telegram называется дата-центром (ДЦ). Для оптимизации запросов к API клиент должен подключиться к ближайшему из доступных дата-центров. Запись о пользователе и все его данные хранятся в одном ДЦ, который определяется при первом входе.

При авторизации клиент не знает, в каком дата-центре располагается учетная запись пользователя, и отправляет запрос в случайный ДЦ, который возвращает ошибку и перенаправляет на нужные серверы. Если пользователь переезжает в другой регион и задерживается там надолго, то бэкенд может мигрировать пользователя в другой дата-центр — и клиенту придется обработать перенаправление.

Без корректной обработки перенаправлений клиент Telegram будет практически бесполезен: «недомашние серверы» пользователя откажутся сотрудничать. Поэтому разработчикам необходимо отладить функциональность переходов между ДЦ. Однако Telegram не любит отладку на проде: для всех аккаунтов в «боевом» окружении установлено ограничение по количеству успешных попыток входа. Превышение этого лимита приведет к ошибке 420 FLOOD_WAIT_X до следующего дня.

Здесь в игру вступает тестовое окружение — три дата-центра, полностью изолированные от основного Telegram. Это значит, что вы можете зарегистрироваться в тестовом окружении со своего номера телефона, и это будет новый аккаунт, который ничего не знает о вашем «настоящем» аккаунте.


40 000 аккаунтов уже готовы, еще миллион на подходе.

Для тестирования процессов авторизации, регистрации и переключений между дата-центрами в «тесте» существует 40 тыс аккаунтов с номером +999 66 X YYYY, где X — это цифра от 0 до 3, а YYYY — любое четырехзначное число. Число X задает принадлежность к дата-центру: 1-3 — пользователи явно «прибитые» к соответствующему ДЦ, а 0 — автоматически определяется как ближайший к клиенту.

Аккаунты +999 имеют фиксированный OTP (One-Time Password) для входа: это пять цифр X из номера телефона. Например, если номер телефона — +999 66 2 4227, то код для входа — 22222. Если у вас появилось желание воспользоваться таким публичным номером, не пренебрегайте информационной безопасностью.

  1. «Секрет» входа в публичные аккаунты — не секрет. Особенно после публикации очередной статьи на эту тему.
  2. Если вы хотите сохранить действия на аккаунте в тайне от других любопытствующих, стоит поставить облачный пароль (2FA).
  3. Фиксированный OTP на публичных номерах значит, что любой желающий может удалить ваш защищенный облачным паролем аккаунт.
  4. Публичные аккаунты периодически очищаются.
  5. При входе с мобильных устройств по умолчанию выбран пункт «Синхронизировать контакты». Обязательно выключайте!


Слева — аккаунт на личный номер, справа — «публичный» аккаунт.

Еще одна особенность публичных аккаунтов: Telegram скрывает IP-адрес и локацию входа.

Тестовые дата-центры — это полноценный Telegram, где, кажется, платные функции можно купить за «фантики». От этой мысли резко захотелось войти в тестовое окружение.



Свои, откройте!


Пробраться в тестовое окружение не так сложно. Официальные клиенты могут по-разному подключаться к тестовым дата-центрам.

Telegram Desktop (Windows, Linux): зайдите в настройки → нажмите Shift+Alt и ПКМ по кнопке Add Account → выберите Test Server.

Telegram Desktop (macOS): десять раз кликните на кнопку Settings → нажмите cmd и кликните по кнопке Add Account.

Android: скачайте приложение Telegram Beta с AppCenter → при первом входе выберите пункт Test Backend.

iOS: десять раз кликните по кнопке Settings → перейдите в Accounts → нажмите Add Account → выберите Test Server.

Напоминание: не синхронизируйте контакты своего телефона при входе в публичные аккаунты!

Ну вот и все, дойти до тестового окружения Telegram было не сложно. Теперь можно заниматься обычными «телеграмными» делами.

Прятки с официальными аккаунтами


В Telegram многие вопросы — а может и все — решаются через ботов. Их можно распознать по имени и галочке верификации. Однако в тестовом окружении есть определенные проблемы и с тем, и с другим.

Сервисный аккаунт


Первым в Telegram встречает сервисный аккаунт с номером телефона +42777. Этот аккаунт уведомляет о попытках входа и рассказывает, что изменилось при обновлении приложения.

Еще существует сервисный аккаунт с номером +333. У него нет верификации, но он доступен как в тестовом окружении, так и в продовом. «Старички» могли видеть от него приглашение в Telegram Desktop. Сейчас аккаунт не отвечает на сообщения.

В тестовом окружении сервисный аккаунт совершенно внезапно откликается на одну команду:
# Шаблон
/react {t.me url} {limit} {emoji_count}
# Ограничения
1 <= limit <= 200
1 <= emoji_count <= 11
# Пример
/react https://t.me/***/131 40 2


Данная команда увеличивает число реакций на указанном сообщении на limit. Параметр emoji_count указывает на количество реакций, доступных команде. Например, при emoji_count = 1 команда выбирает случайную реакцию из доступных и ставит ее limit раз. Если emoji_count = 4, то команда распределяет limit реакций между четырьмя случайными эмодзи. У этой команды есть несколько побочных эффектов:

  1. Реакции ставятся от имени «публичных» аккаунтов. Эти пользователи не вступают в канал/группу и не увеличивают счетчик просмотров. Так что возможна ситуация, когда реакций больше просмотров.
  2. Хотя верхняя граница limit — 200, более 38 реакций получить не удалось.
  3. Реации ставятся от одного набора аккаунтов. Иными словами, многократный вызов этой команды на одно сообщение не будет увеличивать количество реакций.
  4. Нет возможности управлять какую реакцию необходимо поставить. При emoji_count = 1 будет поставлена случайная реакция: это может быть как ????, так и ❤️.

Вероятно, эта команда появилась перед релизом реакций на сообщения. Как была найдена — мне неизвестно. Неизвестно и о наличии других команд для сервисного аккаунта. Перебор нецелесообразен: аккаунт не отвечает ошибками.

Премиум


Второй бот открывает себя из меню Telegram Premium — izpremiumbot. Он управляет подпиской. В тестовом окружении ее можно купить на четыре временных промежутка:

  • 5 минут: купить подписку любой длительности непосредственно у бота.
  • 15 минут: получить подписку на 3 месяца в подарок от другого пользователя.
  • 30 минут: получить подписку на 6 месяцев в подарок от другого пользователя.
  • 1 час: получить подписку на 12 месяцев в подарок от другого пользователя.

Для оплаты можно использовать любую тестовую карту — например, широко известную 4242 4242 4242 4242 с любым владельцем, датой и CVC. Эта карта — лишь один из вариантов: все доступные варианты описаны в документации Stripe. Также важно учитывать, что ни один из способов получения Premium не позволяет его автоматически продлить.

Замечание для разработчиков: в test DC 2 Premium-подписка ломает взаимодействие с Encrypted CDN.

Боты, которые не прячутся


По памяти можно найти несколько ботов, которые совсем не маскируются и имеют ник как в основном Telegram.

BotFather. Управляет ботами и приложениями WebApp. Потерял аватарку и верификацию, но работает как обычно, дополнительных функций не предоставляет.

Stickers. Управление стикерами. Тоже без аватарки и «галочки». Кстати, помните красивые масштабные анимации для одиночных эмодзи, например, для ????? Так вот, воспроизводимая анимация — это специальный стикерпак, доступный в том числе в проде. ;)

SpamBot. Информационный бот, который поможет узнать, наложили ли на ваш аккаунт ограничения.

PremiumJoinBot. Бот, который автоматически одобряет заявки на вступление для подписчиков Telegram Premium. Потерял верификацию.

DurgerKingBot. Известная демонстрация WebApp. Работает.

like и vote. Потеряли не только аватарку, но и работоспособность. Их товарищи по inline — боты bold, gif и pic — вообще не существуют в тестовом окружении.

Отсюда начинается квест.

Верификация



Верифицированная магия суффиксов

В тестовом окружении очень просто получить «галочку» верификации для своего канала или группы. Достаточно добавить суффикс _vf в ссылку, например habr_vf. Наличие верификации запрещает изменять ссылку, имя канала или группы.

Управлять верификацией можно с помощью VerifyBot — например, оставить заявку на получение «галочки» или мгновенно ее снять. В тестовом окружении этот бот работает, но имеет нетривиальное имя: asmico_verify_bot.

Прочие автоматизированные боты


Эти боты поменяли свой ник, но продолжают работать.

MTProxyBot → izmtproxy_bot. Бот для регистрации MTProro Proxy.

ShopBot → izshopbot. Демонстрация магазина в Telegram.

wiki → wikibot. Еще один inline-бот, который смог. Ищет страницы в Википедии.

Спортлото


В Telegram есть боты для формирования заявок, которые просматривают люди. В тестовом окружении такие боты тоже есть, но весьма вероятно, что на оставленные заявки никто не обратит внимания.

username_bot → asmico_username_bot + username_asmico_bot. Боты для обжалования занятых имен. Если вы используете ник habr_it в других социальных сетях, а в Telegram он занят простаивающим каналом с двумя подписчиками, вы можете написать заявку и ник освободят. Первый бот работает, а второй — верифицирован.

design_bot → asmico_designers_bot. Сюда отправляют дизайнерские работы.

Stripe → izstripebot. Поддержка платежной системы Telegram.

jobs_bot → asmico_jobs_bot. Сюда можно подать резюме, если хотите работать в Telegram.

Transparency → asmicoTransparencyBot. Отчет о прозрачности.

PressBot → AsmicoPressBot. Заявки в пресс-центр.

GDPRBot → asmicogdprbot. Позволяют получить выгрузку своих данных в соответствии с GDPR. В проде предлагает перейти на EURegulation, в тестовом окружении бот не работает.

Чего нельзя сделать


С одной стороны, в тестовом окружении много различных ботов. С другой стороны — есть ряд ограничений.

Вы не можете использовать дополнительные имена. Площадка аукционов Fragment позволяет купить коллекционное имя пользователя. А за дополнительную плату (5 000 TON, ~600 тыс рублей) — назначить его боту, который от такой щедрости научится отправлять премиум-emoji. У Fragment нет официальной тестовой площадки, так что дополнительные имена остаются действительно уникальной вещью. Отсюда следует другое ограничение.

Боты не могут использовать «премиальные» функции — например, эмодзи. Это связано с тем, что нет возможности назначить «коллекционное» имя. Также боты не могут помещать себя во вкладку вкладку «вложений», так как это доступно только пользователям Telegram Ad Platform. Реклама, кстати, тоже есть. В основном, ей пользуется бот like. Посмотреть на рекламу можно здесь в asmico_ads.

Нельзя получить плашку FAKE или SCAM. Я прошерстил все публичные аккаунты и их диалоги — ни у кого нет этих предупреждающих плашек. Похоже, что они выдаются в ручном режиме.

Здесь мы плавно переходим от интересов пользователей к интересам разработчиков.

Инструменты разработчика


Тестовое окружение в первую очередь предназначено для разработчика. Как подключиться к нему из кода?

Запуск ботов


Практически в каждой статье о разработке ботов подробно изложено, как поговорить с BotFather и получить токен. Если попробовать это сделать в тестовом окружении, получить токен и передать его боту, случится ошибка и сервер его отклонит. Как заставить фреймворк подключиться к тестовому окружению?

Сперва внимательно взглянем на эндпоинты BotAPI.

# prod
https://api.telegram.org/bot123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11/getMe
# test
https://api.telegram.org/bot123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11/test/getMe


Для тестового окружения добавляется test между токеном и методом. Правила валидации токена не заданы, поэтому если фреймворк не мешает излишней проверкой, можно использовать «хак»: подставить /test прямо в токен.

# aiogram
from aiogram import Bot

bot = Bot("123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11/test")

# python-telegram-bot
from telegram.ext import ApplicationBuilder

app = ApplicationBuilder().token("123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11/test").build()

Фреймворки aiogram и python-telegram-bot отлично справляются с работой в тестовом окружении. Более никаких изменений в коде бота не требуется.

Локальный BotAPI-сервер


Эндпоинт api.telegram.org/bot — это надстройка над MTProto, которую можно развернуть локально. Зачем это нужно? Для обхода некоторых ограничений:

  • Загрузки файлов до 2 ГБ против 50 МБ при использовании публичного эндпоинта.
  • Использования «серых» адресов для WebHook на любом порту и без SSL.
  • Работы с файлами-вложениями по локальному пути.

Если вы хотите обойти ограничения, то telegram-bot-api придется собрать из исходников. Авторы позаботились о пользователях и оставили генератор команд для сборки под разные языки программирования и операционные системы.

Для запуска нужны параметры apid и api_hash, которые можно получить по инструкции из документации.

telegram-bot-api/build/telegram-bot-api --api-id=$API_ID --api-hash=$API_HASH --local
 -v 2 --http-ip-address=127.0.0.1

Для подключения к локальному BotAPI-серверу нужно об этом сказать фреймворку:

# aiogram
from aiogram import Bot<br>from aiogram.client.session.aiohttp import AiohttpSession

session = AiohttpSession(
    api=TelegramAPIServer.from_base('http://127.0.0.1:8081', is_local=True)
)
bot = Bot("TOKEN HERE", session=session)

# python-telegram-bot
from telegram.ext import ApplicationBuilder

app = ApplicationBuilder().base_url("http://127.0.0.1:8081/bot").local_mode(True).token("TOKEN HERE").build()


На этом колдовать с ботами заканчиваем — переходим к пользователям.

Автоматизация пользователей


Для запуска юзерботов (автоматизированных аккаунтов пользователей) и создания неофициальных клиентов Telegram нужно получить api_id и api_hash. Эти значения, как было указано ранее, можно получить на my.telegram.org.

Telegram отслеживает использование неофициальных приложений и может выдать бан за флуд, спам и накрутки. Также Telegram не любит клиентов, которые нарушают «безопасные» механики, например, сохраняют удаленные сообщения.

Если наказание за нарушение правил звучит слишком сурово, всегда можно начать разработку на «публичных» API_ID и API_HASH. В исходном коде приложений эти параметры есть, они отмечены как общедоступные. Их можно использовать для разработки и локальных тестов.

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

import asyncio
from pyrogram import Client

async def main():
    app = Client(
        api_id=APP_ID,
        api_hash=APP_HASH,
        test_mode=True,  # Вот этот параметр переключает между тестом и продом
        name="test",
        phone_number=PHONE,
        phone_code=PHONE[6] * 5,
        password="cfe6f8523f30-5c98-81f4-2bc3-4f936e7c"
    )
    await app.start()

С помощью pyrogram можно выполнять действия от имени пользователей — например, тестировать ботов. Я же использовал этот фреймворк, чтобы найти материалы для этой статьи. Ведь кто знает, что найдется на «публичных» аккаунтах.

Я обитаю не только в тестовом окружении, но и веду канал в «настоящем» Telegram, где периодически пишу на разные темы. Подписывайтесь!

Жизнь в тесте



При первом анализе я выявил, что в тестовом окружении на номера +999 зарегистрировано около 15 тыс аккаунтов, 13 тыс из которых — без облачного пароля.

В качестве простой, но визуально красивой задачи я выбрал «накрутку»: сбор пользователей с номером +999 в канале, который назвал Totally not a popular channel. Я выбрал именно этот путь, потому что в тестовом окружении уже существуют два канала на 21 и 29 тыс подписчиков, организованные аналогичным способом. Здесь важно уточнить, что я придерживался максимально мирного и недеструктивного поведения. ????


Благодаря эксперименту и правам администратора я дал возможность активным, но беспечным пользователям дать себя обнаружить.

Логика проста: если аккаунт вступил в канал — он без пароля. Если аккаунт после этого вышел из канала — значит, там кто-то есть и ему не нравится моя активность. Конечно, этот метод давал осечки: у некоторых пользователей был ровно один диалог с сервисным аккаунтом. Был это параноик, который все за собой убрал, или обещанная командой Telegram «чистка» для публичных аккаунтов — непонятно.

Параллельно нагнетанию подписчиков я оставил тест на внимательных пользователей. Сперва опубликовал первое сообщение в канале, а затем — подключил к каналу обсуждение. Таким образом, у канала есть чат для общения, но чтобы туда зайти, нужно найти кнопку View Channel Discussion. Людей такая загадка не смущала и они разделились на два типа:

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

Второй тип людей: пишут на арабском. Google не может внятно перевести сообщение. Иногда проскакивают русские маты, которые тут же удаляются. Склоняюсь к тому, что это обычные тролли.

Я немного прошерстил приметные аккаунты и подметил следующее:

  1. В тестовом окружении много арабских аккаунтов. У них встречаются диалоги с подозрительными ботами, которые занимаются каким-то операциями с криптовалютой. Пытаются знакомиться вообще со всеми.
  2. Есть два активных канала — на русском и иврите. Ими управляют люди, которые, кажется, все время проводят в тестовом окружении и активно реагируют на изменения.
  3. В тестовом окружении обитает группа сибирских школьников. Они активно знакомятся с другими русскоязычными аккаунтами.

Заключение


Тестовое окружение Telegram — это инструмент для разработчиков, который из-за своей доступности и многофункциональности привлекает различных «зевак» с разным техническим уровнем. Что думаете насчет всего этого вы? Поделитесь своим мнением и интересными историями в комментариях.

Другие интересные материалы


Комментарии (5)


  1. Kenya-West
    06.10.2023 19:18

    Отличная штука, чтобы тестировать сторонние (и официальные) клиенты Telegram. Кажется, для этого сие мероприятие с тестовым контуром и затевалось. Отладка TDLib, работа с данными, разным типом контента, E2E- и интеграционные тесты, это вот всё.

    В моём же случае (у меня десяток простых ботов) т. н. "личный тестовый контур" построен на проде: набор пабликов-пустышек, тестовых групп и несколько ботов с приставкой `test`. Вопрос в следующем - нет гарантий ведь, что мои группы и паблики на тестовом ДЦ Телеграма будут жить постоянно? Историю сообщений в них могут потереть? Их в любом случае потрут? А что будет при моём переезде на другую часть Светы? Так как тестовых ДЦ три штуки, я могу в ручном режиме подсоединиться к нужному (там, где лежат мои группы, боты и каналы)? Это ещё не считая вопроса, как будет работать, например, библиотека TelegrafJS с не-продом...


    1. Firemoon Автор
      06.10.2023 19:18
      +1

      В тестовом контуре под угрозой все аккаунты +999 и всё, что им подвластно.

      Личные аккаунты специально не удаляют. Мне даже кажется, что среди публичных аккаунтов я видел в контактах аккаунты, которые не заходили с 2020 года, хотя в tg максимальная настройка автоудаления при неактивности — год. К сожалению, пруфов предоставить не могу, так что к этому утверждению стоит относиться скептически.

      Что касается вопроса «а не удалят ли...?» в любой версии, то могу сказать, что многое зависит от наглости. Если каждую минуту загружать файлы по гигабайту, то, вероятно, и удалят и забанят. Я пошёл в тестовый контур искать старые каналы и вдруг увидел, что публичным аккаунтам запретили создавать ботов:

      Так что правила тестовый контур и правила игры на нём — лотерея. Но если не привлекать внимания, то риски снижаются.

      А про переезд на другой край Светы я не понял. Три тестовых ДЦ связаны между собой также, как десятки (сотни или тысячи?) продовых ДЦ. Если вы переедете, то ваши данные будут храниться в старом ДЦ, до тех пор, пока Телеграм не решит их мигрировать. А как решит, так вы будете подключаться к новому-ближайшему ДЦ. Миграция между ДЦ влияет на рабочий процесс (workflow) клиента, но не на доступность ваших данных.


      1. Firemoon Автор
        06.10.2023 19:18
        +2

        Нашёл доказательство, что личные аккаунты не сносятся в автоматическом режиме.


        1. OlegIva
          06.10.2023 19:18

          Если точнее - не все сносятся. Мой снесли энное время назад за отсутствие активности. Потом повторно на тот же самый номер регистрировался как в первый раз.


  1. LF69ssop
    06.10.2023 19:18

    Тестовые дата-центры — это полноценный Telegram, где, кажется, платные
    функции можно купить за «фантики». От этой мысли резко захотелось войти в
    тестовое окружение.

    Долго боролся со стремлением телеграмма добавлять всякую фигню типа сторисов. В итоге понял что самое простое заморозить версию. Теперь жду когда скажут что ее не поддерживают.

    Казалось бы, почему не выпускать отдельно версию чисто с основным функционалом, без всех этих эмоджей, стикеров, сторисов?