Процесс авторизации через API ID и хэш, двухфакторная аутентификация, управление сессиями.
Ключевая идея: Авторизация в Telethon — это многоэтапный процесс, который включает ввод номера телефона, получение кода подтверждения и (опционально) ввод пароля двухфакторной аутентификации. После успешного входа создаётся файл сессии, который хранит авторизационные данные.
При первом запуске Telethon проходит следующие шаги:
client.start() или client.send_code_request()client.sign_in()from telethon import TelegramClient
client = TelegramClient('my_session', api_id, api_hash)
# Автоматическая авторизация с интерактивным вводом
async def main():
await client.start(phone='+79991234567')
print('Авторизация успешна!')
with client:
client.loop.run_until_complete(main())Важно:
client.start()— это высокоуровневый метод, который автоматизирует весь процесс. При первом запуске он запросит номер телефона и код через терминал.
Если вам нужен полный контроль над процессом, используйте низкоуровневые методы:
async def manual_auth():
await client.connect()
# Проверяем, авторизованы ли мы уже
if not await client.is_user_authorized():
# Отправляем код на номер телефона
await client.send_code_request('+79991234567')
# Вводим код (в реальном приложении — из input())
code = input('Введите код: ')
await client.sign_in('+79991234567', code)
print('Готово!')Если на аккаунте включена облачная парольная защита (2FA), после ввода кода потребуется пароль:
from telethon.errors import SessionPasswordNeededError
async def auth_with_2fa():
await client.connect()
if not await client.is_user_authorized():
await client.send_code_request('+79991234567')
try:
await client.sign_in('+79991234567', input('Код: '))
except SessionPasswordNeededError:
# Требуется пароль 2FA
await client.sign_in(password=input('Пароль 2FA: '))Правило: исключение
SessionPasswordNeededErrorсигнализирует о необходимости ввода пароля. Без обработки этого исключения авторизация завершится ошибкой.
Метод is_user_authorized() проверяет, авторизован ли клиент:
async def check_auth():
if await client.is_user_authorized():
me = await client.get_me()
print(f'Авторизован как {me.first_name}')
else:
print('Требуется авторизация')
await client.start()Метод log_out() завершает текущую сессию и удаляет данные авторизации:
async def logout():
await client.log_out()
print('Сессия завершена')
# После этого client требует повторной авторизацииВажно:
log_out()полностью удаляет сессию. Для простого отключения используйтеclient.disconnect(), которое сохраняет сессию для следующего запуска.
Telethon может работать и с ботами через токен BotFather:
async def bot_auth():
await client.start(bot_token='123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11')
me = await client.get_me()
print(f'Бот: @{me.username}')| Параметр | Пользователь | Бот |
|---|---|---|
| Метод | Номер телефона + код | Токен от BotFather |
| Доступ | Полный пользовательский аккаунт | Ограничен Bot API |
| События | Все события Telegram | Только события бота |
| Лимиты | Лимиты пользовательского аккаунта | Лимиты бота (выше для отправки) |
Ключевая идея: авторизация бота через Telethon редко имеет смысл — для ботов лучше использовать
aiogram. Telethon shines при работе с пользовательскими аккаунтами.
Номер телефона должен быть в международном формате с плюсом:
# Правильно
'+79991234567'
'+1234567890'
# Неправильно — вызовет ошибку
'89991234567' # Внутренний формат (Россия)
'79991234567' # Без плюса
'+7 (999) 123-45-67' # С пробелами и скобкамиTelethon автоматически не форматирует номер. Неправильный формат приведёт к ошибке PhoneNumberInvalidError.
from telethon.errors import (
PhoneNumberInvalidError,
PhoneCodeInvalidError,
PhoneCodeExpiredError,
SessionPasswordNeededError,
FloodWaitError
)
async def safe_auth():
try:
await client.send_code_request('+79991234567')
except PhoneNumberInvalidError:
print('Неверный формат номера телефона')
except FloodWaitError as e:
print(f'Слишком много запросов. Ждём {e.seconds} сек')
try:
await client.sign_in('+79991234567', '12345')
except PhoneCodeInvalidError:
print('Неверный код подтверждения')
except PhoneCodeExpiredError:
print('Код истёк. Запросите новый')
except SessionPasswordNeededError:
print('Требуется пароль 2FA')| Ошибка | Причина | Решение |
|---|---|---|
PhoneNumberInvalidError | Неправильный формат номера | Используйте + и международный формат |
PhoneCodeInvalidError | Неверный код из SMS/приложения | Проверьте код, запросите новый |
PhoneCodeExpiredError | Код устарел (обычно 5 мин) | Запросите новый код |
SessionPasswordNeededError | Включена 2FA | Введите пароль через sign_in(password=...) |
FloodWaitError | Слишком частые запросы | Подождите указанное время |
ApiIdInvalidError | Неверный api_id/api_hash | Проверьте ключи с my.telegram.org |
В production-среде интерактивный ввод невозможен. Используйте строковые сессии:
from telethon.sessions import StringSession
# Генерация строковой сессии (делается один раз локально)
async def generate_string_session():
await client.start(phone='+79991234567')
session_string = client.session.save()
print(f'Строковая сессия: {session_string}')
# Сохраните эту строку в secure хранилище
# Использование в production
async def production_auth():
session_string = os.environ['TELETHON_SESSION']
client = TelegramClient(StringSession(session_string), api_id, api_hash)
await client.start()
print('Авторизация через строковую сессию')Правило: никогда не храните строковые сессии в коде или репозитории. Используйте переменные окружения или секретные менеджеры (Vault, AWS Secrets Manager).
После авторизации вы получаете полный доступ к API Telegram. Следующая тема — работа с сообщениями — научит вас отправлять, получать и управлять сообщениями.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.