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

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

  1. Зарегистрируйтесь в официальном приложении

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

  2. Войдите на my.telegram.org

    Откройте https://my.telegram.org, введите номер в международном формате (+7..., +998...) и полученный код подтверждения.

  3. Откройте «API development tools»

    В этом разделе находится форма создания приложения.

  4. Заполните форму

    Укажите название приложения, короткое имя и остальные поля. По ToS в названии не должно быть слова «Telegram» (допускается только после слова «Unofficial»), а официальный логотип Telegram использовать нельзя.

  5. Сохраните api_id и api_hash

    На странице появятся api_id, api_hash и адреса серверов MTProto. Не храните ключи в коде: используйте переменные окружения TELEGRAM_API_ID и TELEGRAM_API_HASH или хранилище секретов.

  6. Подключите в Socialift (по желанию)

    В кабинете в разделе Kalitlar (ключи) → Telegram введите api_id и api_hash — они хранятся в зашифрованном виде и проверяются в Telegram. Затем в Ulanishlar (подключения) → аккаунт Telegram подключите аккаунт: телефон → код → при необходимости пароль 2FA.

Telegram API Terms of Service: на что обратить внимание

Ключевые пункты официальной страницы «Creating your Telegram Application» и API Terms of Service.

Telegram 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 из первого шага действителен только внутри той же промежуточной сессии, поэтому передавайте на второй шаг и то, и другое.

telegram_login.py
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 — только через форму вашего приложения.

Повторное подключение по сохранённой сессии

reconnect.py
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 tg

connect() только открывает соединение и не проверяет авторизацию, поэтому 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

flood_wait.py
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. Затем храните новую сессию только в зашифрованном виде и найдите источник утечки.

Источники

  1. Telegram: Creating your Telegram Application (api_id)
  2. Telegram API Terms of Service
  3. Telegram: User Authorization
  4. Telegram: Error handling (FLOOD_WAIT, AUTH_KEY_DUPLICATED)

Связанные страницы