June 26

Документация AssistantBot

📋 Оглавление

  1. Описание проекта
  2. Архитектура системы
  3. Установка и настройка
  4. Конфигурация
  5. Команды бота
  6. API и интеграции
  7. База данных
  8. Развертывание
  9. Мониторинг и логирование
  10. Устранение неполадок
  11. Разработка

🎯 Описание проекта

AssistantBot — это автоматизированный Telegram-бот для управления клиентскими коммуникациями с интеграцией Google Sheets. Бот автоматически отправляет запланированные сообщения клиентам, синхронизирует данные с Google Таблицами и предоставляет администраторам мощные инструменты для мониторинга и управления.

✨ Основные возможности

  • 🕐 Автоматическая отправка сообщений по расписанию
  • 📊 Синхронизация с Google Sheets в реальном времени
  • 👥 Управление клиентами через Telegram интерфейс
  • 📱 Мониторинг просроченных задач и уведомлений
  • 🔍 Детальное логирование всех операций
  • 🛡️ Разграничение прав доступа для администраторов и пользователей
  • 🔄 Автоматическое восстановление после сбоев

🏗️ Архитектура системы

Компоненты системы

┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐
│   Telegram Bot  │    │  Google Sheets  │    │   SQLite DB     │
│                 │    │                 │    │                 │
│ • Commands      │◄──►│ • Users Data    │◄──►│ • Schedule      │
│ • Callbacks     │    │ • Schedule      │    │ • Logs          │
│ • Messages      │    │ • Status        │    │ • Users         │
└─────────────────┘    └─────────────────┘    └─────────────────┘
         ▲                       ▲                       ▲
         │                       │                       │
         ▼                       ▼                       ▼
┌─────────────────────────────────────────────────────────────────┐
│                    APScheduler Engine                           │
│                                                                 │
│ • Task Scheduling    • Job Management    • Automatic Retry     │
└─────────────────────────────────────────────────────────────────┘

Структура проекта

tg-assistant-bot/
├── app/
│   ├── core/                   # Основные настройки
│   │   ├── config.py          # Конфигурация
│   │   └── logging_config.py  # Настройки логирования
│   ├── db/                    # База данных
│   │   ├── database.py        # Подключение к БД
│   │   ├── models.py          # Модели данных
│   │   └── crud.py            # CRUD операции
│   ├── handlers/              # Обработчики команд
│   │   ├── admin_commands.py  # Команды администратора
│   │   ├── user_commands.py   # Пользовательские команды
│   │   └── callbacks.py       # Callback обработчики
│   ├── services/              # Внешние сервисы
│   │   └── google_sheets.py   # Интеграция с Google Sheets
│   ├── business_logic.py      # Бизнес-логика
│   ├── scheduler_setup.py     # Настройка планировщика
│   └── main.py               # Точка входа
├── logs/                     # Логи приложения
├── requirements.txt          # Python зависимости
├── service_account.json      # Ключи Google API
├── .env                      # Переменные окружения
└── README.md                # Описание проекта

🚀 Установка и настройка

Системные требования

  • Python: 3.9+
  • ОС: Ubuntu 20.04+ / Windows 10+ / macOS 11+
  • RAM: минимум 512MB
  • Диск: 1GB свободного места

Установка зависимостей

# Клонирование репозитория
git clone https://github.com/your-repo/tg-assistant-bot.git
cd tg-assistant-bot

# Создание виртуального окружения
python -m venv venv

# Активация окружения
# Linux/macOS:
source venv/bin/activate
# Windows:
venv\Scripts\activate

# Установка зависимостей
pip install -r requirements.txt

Основные зависимости

python-telegram-bot==20.7
google-api-python-client==2.108.0
gspread==5.12.0
SQLAlchemy==2.0.23
APScheduler==3.10.4
loguru==0.7.2
pydantic==2.5.0
pydantic-settings==2.1.0

⚙️ Конфигурация

Переменные окружения (.env)

# Telegram Bot Token
BOT_TOKEN=your_bot_token_here

# Администраторы (ID через запятую)
ADMIN_TELEGRAM_IDS=123456789,987654321

# Google Sheets
GOOGLE_SHEETS_ID=your_google_sheets_id
SERVICE_ACCOUNT_FILE=service_account.json

# База данных
DB_URL=sqlite:///bot_database.db

# Настройки
TIMEZONE=Europe/Moscow
LOG_LEVEL=INFO

Настройка Google Sheets API

  1. Создайте проект в Google Cloud Console
  2. Включите Google Sheets API
  3. Создайте Service Account
  4. Скачайте JSON ключ и сохраните как service_account.json
  5. Предоставьте доступ Service Account к вашей таблице

Структура Google Sheets

Лист "Users"

Листы клиентов (например, "101")


🤖 Команды бота

Пользовательские команды

/start 🚀 Запуск бота и приветствие

/roman_dusenko 👤 Информация о Романе Дусенко

/usp 💼 О разработчике

Административные команды

/sync 🔄 Принудительная синхронизация данных

/expired ⏰ Просроченные сообщения

/nearest 📅 Ближайшие запланированные сообщения

/log 📄 Просмотр логов бота

/status 📊 Статус и информация о боте

/noty🔔 Расписание уведомлений клиентов

/add_user➕ Добавить нового клиента

/debug_expired🔍 Отладка просроченных сообщений

Интерактивные элементы

  • Кнопки навигации по логам и сообщениям
  • Быстрые действия для отправки просроченных сообщений
  • Подтверждения для критических операций

🔗 API и интеграции

Google Sheets API

class GoogleSheetsService:
    def fetch_users(self) -> List[Dict]
    def fetch_schedule(self, tab_name: str) -> List[Dict]
    def update_status(self, tab_name: str, target_datetime_str: str, 
                     target_time_str: str, target_text: str, new_status: str)
    def append_user_row(self, user_data: Dict) -> bool
    def clone_example_tab(self, new_tab_name: str, start_date: str) -> bool

Telegram Bot API

  • Webhook или Long Polling режимы
  • Обработка текстовых сообщений
  • Callback Query для интерактивных кнопок
  • Message Reactions для быстрых ответов
  • File uploads для логов и отчетов

💾 База данных

Модели данных

User (Пользователи)

CREATE TABLE users (
    id INTEGER PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    username VARCHAR(255),
    telegram_id INTEGER,
    chat_id INTEGER,
    thread_id INTEGER,
    tab_name VARCHAR(255),
    start_date DATE,
    active BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP,
    updated_at TIMESTAMP
);

ScheduleEntry (Расписание)

CREATE TABLE schedule_entries (
    id INTEGER PRIMARY KEY,
    user_id INTEGER REFERENCES users(id),
    scheduled_datetime_utc TIMESTAMP,
    message_text TEXT,
    status VARCHAR(50),
    bot_message_id INTEGER,
    sent_at TIMESTAMP,
    answer_text TEXT,
    answered_at TIMESTAMP,
    created_at TIMESTAMP,
    updated_at TIMESTAMP
);

BotLog (Логи)

CREATE TABLE bot_logs (
    id INTEGER PRIMARY KEY,
    level VARCHAR(20),
    message TEXT,
    event_type VARCHAR(100),
    details TEXT,
    timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CRUD операции

# Основные операции
crud.create_user(db, user_data)
crud.get_user_by_username(db, username)
crud.get_active_users(db)
crud.create_schedule_entry(db, entry_data)
crud.update_schedule_entry_status(db, entry_id, new_status)
crud.log_bot_event(db, level, message, event_type, details)

🚀 Развертывание

Локальный запуск

# Активация окружения
source venv/bin/activate

# Запуск бота
python -m app.main

Развертывание на Ubuntu Server

1. Подготовка сервера

# Обновление системы
sudo apt update && sudo apt upgrade -y

# Установка Python и зависимостей
sudo apt install python3 python3-pip python3-venv git -y

# Клонирование проекта
git clone https://github.com/your-repo/tg-assistant-bot.git
cd tg-assistant-bot

2. Настройка systemd сервиса

# Создание файла сервиса
sudo nano /etc/systemd/system/assistant-bot.service
[Unit]
Description=🤖 AssistantBot - Telegram Bot Service
After=network.target
Wants=network.target

[Service]
Type=simple
User=deploy
Group=deploy
WorkingDirectory=/home/deploy/tg-assistant-bot
Environment=PATH=/home/deploy/tg-assistant-bot/venv/bin
ExecStart=/home/deploy/tg-assistant-bot/venv/bin/python -m app.main
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
SyslogIdentifier=assistant-bot

Environment=PYTHONPATH=/home/deploy/tg-assistant-bot
Environment=PYTHONUNBUFFERED=1

[Install]
WantedBy=multi-user.target

3. Запуск сервиса

# Перезагрузка конфигурации
sudo systemctl daemon-reload

# Включение автозапуска
sudo systemctl enable assistant-bot.service

# Запуск сервиса
sudo systemctl start assistant-bot.service

# Проверка статуса
sudo systemctl status assistant-bot.service

Docker развертывание

Dockerfile

FROM python:3.11-slim

RUN apt-get update && apt-get install -y gcc && rm -rf /var/lib/apt/lists/*
RUN useradd --create-home --shell /bin/bash botuser

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .
RUN chown -R botuser:botuser /app
USER botuser

CMD ["python", "-m", "app.main"]

docker-compose.yml

version: '3.8'

services:
  assistant-bot:
    build: .
    container_name: assistant-bot
    restart: unless-stopped
    volumes:
      - ./logs:/app/logs
      - ./service_account.json:/app/service_account.json:ro
      - ./bot_database.db:/app/bot_database.db
    environment:
      - PYTHONUNBUFFERED=1
    networks:
      - bot-network

networks:
  bot-network:
    driver: bridge

📊 Мониторинг и логирование

Система логирования

Бот использует loguru для красивого и структурированного логирования:

# Примеры логов
logger.info("🚀 Запуск AssistantBot...")
logger.warning("⏳ Таймаут соединения с Telegram API")
logger.error("❌ Ошибка при синхронизации данных")

Уровни логирования

  • DEBUG: Детальная отладочная информация
  • INFO: Общая информация о работе
  • WARNING: Предупреждения о потенциальных проблемах
  • ERROR: Ошибки в работе
  • CRITICAL: Критические ошибки

Просмотр логов

# Логи systemd сервиса
sudo journalctl -u assistant-bot.service -f

# Файловые логи
tail -f logs/bot.log

# Логи в боте
/log - команда для просмотра через Telegram

Мониторинг состояния

  • Проверка здоровья каждые 60 секунд
  • Автоматическое восстановление при сбоях
  • Уведомления администраторов о критических ошибках
  • Статистика планировщика задач

🔧 Устранение неполадок

Частые проблемы

1. Ошибки подключения к Telegram API

Симптомы:

telegram.error.TimedOut: Timed out
httpcore.ConnectTimeout

Решение:

  • Проверьте интернет соединение
  • Убедитесь, что токен бота корректный
  • Проверьте настройки прокси (если используется)

2. Ошибки Google Sheets API

Симптомы:

gspread.exceptions.APIError: [403] Forbidden

Решение:

  • Проверьте права доступа Service Account к таблице
  • Убедитесь, что Google Sheets API включен
  • Проверьте корректность service_account.json

3. Ошибки базы данных

Симптомы:

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) database is locked

Решение:

  • Остановите все экземпляры бота
  • Проверьте права доступа к файлу БД
  • Убедитесь, что только один процесс использует БД

4. Проблемы с планировщиком

Симптомы:

Run time of job was missed by X days

Решение:

  • Это нормально при перезапуске бота
  • Задачи автоматически переносятся или выполняются
  • Используйте /sync для принудительной синхронизации

Диагностические команды

# Проверка статуса сервиса
sudo systemctl status assistant-bot.service

# Просмотр логов
sudo journalctl -u assistant-bot.service -n 100

# Проверка процессов
ps aux | grep python

# Проверка портов
netstat -tlnp | grep python

# Тест подключения к Telegram
curl -s "https://api.telegram.org/bot$BOT_TOKEN/getMe"

Восстановление после сбоя

  1. Остановите сервисsudo systemctl stop assistant-bot.service
  2. Проверьте логиsudo journalctl -u assistant-bot.service -n 50
  3. Исправьте проблему (конфигурация, права доступа и т.д.)
  4. Перезапустите сервисsudo systemctl start assistant-bot.service

👨‍💻 Разработка

Структура кода

Основные модули

  • main.py: Точка входа, инициализация бота
  • business_logic.py: Основная бизнес-логика
  • scheduler_setup.py: Настройка планировщика задач

Обработчики

  • admin_commands.py: Команды для администраторов
  • user_commands.py: Пользовательские команды
  • callbacks.py: Обработчики inline кнопок

Сервисы

  • google_sheets.py: Интеграция с Google Sheets
  • database.py: Работа с базой данных

Добавление новых команд

# В admin_commands.py или user_commands.py
async def new_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user = update.effective_user
    
    # Проверка прав доступа (для админ команд)
    if user.id not in settings.admin_telegram_ids:
        await update.message.reply_text("❌ Нет доступа")
        return
    
    # Логика команды
    await update.message.reply_text("✅ Команда выполнена")

# В main.py
application.add_handler(CommandHandler("new_command", new_command))

Добавление новых callback обработчиков

# В callbacks.py
async def handle_new_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    
    # Логика обработки
    await query.edit_message_text("✅ Обработано")

# В main.py
application.add_handler(CallbackQueryHandler(
    callbacks.handle_new_callback, 
    pattern=r"^new_pattern_\d+quot;
))

Работа с базой данных

# Создание новой модели
class NewModel(Base):
    __tablename__ = "new_table"
    
    id = Column(Integer, primary_key=True)
    name = Column(String(255))
    created_at = Column(DateTime, default=datetime.utcnow)

# CRUD операции
def create_new_record(db: Session, data: dict):
    record = NewModel(**data)
    db.add(record)
    db.commit()
    db.refresh(record)
    return record

Тестирование

# Установка тестовых зависимостей
pip install pytest pytest-asyncio

# Запуск тестов
pytest tests/

# Тестирование конкретного модуля
pytest tests/test_business_logic.py -v

Стиль кода

  • PEP 8 для форматирования
  • Type hints для всех функций
  • Docstrings для публичных методов
  • Логирование для всех важных операций
async def example_function(user_id: int, message: str) -> bool:
    """
    Пример функции с правильным оформлением.
    
    Args:
        user_id: ID пользователя
        message: Текст сообщения
        
    Returns:
        True если успешно, False иначе
    """
    logger.info(f"📨 Обработка сообщения для пользователя {user_id}")
    
    try:
        # Логика функции
        return True
    except Exception as e:
        logger.error(f"❌ Ошибка в example_function: {e}")
        return False

📞 Поддержка

Контакты

  • Разработчик: Алксандр Успешный
  • Telegram: @uspeshnyy
  • Email: aleksandr@uspeshnyy.ru

Полезные ссылки


📄 Лицензия

MIT License - подробности в файле LICENSE


🔄 История изменений

v1.0.0 (2025-06-26)

  • ✅ Первый релиз
  • 🤖 Основной функционал бота
  • 📊 Интеграция с Google Sheets
  • ⏰ Система планирования задач
  • 🔍 Система логирования

Документация обновлена: 26.06.2025