api_id и api_hash Telegram: получение, безопасность и правила
api_id и api_hash — ключи вашего приложения для работы с MTProto API Telegram. Их бесплатно выдают на my.telegram.org: войдите по номеру Telegram и заполните форму в «API development tools»; к одному номеру привязывается только один api_id. Сами ключи не дают доступа к аккаунту: вход идёт по телефону, коду и паролю 2FA, а результат — секретная строка сессии.
Обновлено:
Что такое api_id и api_hash?
api_id (число) и api_hash (строка) сообщают серверу Telegram, из какого приложения пришёл запрос. Они передаются вместе с номером телефона при входе через MTProto, например в вызове auth.sendCode. Это не пароль пользователя: с одним api_id подключается много аккаунтов, и у каждого свой код и своя сессия.
Для Bot API api_id не нужен — там достаточно токена BotFather. api_id требуется интеграциям, работающим от имени пользовательского аккаунта: полная история переписки, участники групп, отложенные сообщения и другие возможности, закрытые для ботов.
Telegram API бесплатен. Но каждое приложение обязано соблюдать API Terms of Service, и Telegram может отключить доступ к API нарушителю.
Как получить api_id на my.telegram.org
Зарегистрируйтесь в официальном приложении
Требование Telegram: аккаунт должен быть создан через официальное приложение. Используйте активный номер, который принадлежит вам, — на него приходят важные уведомления для разработчиков.
Войдите на my.telegram.org
Откройте https://my.telegram.org, введите номер в международном формате (+7..., +998...) и полученный код подтверждения.
Откройте «API development tools»
В этом разделе находится форма создания приложения.
Заполните форму
Укажите название приложения, короткое имя и остальные поля. По ToS в названии не должно быть слова «Telegram» (допускается только после слова «Unofficial»), а официальный логотип Telegram использовать нельзя.
Сохраните api_id и api_hash
На странице появятся api_id, api_hash и адреса серверов MTProto. Не храните ключи в коде: используйте переменные окружения TELEGRAM_API_ID и TELEGRAM_API_HASH или хранилище секретов.
Подключите в Socialift (по желанию)
В кабинете в разделе Kalitlar (ключи) → Telegram введите api_id и api_hash — они хранятся в зашифрованном виде и проверяются в Telegram. Затем в Ulanishlar (подключения) → аккаунт Telegram подключите аккаунт: телефон → код → при необходимости пароль 2FA.
Telegram API Terms of Service: на что обратить внимание
Ключевые пункты официальной страницы «Creating your Telegram Application» и API Terms of Service.
| Правило | Что сказано | На практике |
|---|---|---|
| Собственный api_id (2.1) | Каждое приложение обязано получить свой api_id. Демонстрационный api_id из открытого кода ограничен на сервере | Не копируйте чужой api_id: демо-ключ даёт пользователям ошибку API_ID_PUBLISHED_FLOOD |
| Согласие пользователя (1.4) | Запрещено действовать от имени пользователя без его ведома и согласия, а также искажать статусы прочтения («режим призрака») | Владелец аккаунта должен знать о каждом автоматическом действии и соглашаться с ним |
| Спам и накрутка | Использование API для флуда, спама, накрутки подписчиков и просмотров каналов — вечный бан | Откажитесь от массовых рассылок, массовых инвайтов и накрутки |
| Наблюдение | Все аккаунты, входящие через неофициальные клиенты, автоматически ставятся под наблюдение | Используйте аккаунт умеренно, как живой человек |
| Прозрачность (2.2–2.4) | Пользователи должны знать, что приложение использует Telegram API; без «Telegram» в названии и без официального логотипа | Для публичного приложения напишите об этом в описании |
| Данные и ИИ (1.5) | Запрещено использовать данные из Telegram для обучения или дообучения моделей ИИ и ML | Не отдавайте выгруженную переписку на обучение моделей |
| Нарушения (4.1–4.2) | Telegram уведомляет аккаунт, ответственный за приложение; если не исправить за 10 дней, доступ к API отключают | Держите номер на my.telegram.org активным и следите за уведомлениями |
Процесс входа: телефон → код → пароль 2FA
В веб-приложении вход делится на два HTTP-запроса. phone_code_hash из первого шага действителен только внутри той же промежуточной сессии, поэтому передавайте на второй шаг и то, и другое.
import os
from socialift import TelegramAccount
API_ID = int(os.environ["TELEGRAM_API_ID"])
API_HASH = os.environ["TELEGRAM_API_HASH"]
async def start_login(phone: str) -> dict:
async with TelegramAccount(api_id=API_ID, api_hash=API_HASH) as tg:
return await tg.send_code(phone) # phone_code_hash + промежуточная session
async def finish_login(phone: str, code: str, sent: dict, password: str | None = None) -> str:
async with TelegramAccount(api_id=API_ID, api_hash=API_HASH,
session=sent["session"]) as tg:
result = await tg.sign_in(phone, code, phone_code_hash=sent["phone_code_hash"])
if result["two_factor_required"]:
result = await tg.sign_in_password(password)
return tg.export_session() # равна паролю — храните зашифрованнойЕсли аккаунт открыт на другом устройстве, код может прийти служебным сообщением в приложение Telegram; в некоторых случаях SMS отправляется только официальным приложениям. При включённой двухэтапной защите Telegram возвращает SESSION_PASSWORD_NEEDED — SDK отдаёт это не как ошибку, а как two_factor_required: True. Пароль проверяется по протоколу SRP.
Telegram аннулирует код входа, как только его отправили или переслали в другой чат. Поэтому никогда не просите пользователя прислать код сообщением в Telegram — только через форму вашего приложения.
Повторное подключение по сохранённой сессии
import os
from socialift import TelegramAccount
async def get_account() -> TelegramAccount:
tg = TelegramAccount(api_id=int(os.environ["TELEGRAM_API_ID"]),
api_hash=os.environ["TELEGRAM_API_HASH"],
session=os.environ["TELEGRAM_SESSION"])
await tg.connect()
if not await tg.is_authorized():
await tg.disconnect()
raise RuntimeError("Сессия отозвана — нужен повторный вход")
return tgconnect() только открывает соединение и не проверяет авторизацию, поэтому is_authorized() вызывается отдельно. Если пользователь завершил сессию в разделе «Устройства», результат будет False.
Как безопасно хранить строку сессии
Строка из export_session() даёт полный доступ к аккаунту — без кода, пароля и 2FA.
- Храните в базе только в зашифрованном виде (например, через KMS или отдельный ключ шифрования) и не держите ключ рядом с базой.
- Не выводите сессию в логи, мониторинг ошибок и браузер.
- Не используйте одну сессию одновременно в двух процессах: увидев параллельные основные соединения одной авторизации, Telegram вернёт AUTH_KEY_DUPLICATED и аннулирует сессию — понадобится повторный вход.
- Отдельная сессия для каждого аккаунта; не копируйте одну строку между серверами.
- Ненужную сессию закрывайте через
log_out(); чужие устройства проверяйте и завершайте черезsessions()иreset_session(). - При новом входе другие сессии аккаунта получают уведомление — предупредите владельца аккаунта заранее.
Риск бана и FLOOD_WAIT: ответственное использование
Telegram автоматически наблюдает за аккаунтами, вошедшими через неофициальные клиенты. Если метод вызывается чаще допустимого, сервер возвращает 420 FLOOD_WAIT_X: действие нельзя повторить, пока не пройдут X секунд. Попытки входа тоже ограничены — число попыток для одного номера в сутки лимитировано (Telegram приводит пример в 5 попыток и оговаривает, что значение может меняться).
Снизить риск просто: действуйте со скоростью живого человека, не рассылайте массовые сообщения незнакомым людям и не добавляйте их в группы пачками, выжидайте время из FLOOD_WAIT и не повторяйте запросы бесконечно. SDK превращает FLOOD_WAIT в RateLimitError, а секунды ожидания кладёт в retry_after.
Если вы ничего не нарушали, но аккаунт заблокировали после работы с API, Telegram советует написать на recover@telegram.org и объяснить, что вы собираетесь делать с API. Письма читает человек — автоматически сгенерированные письма распознаются и блокируются.
Обработка FLOOD_WAIT
import asyncio
from socialift import RateLimitError
async def send_report(tg, text: str) -> None:
try:
await tg.send_message("@my_group", text)
except RateLimitError as exc: # Telegram: FLOOD_WAIT_X
if (exc.retry_after or 0) > 300:
raise # долгое ожидание — отложите задачу
await asyncio.sleep(exc.retry_after or 5)
await tg.send_message("@my_group", text)SDK не ждёт длинный FLOOD_WAIT сам — это решение за вами. Перенос долгих ожиданий в очередь фоновых задач не «замораживает» приложение.
Частые вопросы
Получить api_id и api_hash — это платно?
Нет. Telegram предоставляет API бесплатно, получение ключей на my.telegram.org тоже бесплатно. Обязательное условие — соблюдать API Terms of Service.
Сколько api_id можно получить на один номер?
Согласно официальной документации, сейчас к одному номеру привязывается только один api_id. При этом с одним api_id может входить сколько угодно пользовательских аккаунтов — у каждого своя сессия.
Можно ли делиться api_hash с другими?
Не рекомендуется. api_hash идентифицирует ваше приложение: нарушения через него засчитываются вашему приложению, а уведомления Telegram отправляет аккаунту, ответственному за приложение. Храните ключи в хранилище секретов.
Нужен ли api_id для Telegram-бота?
Для бота на Bot API — нет, хватает токена BotFather. Если же вы авторизуете бота через MTProto (auth.importBotAuthorization), api_id и api_hash там тоже обязательны.
Аккаунт заблокировали после использования API. Что делать?
Если вы не нарушали правила, напишите на recover@telegram.org, объясните, для чего используете API, и попросите разблокировать аккаунт. Пишите письмо сами: автоматически сгенерированные письма распознаются и блокируются.
Что делать, если строку сессии украли?
Сразу завершите чужую сессию в разделе «Устройства» (Devices) приложения Telegram или через sessions() и reset_session() в SDK. Затем храните новую сессию только в зашифрованном виде и найдите источник утечки.