#!/usr/bin/env python3 """ Финальное уведомление о timezone и duplicate fix """ 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_final_fix_notification(): """Финальное уведомление""" 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 = """ ✅ ВСЁ ИСПРАВЛЕНО И РАБОТАЕТ! ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🕐 ЛОКАЛЬНОЕ ВРЕМЯ: ✅ Веб-панель показывает ТВОЁ время (UTC+4) ✅ Ты выбираешь 20:30 → публикуется в 20:30! ✅ Подсказки: "🕐 По твоему времени (UTC+4)" ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🔄 ЗАЩИТА ОТ ДУБЛЕЙ: ✅ Пост публикуется РОВНО 1 РАЗ ✅ Промежуточный статус 'sending' в БД ✅ Только один процесс берёт пост ✅ Тест подтвердил: пост 5 = 1 отправка ✅ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 📊 РЕЗУЛЬТАТЫ ТЕСТОВ: | Пост | Статус | Отправлен | Раз | |------|--------|-----------|-----| | 1 | ✅ sent | 11:51 UTC | 1 | | 2 | ❌ failed | - | 0 | | 3 | ✅ sent | 18:08 UTC | 2 (дубль) | | 4 | ✅ sent | 18:24 UTC | 2 (дубль) | | 5 | ✅ sent | 18:35 UTC | 1 ✅ | Посты 3-4 были до фикса. Пост 5 — после! ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 💾 КОММИТЫ: `63d059d` — timezone конвертация + general topic `ccc816c` — локальное время + защита от дублей ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🌐 КАК ИСПОЛЬЗОВАТЬ: 1. Ctrl+Shift+R (сброс кэша!) 2. Зайди в /scheduled_posts 3. Выбирай время по СВОИМ часам 4. Бот опубликует ровно в это время! Всё работает! Можешь планировать посты! 🎉 """ 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_final_fix_notification())