204 lines
7.5 KiB
Python
204 lines
7.5 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
Отправка анализа возможности планировщика постов
|
||
"""
|
||
import asyncio
|
||
import sys
|
||
from pathlib import Path
|
||
|
||
BASE_DIR = Path(__file__).resolve().parent
|
||
sys.path.insert(0, str(BASE_DIR))
|
||
|
||
from aiogram import Bot
|
||
from aiogram.client.default import DefaultBotProperties
|
||
from aiogram.enums import ParseMode
|
||
from aiogram.client.session.aiohttp import AiohttpSession
|
||
|
||
from config import BOT_TOKEN, ADMIN_USER_ID, get_proxy_url
|
||
|
||
async def send_analysis():
|
||
"""Отправка анализа планировщика постов"""
|
||
proxy_url = get_proxy_url()
|
||
|
||
if proxy_url:
|
||
session = AiohttpSession(proxy=proxy_url)
|
||
bot = Bot(token=BOT_TOKEN, session=session, default=DefaultBotProperties(parse_mode=ParseMode.HTML))
|
||
else:
|
||
bot = Bot(token=BOT_TOKEN, default=DefaultBotProperties(parse_mode=ParseMode.HTML))
|
||
|
||
message = """
|
||
📅 <b>АНАЛИЗ: ПЛАНИРОВЩИК ПОСТОВ ДЛЯ ВЕБ-ПАНЕЛИ</b>
|
||
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
|
||
🎯 <b>МОЖЕМ ЛИ РЕАЛИЗОВАТЬ?</b>
|
||
|
||
✅ <b>ДА! Полностью реализуемо!</b>
|
||
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
|
||
📋 <b>ЧТО УЖЕ ЕСТЬ В КОДЕ:</b>
|
||
|
||
✅ <b>1. Планировщик (Scheduler)</b>
|
||
• Файл: services/scheduler.py
|
||
• Использует APScheduler
|
||
• Уже работает с cron-задачами
|
||
• Запускается при старте бота
|
||
|
||
✅ <b>2. Веб-панель (FastAPI)</b>
|
||
• Файл: web/app.py (911 строк)
|
||
• Есть страница /broadcast
|
||
• Уже умеет: текст + фото
|
||
• Уже есть выбор получателей
|
||
|
||
✅ <b>3. База данных (SQLAlchemy)</b>
|
||
• Есть модели для всего
|
||
• Нужно добавить: ScheduledPost
|
||
• Хранить: текст, фото, тему, время
|
||
|
||
✅ <b>4. Темы форума</b>
|
||
• Настроены 10 тем
|
||
• message_thread_id работает
|
||
• config.get_topic_id('topic_name')
|
||
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
|
||
🔧 <b>ЧТО НУЖНО ДОБАВИТЬ:</b>
|
||
|
||
<b>1️⃣ Новая модель в БД:</b>
|
||
ScheduledPost
|
||
• id
|
||
• text (текст поста)
|
||
• photo_file_id (опционально)
|
||
• topic_id (тема: 1, 6258, 6262...)
|
||
• topic_name ('general', 'memes'...)
|
||
• scheduled_time (когда отправить)
|
||
• status ('pending', 'sent', 'failed')
|
||
• created_at (когда создан)
|
||
• error_message (если ошибка)
|
||
|
||
<b>2️⃣ Новая страница в веб-панели:</b>
|
||
/scheduled_posts
|
||
• Текстовое поле (с HTML поддержкой)
|
||
• Загрузка фото
|
||
• Выпадающий список тем
|
||
• Датапикер (календарь)
|
||
• Время (часы:минуты)
|
||
• Кнопка "Запланировать"
|
||
• Таблица запланированных
|
||
• Кнопки: удалить, редактировать
|
||
|
||
<b>3️⃣ API endpoints:</b>
|
||
• GET /scheduled_posts - страница
|
||
• POST /api/scheduled_posts/create
|
||
• POST /api/scheduled_posts/cancel
|
||
• GET /api/scheduled_posts/list
|
||
• DELETE /api/scheduled_posts/{id}
|
||
|
||
<b>4️⃣ Фоновая задача в Scheduler:</b>
|
||
• Проверка каждую минуту
|
||
• SELECT * FROM scheduled_posts
|
||
WHERE scheduled_time <= NOW()
|
||
AND status = 'pending'
|
||
• Отправка в нужную тему
|
||
• Обновление status = 'sent'
|
||
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
|
||
🎨 <b>КАК БУДЕТ ВЫГЛЯДЕТЬ:</b>
|
||
|
||
<b>Форма создания поста:</b>
|
||
|
||
📝 Текст: [большое поле]
|
||
📷 Фото: [выбрать файл]
|
||
📂 Тема: [выпадающий список ▼]
|
||
• Общий чат
|
||
• Мемы
|
||
• Объявления
|
||
• Собрания
|
||
• ...
|
||
📅 Дата: [🗓️ 2026-04-07]
|
||
⏰ Время: [14:30]
|
||
|
||
[✅ Запланировать пост]
|
||
|
||
<b>Таблица запланированных:</b>
|
||
|
||
| # | Тема | Когда | Статус | Действия |
|
||
|---|------|-------|--------|----------|
|
||
| 1 | Мемы | 07.04 10:00 | ⏳ | ❌ ✏️ |
|
||
| 2 | Общий | 08.04 15:00 | ⏳ | ❌ ✏️ |
|
||
| 3 | КГМ | 09.04 09:00 | ✅ | - |
|
||
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
|
||
🛡️ <b>БЕЗОПАСНОСТЬ (НЕ ИСПОРТИМ ТЕКУЩЕЕ):</b>
|
||
|
||
✅ <b>Изолированные изменения:</b>
|
||
• Новая модель - отдельная таблица
|
||
• Новый endpoint - новый URL
|
||
• Новая страница - новый файл HTML
|
||
• Новая задача в scheduler - отдельный job
|
||
|
||
✅ <b>Миграция БД:</b>
|
||
• ALTER TABLE (добавление таблицы)
|
||
• Не меняем существующие таблицы
|
||
• Без риска для текущих данных
|
||
|
||
✅ <b>Тестирование:</b>
|
||
• Можно тестировать на одном посте
|
||
• Отмена без последствий
|
||
• Логи всех действий
|
||
|
||
✅ <b>Откат:</b>
|
||
• Если что-то не так - удаляем таблицу
|
||
• Новый код не трогает старый
|
||
• Старый функционал не изменится
|
||
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
|
||
🚀 <b>ПЛАН РЕАЛИЗАЦИИ:</b>
|
||
|
||
<b>Шаг 1:</b> Добавить модель ScheduledPost в БД
|
||
<b>Шаг 2:</b> Создать страницу /scheduled_posts
|
||
<b>Шаг 3:</b> Создать API endpoints
|
||
<b>Шаг 4:</b> Добавить задачу в Scheduler
|
||
<b>Шаг 5:</b> Тестирование на 1-2 постах
|
||
<b>Шаг 6:</b> Коммит в Gitea
|
||
|
||
<b>⚠️ ВАЖНО:</b>
|
||
Ни один существующий файл НЕ будет изменён критично!
|
||
Только добавления нового кода.
|
||
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
|
||
💡 <b>СЦЕНАРИЙ ИСПОЛЬЗОВАНИЯ:</b>
|
||
|
||
1. Заходишь в веб-панель (порт 8000)
|
||
2. Кликаешь "📅 Запланированные посты"
|
||
3. Заполняешь форму:
|
||
• Текст про юмор/мусор
|
||
• Прикладываешь картинку
|
||
• Выбираешь тему "Мемы"
|
||
• Ставишь: 07.04.2026 10:00
|
||
4. Жмёшь "Запланировать"
|
||
5. Повторяешь для 5-6 постов
|
||
6. Бот сам отправит их по расписанию!
|
||
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
|
||
✅ <b>ГОТОВО К РЕАЛИЗАЦИИ!</b>
|
||
|
||
<i>Можем начинать? Никакой текущий функционал не пострадает!</i>
|
||
"""
|
||
|
||
try:
|
||
await bot.send_message(ADMIN_USER_ID, message)
|
||
print("✅ Анализ планировщика отправлен!")
|
||
except Exception as e:
|
||
print(f"❌ Ошибка: {e}")
|
||
finally:
|
||
await bot.session.close()
|
||
|
||
if __name__ == '__main__':
|
||
asyncio.run(send_analysis())
|