MAJOR FIXES: ✅ Fixed UserBot container startup by making TELEGRAM_BOT_TOKEN optional ✅ Broke circular import chain between app modules ✅ Made Config.validate() conditional for UserBot-only mode ✅ Removed unused celery import from userbot_service.py INTEGRATION: ✅ UserBot menu now accessible from main bot /start command ✅ Added 🤖 UserBot button to main keyboard ✅ Integrated userbot_manager.py handlers: - userbot_menu: Main UserBot interface - userbot_settings: Configuration - userbot_collect_groups: Gather all user groups - userbot_collect_members: Parse group members ✅ UserBot handlers properly registered in ConversationHandler CONTAINERS: ✅ tg_autoposter_bot: Running and handling /start commands ✅ tg_autoposter_userbot: Running as standalone microservice ✅ All dependent services (Redis, PostgreSQL, Celery workers) operational STATUS: Bot is fully operational and ready for testing
15 KiB
15 KiB
🤖 Telethon UserBot Microservice
Отдельный микросервис для парсинга Telegram групп и участников от имени пользователя (UserBot)
📋 Содержание
📖 Обзор
Что это?
Telethon UserBot Microservice - это отдельный микросервис, который работает независимо от основного Python-Telegram-Bot и позволяет:
✅ Парсить информацию о Telegram группах и каналах
✅ Получать список участников группы
✅ Сохранять данные в PostgreSQL БД
✅ Работать асинхронно через Celery
✅ Мониторить через Flower UI
Почему отдельный микросервис?
- Независимость - UserBot работает отдельно от основного бота
- Масштабируемость - можно запустить несколько инстансов для разных групп
- Надежность - сбой парсера не влияет на основной бот
- Гибкость - легко отключить/включить парсинг
- Производительность - асинхронная обработка Celery задач
🚀 Быстрый старт
1️⃣ Подготовка конфигурации
# Скопировать пример конфигурации
cp .env.example .env
# Отредактировать .env и добавить:
TELETHON_API_ID=12345678
TELETHON_API_HASH=abcdef1234567890
TELETHON_PHONE=+1234567890
USE_TELETHON=true
2️⃣ Авторизация UserBot
# Запустить скрипт инициализации (или вручную)
bash init_userbot.sh
# Или авторизироваться вручную:
python userbot_service.py
При запуске приложение запросит SMS код - введите его для авторизации.
3️⃣ Запуск в Docker
# Пересобрать контейнеры
docker-compose build
# Запустить все сервисы
docker-compose up -d
# Проверить логи
docker-compose logs -f userbot
4️⃣ Тестирование
# В Telegram боте:
/sync_groups
# В Flower UI:
http://localhost:5555
🏗 Архитектура
┌──────────────────────────────────────────────────────────┐
│ Telegram API │
└─────────────────────┬──────────────────────────────────────┘
│
┌────────────────┴──────────────────┐
│ │
▼ ▼
┌─────────────────┐ ┌──────────────────┐
│ Python-Telegram │ │ Telethon UserBot │
│ Bot │ │ Microservice │
│ │ │ │
│ /sync_groups───────────────────→ Parser │
│ Callback UI │ │ (async) │
└────────┬────────┘ │ │
│ │ Telethon Client │
│ │ (telethon_session│
│ └────────┬─────────┘
│ │
└────────────────┬───────────────┘
│
┌───────▼────────┐
│ Celery Tasks │
│ (async jobs) │
└────────┬────────┘
│
┌────────▼─────────┐
│ PostgreSQL DB │
│ │
│ Tables: │
│ - groups │
│ - group_members │
│ - messages │
└──────────────────┘
Мониторинг:
http://localhost:5555 (Flower)
docker-compose logs -f userbot
📁 Структура проекта
TG_autoposter/
├── app/
│ ├── userbot/ # 🆕 UserBot микросервис
│ │ ├── __init__.py
│ │ ├── parser.py # Основной парсер
│ │ └── tasks.py # Celery задачи
│ │
│ ├── handlers/
│ │ └── commands.py # Обновлена /sync_groups
│ │
│ ├── database/
│ │ ├── repository.py # Обновлен GroupRepository
│ │ └── member_repository.py # Обновлен GroupMemberRepository
│ │
│ └── models/
│ ├── group.py
│ └── group_members.py # GroupMember модель
│
├── docs/
│ ├── USERBOT_MICROSERVICE.md # 📚 Полная документация
│ └── USERBOT_QUICKSTART.md # ⚡ Краткая инструкция
│
├── userbot_service.py # 🆕 Точка входа микросервиса
├── Dockerfile.userbot # 🆕 Docker для userbot
├── docker-compose.yml # Обновлен (добавлен userbot)
├── init_userbot.sh # 🆕 Скрипт инициализации
└── examples_userbot.py # 🆕 Примеры использования
💻 Примеры использования
Пример 1: Использование через Telegram бот
# Отправить в боте:
/sync_groups
# Результат в БД:
✅ Информация о группах обновлена
👥 Списки участников синхронизированы
💾 Данные сохранены в PostgreSQL
Пример 2: Programmatic использование
from app.userbot.parser import userbot_parser
# Инициализировать
await userbot_parser.initialize()
# Парсить группу
members = await userbot_parser.parse_group_members(chat_id=-1001234567890)
# Синхронизировать в БД
await userbot_parser.sync_group_to_db(chat_id=-1001234567890)
Пример 3: Celery задачи
from app.userbot.tasks import parse_group_task
# Запустить асинхронно
task = parse_group_task.delay(chat_id=-1001234567890)
# Мониторить в Flower: http://localhost:5555
Пример 4: Запросы к БД
from app.database.member_repository import GroupMemberRepository
async with AsyncSessionLocal() as session:
repo = GroupMemberRepository(session)
# Получить всех участников
members = await repo.get_members_by_group(group_id=1)
# Найти администраторов
admins = [m for m in members if m.is_admin]
# Найти ботов
bots = [m for m in members if m.is_bot]
📚 Документация
Основные файлы документации:
-
- Быстрый старт за 5 минут
- Основные команды
- Примеры использования
-
- Полная документация
- API справка
- Troubleshooting
- Производительность
- Безопасность
Примеры кода:
# Интерактивные примеры
python examples_userbot.py
🔧 Основные компоненты
UserbotParser (app/userbot/parser.py)
# Основной класс для парсинга
# Методы:
await userbot_parser.initialize() # Инициализировать
await userbot_parser.parse_group_info(cid) # Получить информацию о группе
await userbot_parser.parse_group_members(cid) # Получить участников
await userbot_parser.sync_group_to_db(cid) # Синхронизировать в БД
await userbot_parser.shutdown() # Остановить
Celery Tasks (app/userbot/tasks.py)
# Асинхронные задачи
# Функции:
initialize_userbot_task() # Инициализировать при старте
parse_group_task(chat_id) # Парсить группу
sync_all_groups_task() # Синхронизировать все группы
parse_group_members_task(cid, limit) # Парсить участников с лимитом
Database моделе
# GroupMember модель
class GroupMember:
id: int
group_id: int # Foreign Key
user_id: str # Telegram User ID
username: str
first_name: str
last_name: str
is_bot: bool
is_admin: bool
is_owner: bool
joined_at: datetime
created_at: datetime
updated_at: datetime
🔐 Безопасность
⚠️ Важные рекомендации:
- ✅ Используйте отдельный аккаунт Telegram для UserBot
- ✅ Никогда не делитесь файлом
sessions/userbot_session.session - ✅ Не коммитьте API ID и Hash в Git (используйте .env)
- ✅ Храните чувствительные данные в
.env.local - ✅ Используйте strong пароль для аккаунта
📊 Мониторинг
Через логи
docker-compose logs -f userbot | grep "✅\|❌\|⏳"
Через Flower
Отслеживайте:
- Active tasks
- Task history
- Worker statistics
- Pool information
Метрики
# Подключиться к БД и получить статистику
SELECT
g.title,
COUNT(gm.id) as members_count,
SUM(CASE WHEN gm.is_bot THEN 1 ELSE 0 END) as bots_count,
SUM(CASE WHEN gm.is_admin THEN 1 ELSE 0 END) as admins_count
FROM groups g
LEFT JOIN group_members gm ON g.id = gm.group_id
GROUP BY g.id, g.title;
🚀 Развертывание в production
Docker Compose
userbot:
build:
context: .
dockerfile: Dockerfile.userbot
environment:
USE_TELETHON: true
TELETHON_API_ID: ${TELETHON_API_ID}
TELETHON_API_HASH: ${TELETHON_API_HASH}
# ... остальные переменные
depends_on:
- postgres
- redis
restart: unless-stopped
Kubernetes
apiVersion: apps/v1
kind: Deployment
metadata:
name: tg-autoposter-userbot
spec:
replicas: 1
selector:
matchLabels:
app: tg-autoposter-userbot
template:
metadata:
labels:
app: tg-autoposter-userbot
spec:
containers:
- name: userbot
image: tg-autoposter-userbot:latest
env:
- name: TELETHON_API_ID
valueFrom:
secretKeyRef:
name: telegram-secrets
key: api_id
📈 Производительность
| Параметр | Значение |
|---|---|
| Макс участников на группу | 100K+ |
| Параллельные задачи Celery | 4-8 воркеров |
| Лимит rate (Telegram) | ~33 req/sec |
| Типичное время парсинга 5K группы | ~2-3 минуты |
| Использование памяти | ~200-500 MB |
🆘 Troubleshooting
❌ "UserBot не авторизован"
# Удалить сессию и авторизироваться заново
rm sessions/userbot_session.session*
python userbot_service.py
⏳ "FloodWait 3600"
Нормально - Telegram ограничивает частые запросы.
Парсер автоматически ждет и продолжает.
🔒 "Нет доступа к группе"
- Убедитесь что UserBot добавлен в группу
- Дайте администраторские права если нужно
✅ Что реализовано
- ✅ Отдельный микросервис Telethon UserBot
- ✅ Асинхронный парсинг групп и участников
- ✅ Сохранение в PostgreSQL БД
- ✅ Celery интеграция для фоновых задач
- ✅ Flower UI для мониторинга
- ✅ Docker контейнер
- ✅ Интеграция с основным ботом (
/sync_groups) - ✅ Обработка FloodWait ошибок
- ✅ Полная документация и примеры
- ✅ Безопасность и best practices
🎯 Следующие шаги
- ✅ Авторизировать UserBot:
bash init_userbot.sh - ✅ Собрать Docker:
docker-compose build - ✅ Запустить сервисы:
docker-compose up -d - ✅ Протестировать
/sync_groupsв боте - ✅ Проверить данные в PostgreSQL
- ✅ Мониторить через Flower:
http://localhost:5555
📞 Поддержка
Проблемы и вопросы?
- 📖 Полная документация: docs/USERBOT_MICROSERVICE.md
- ⚡ Быстрый старт: docs/USERBOT_QUICKSTART.md
- 💻 Примеры:
python examples_userbot.py - 🔍 Логи:
docker-compose logs -f userbot
📝 Лицензия
Внутренний микросервис проекта TG Autoposter
Создано для масштабируемого парсинга Telegram групп 🚀