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
443 lines
15 KiB
Markdown
443 lines
15 KiB
Markdown
# 🤖 Telethon UserBot Microservice
|
||
|
||
**Отдельный микросервис для парсинга Telegram групп и участников от имени пользователя (UserBot)**
|
||
|
||
## 📋 Содержание
|
||
|
||
- [Обзор](#обзор)
|
||
- [Быстрый старт](#быстрый-старт)
|
||
- [Архитектура](#архитектура)
|
||
- [Структура проекта](#структура-проекта)
|
||
- [Примеры использования](#примеры-использования)
|
||
- [Документация](#документация)
|
||
|
||
## 📖 Обзор
|
||
|
||
### Что это?
|
||
|
||
Telethon UserBot Microservice - это **отдельный микросервис**, который работает **независимо** от основного Python-Telegram-Bot и позволяет:
|
||
|
||
✅ Парсить информацию о Telegram группах и каналах
|
||
✅ Получать список участников группы
|
||
✅ Сохранять данные в PostgreSQL БД
|
||
✅ Работать асинхронно через Celery
|
||
✅ Мониторить через Flower UI
|
||
|
||
### Почему отдельный микросервис?
|
||
|
||
1. **Независимость** - UserBot работает отдельно от основного бота
|
||
2. **Масштабируемость** - можно запустить несколько инстансов для разных групп
|
||
3. **Надежность** - сбой парсера не влияет на основной бот
|
||
4. **Гибкость** - легко отключить/включить парсинг
|
||
5. **Производительность** - асинхронная обработка Celery задач
|
||
|
||
## 🚀 Быстрый старт
|
||
|
||
### 1️⃣ Подготовка конфигурации
|
||
|
||
```bash
|
||
# Скопировать пример конфигурации
|
||
cp .env.example .env
|
||
|
||
# Отредактировать .env и добавить:
|
||
TELETHON_API_ID=12345678
|
||
TELETHON_API_HASH=abcdef1234567890
|
||
TELETHON_PHONE=+1234567890
|
||
USE_TELETHON=true
|
||
```
|
||
|
||
### 2️⃣ Авторизация UserBot
|
||
|
||
```bash
|
||
# Запустить скрипт инициализации (или вручную)
|
||
bash init_userbot.sh
|
||
|
||
# Или авторизироваться вручную:
|
||
python userbot_service.py
|
||
```
|
||
|
||
При запуске приложение запросит SMS код - введите его для авторизации.
|
||
|
||
### 3️⃣ Запуск в Docker
|
||
|
||
```bash
|
||
# Пересобрать контейнеры
|
||
docker-compose build
|
||
|
||
# Запустить все сервисы
|
||
docker-compose up -d
|
||
|
||
# Проверить логи
|
||
docker-compose logs -f userbot
|
||
```
|
||
|
||
### 4️⃣ Тестирование
|
||
|
||
```bash
|
||
# В 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 бот
|
||
|
||
```bash
|
||
# Отправить в боте:
|
||
/sync_groups
|
||
|
||
# Результат в БД:
|
||
✅ Информация о группах обновлена
|
||
👥 Списки участников синхронизированы
|
||
💾 Данные сохранены в PostgreSQL
|
||
```
|
||
|
||
### Пример 2: Programmatic использование
|
||
|
||
```python
|
||
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 задачи
|
||
|
||
```python
|
||
from app.userbot.tasks import parse_group_task
|
||
|
||
# Запустить асинхронно
|
||
task = parse_group_task.delay(chat_id=-1001234567890)
|
||
|
||
# Мониторить в Flower: http://localhost:5555
|
||
```
|
||
|
||
### Пример 4: Запросы к БД
|
||
|
||
```python
|
||
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]
|
||
```
|
||
|
||
## 📚 Документация
|
||
|
||
### Основные файлы документации:
|
||
|
||
1. **[USERBOT_QUICKSTART.md](./docs/USERBOT_QUICKSTART.md)** ⚡
|
||
- Быстрый старт за 5 минут
|
||
- Основные команды
|
||
- Примеры использования
|
||
|
||
2. **[USERBOT_MICROSERVICE.md](./docs/USERBOT_MICROSERVICE.md)** 📖
|
||
- Полная документация
|
||
- API справка
|
||
- Troubleshooting
|
||
- Производительность
|
||
- Безопасность
|
||
|
||
### Примеры кода:
|
||
|
||
```bash
|
||
# Интерактивные примеры
|
||
python examples_userbot.py
|
||
```
|
||
|
||
## 🔧 Основные компоненты
|
||
|
||
### UserbotParser (app/userbot/parser.py)
|
||
|
||
```python
|
||
# Основной класс для парсинга
|
||
|
||
# Методы:
|
||
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)
|
||
|
||
```python
|
||
# Асинхронные задачи
|
||
|
||
# Функции:
|
||
initialize_userbot_task() # Инициализировать при старте
|
||
parse_group_task(chat_id) # Парсить группу
|
||
sync_all_groups_task() # Синхронизировать все группы
|
||
parse_group_members_task(cid, limit) # Парсить участников с лимитом
|
||
```
|
||
|
||
### Database моделе
|
||
|
||
```python
|
||
# 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 пароль для аккаунта
|
||
|
||
## 📊 Мониторинг
|
||
|
||
### Через логи
|
||
|
||
```bash
|
||
docker-compose logs -f userbot | grep "✅\|❌\|⏳"
|
||
```
|
||
|
||
### Через Flower
|
||
|
||
http://localhost:5555
|
||
|
||
Отслеживайте:
|
||
- Active tasks
|
||
- Task history
|
||
- Worker statistics
|
||
- Pool information
|
||
|
||
### Метрики
|
||
|
||
```bash
|
||
# Подключиться к БД и получить статистику
|
||
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
|
||
|
||
```yaml
|
||
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
|
||
|
||
```yaml
|
||
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 не авторизован"
|
||
|
||
```bash
|
||
# Удалить сессию и авторизироваться заново
|
||
rm sessions/userbot_session.session*
|
||
python userbot_service.py
|
||
```
|
||
|
||
### ⏳ "FloodWait 3600"
|
||
|
||
Нормально - Telegram ограничивает частые запросы.
|
||
Парсер автоматически ждет и продолжает.
|
||
|
||
### 🔒 "Нет доступа к группе"
|
||
|
||
1. Убедитесь что UserBot добавлен в группу
|
||
2. Дайте администраторские права если нужно
|
||
|
||
## ✅ Что реализовано
|
||
|
||
- ✅ Отдельный микросервис Telethon UserBot
|
||
- ✅ Асинхронный парсинг групп и участников
|
||
- ✅ Сохранение в PostgreSQL БД
|
||
- ✅ Celery интеграция для фоновых задач
|
||
- ✅ Flower UI для мониторинга
|
||
- ✅ Docker контейнер
|
||
- ✅ Интеграция с основным ботом (`/sync_groups`)
|
||
- ✅ Обработка FloodWait ошибок
|
||
- ✅ Полная документация и примеры
|
||
- ✅ Безопасность и best practices
|
||
|
||
## 🎯 Следующие шаги
|
||
|
||
1. ✅ Авторизировать UserBot: `bash init_userbot.sh`
|
||
2. ✅ Собрать Docker: `docker-compose build`
|
||
3. ✅ Запустить сервисы: `docker-compose up -d`
|
||
4. ✅ Протестировать `/sync_groups` в боте
|
||
5. ✅ Проверить данные в PostgreSQL
|
||
6. ✅ Мониторить через Flower: `http://localhost:5555`
|
||
|
||
## 📞 Поддержка
|
||
|
||
Проблемы и вопросы?
|
||
|
||
- 📖 Полная документация: [docs/USERBOT_MICROSERVICE.md](./docs/USERBOT_MICROSERVICE.md)
|
||
- ⚡ Быстрый старт: [docs/USERBOT_QUICKSTART.md](./docs/USERBOT_QUICKSTART.md)
|
||
- 💻 Примеры: `python examples_userbot.py`
|
||
- 🔍 Логи: `docker-compose logs -f userbot`
|
||
|
||
## 📝 Лицензия
|
||
|
||
Внутренний микросервис проекта TG Autoposter
|
||
|
||
---
|
||
|
||
**Создано для масштабируемого парсинга Telegram групп 🚀**
|