Типы сессий (файловые, строковые, PostgreSQL, Redis), миграция между форматами, безопасность.
Ключевая идея: Сессия — это файл или запись в базе данных, которая хранит авторизационные данные пользователя. Правильный выбор типа сессии критичен для безопасности и удобства деплоя.
Telethon поддерживает несколько типов хранения сессий:
| Тип | Класс | Хранение | Подходит для |
|---|---|---|---|
| Файловая SQLite | SQLiteSession (по умолчанию) | Файл .session | Локальная разработка |
| Строковая | StringSession | Строка в памяти | Production, Docker |
| В памяти | MemorySession | RAM (теряется при перезапуске) | Тестирование |
| PostgreSQL | PostgreSQLSession | Таблица в PostgreSQL | Production, кластеры |
| Redis | через сторонние библиотеки | Redis | Высоконагруженные системы |
По умолчанию Telethon создаёт SQLite-файл:
client = TelegramClient('my_session', api_id, api_hash)
# Создаст файл my_session.session в текущей директорииСтроковая сессия — это сериализованные данные авторизации в виде одной строки:
from telethon.sessions import StringSession
# Генерация (делается один раз)
async def generate_session():
client = TelegramClient('temp_session', api_id, api_hash)
await client.start()
# Сохраняем строку
session_string = client.session.save()
print(f'Сохрани эту строку: {session_string}')
await client.disconnect()
# Использование
async def use_session():
session_string = '1ApWapzMBu4sKb7...' # Ваша строка
client = TelegramClient(
StringSession(session_string),
api_id,
api_hash
)
await client.start()
print('Авторизован через строковую сессию')Ключевая идея: строковая сессия не создаёт файлов. Это идеально для Docker, serverless и любых сред, где файловая система эфемерна.
# Хранение в переменной окружения (рекомендуется)
import os
session_string = os.environ['TELETHON_SESSION']
client = TelegramClient(StringSession(session_string), api_id, api_hash)Правило: никогда не храните строковую сессию в коде или репозитории. Используйте переменные окружения или секретные менеджеры (Vault, AWS Secrets Manager).
from telethon.sessions import MemorySession
client = TelegramClient(MemorySession(), api_id, api_hash)
# Сессия существует только в RAM и теряется при завершении процессаДля использования PostgreSQL требуется установка дополнительных зависимостей:
from telethon.sessions import PostgreSQLSession
# Подключение к PostgreSQL
client = TelegramClient(
PostgreSQLSession(
database='telethon',
user='telethon_user',
password='secret',
host='localhost',
port=5432
),
api_id,
api_hash
)# Загружаем файловую сессию
client = TelegramClient('my_session', api_id, api_hash)
await client.start()
# Конвертируем в строку
string_session = client.session.save()
print(string_session)
await client.disconnect()from telethon.sessions import StringSession, SQLiteSession
# Загружаем строковую
string_session = StringSession('ваша_строка')
client = TelegramClient(string_session, api_id, api_hash)
await client.start()
# Сохраняем в файл
client.session.save() # По умолчанию сохранит в текущую сессиюВы можете создать собственный класс сессии, наследовав от Session:
from telethon.sessions import Session
class MyCustomSession(Session):
def clone(self):
return MyCustomSession()
def close(self):
# Закрытие соединения
pass
def save(self):
# Сохранение данных
pass
# Реализуйте остальные методы...Важно: кастомные сессии требуют глубокого понимания внутреннего устройства Telethon. Для большинства случаев достаточно встроенных типов.
client = TelegramClient('dev_session', api_id, api_hash)client = TelegramClient(
StringSession(os.environ['TELETHON_SESSION']),
api_id,
api_hash
)client = TelegramClient(
PostgreSQLSession(...),
api_id,
api_hash
)client = TelegramClient(MemorySession(), api_id, api_hash)import os
from pathlib import Path
# Для файловых сессий — ограничиваем доступ
session_file = Path('my_session.session')
session_file.chmod(0o600) # Только владелец может читать/писать
# Для строковых — переменные окружения
assert 'TELETHON_SESSION' in os.environ, 'Сессия не найдена в окружении'Для дополнительной защиты можно зашифровать строковую сессию:
from cryptography.fernet import Fernet
# Генерация ключа (сохраните его безопасно!)
key = Fernet.generate_key()
cipher = Fernet(key)
# Шифрование
encrypted = cipher.encrypt(session_string.encode())
# Дешифрование
decrypted = cipher.decrypt(encrypted).decode()Правило: шифрование добавляет слой защиты, но не заменяет безопасное хранение ключа. Ключ должен храниться отдельно от зашифрованных данных.
После настройки хранения сессий важно обеспечить надёжную обработку ошибок. Следующая тема — обработка ошибок и исключений — научит вас создавать устойчивые к сбоям приложения.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.