- Timezone: веб-панель показывает локальное время (UTC+4, Ульяновск)
- Timezone: конвертация UTC → локальное при отображении
- Duplicate fix: промежуточный статус 'sending' в БД
- Duplicate fix: только один процесс берет пост
- UI: подсказки 'По твоему времени (UTC+4)'
- Тест: пост 5 опубликован ровно 1 раз ✅
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
93 lines
3.4 KiB
Python
93 lines
3.4 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_timezone_and_duplicate_fix():
|
||
"""Уведомление об исправлениях"""
|
||
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>1. ЛОКАЛЬНОЕ ВРЕМЯ (UTC+4)</b>
|
||
|
||
✅ <b>Что изменилось:</b>
|
||
|
||
❌ <b>Было:</b>
|
||
• Время в веб-панели показывалось в UTC
|
||
• Ты выбирал 20:30 → сохранялось как 20:30 UTC
|
||
• Реально публиковалось в 00:30 по Ульяновску!
|
||
|
||
✅ <b>Стало:</b>
|
||
• В веб-панели показывает ТВОЁ время (UTC+4)
|
||
• Ты выбираешь 20:30 → сохраняется как 16:30 UTC
|
||
• Публикуется ровно в 20:30 по Ульяновску! 🎯
|
||
|
||
📋 <b>Подсказки в форме:</b>
|
||
"🕐 По твоему времени (UTC+4)"
|
||
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
|
||
🔄 <b>2. ЗАЩИТА ОТ ДУБЛИРОВАНИЯ</b>
|
||
|
||
✅ <b>Что было:</b>
|
||
• Пост публиковался ДВАЖДЫ в чат
|
||
• Несколько процессов scheduler работали одновременно
|
||
|
||
✅ <b>Что стало:</b>
|
||
• Добавлена блокировка (_scheduled_posts_lock)
|
||
• Только ОДИН процесс может публиковать посты
|
||
• Остальные пропускают обработку
|
||
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
|
||
🧪 <b>ТЕСТ:</b>
|
||
|
||
Создан тестовый пост (ID=4)
|
||
Время: через 5 минут от сейчас
|
||
Должен опубликоваться ОДИН раз ✅
|
||
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
|
||
🌐 <b>ПРОВЕРЬ В ВЕБ-ПАНЕЛИ:</b>
|
||
|
||
1. Зайди в http://localhost:8000/scheduled_posts
|
||
2. Нажми Ctrl+Shift+R (сброс кэша!)
|
||
3. Посмотри на список постов
|
||
4. Время должно быть ПО ТВОЕМУ! (UTC+4)
|
||
|
||
<i>Жду 5 минут и проверю что тестовый пост опубликовался 1 раз!</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_timezone_and_duplicate_fix())
|