diff --git a/bot.py b/bot.py index 7959c86..163da63 100644 --- a/bot.py +++ b/bot.py @@ -36,6 +36,7 @@ UPDATE_INTERVAL = 300 # 5 минут bot = Bot(token=BOT_TOKEN) dp = Dispatcher(bot) + async def periodic_update(): while True: logger.info("Запуск автоматического обновления данных...") @@ -46,6 +47,7 @@ async def periodic_update(): logger.error(f"Ошибка при автоматическом обновлении: {e}") await asyncio.sleep(UPDATE_INTERVAL) + @dp.message_handler(commands='start') async def cmd_start(message: types.Message): buttons = ['Плановые', 'Внерегламентные', 'Аварийные', 'Информация'] @@ -53,6 +55,7 @@ async def cmd_start(message: types.Message): keyboard.add(*buttons) await message.answer('Выберите тип отключений:', reply_markup=keyboard) + async def send_file_content(message: types.Message, file_path: Path, empty_msg: str, log_msg: str): await message.answer("Обновляю...") @@ -74,6 +77,7 @@ async def send_file_content(message: types.Message, file_path: Path, empty_msg: f.write(log_entry) logger.info(f"Пользователь {username} запросил {log_msg}") + @dp.message_handler(Text(equals='Плановые')) async def plan(message: types.Message): await send_file_content( @@ -83,6 +87,7 @@ async def plan(message: types.Message): "плановым отключениям" ) + @dp.message_handler(Text(equals='Внерегламентные')) async def vnereglament(message: types.Message): await send_file_content( @@ -92,6 +97,7 @@ async def vnereglament(message: types.Message): "внерегламентным отключениям" ) + @dp.message_handler(Text(equals='Аварийные')) async def avar(message: types.Message): await send_file_content( @@ -101,6 +107,7 @@ async def avar(message: types.Message): "аварийным отключениям" ) + @dp.message_handler(Text(equals='Информация')) async def info(message: types.Message): await message.answer( @@ -109,19 +116,23 @@ async def info(message: types.Message): "📩 Вопросы и предложения: @pikusQQ" ) + @dp.message_handler() async def fallback(message: types.Message): await message.answer("Нажмите /start для начала работы.") + async def on_startup(dp): await bot.set_webhook(WEBHOOK_URL) asyncio.create_task(periodic_update()) logger.info(f"Webhook установлен на {WEBHOOK_URL}. Фоновое обновление запущено.") + async def on_shutdown(dp): await bot.delete_webhook() logger.info("Webhook удалён") + if __name__ == '__main__': executor.start_webhook( dispatcher=dp, @@ -131,4 +142,4 @@ if __name__ == '__main__': skip_updates=True, host='0.0.0.0', port=5000, - ) \ No newline at end of file + ) diff --git a/main.py b/main.py index 240d9d3..e22f31a 100644 --- a/main.py +++ b/main.py @@ -45,6 +45,7 @@ PLAN_FILE = Path("plan.txt") VN_FILE = Path("vnereglament.txt") AVAR_FILE = Path("avar.txt") + def clean_street(street: str) -> str: if not street: return "" @@ -81,13 +82,15 @@ def clean_street(street: str) -> str: return '\n'.join(formatted) if formatted else "[Нет данных]" + def format_time(dt_str: str) -> str: try: dt = datetime.fromisoformat(dt_str.replace('Z', '+00:00')) return dt.strftime('%d.%m.%Y %H:%M') - except: + except Exception: return dt_str.replace('T', ' ') + def parse_and_save(data, file_path: Path, mode: str): if not data or data == 0: file_path.write_text("[Нет отключений]", encoding='utf-8') @@ -101,7 +104,7 @@ def parse_and_save(data, file_path: Path, mode: str): street = clean_street(item.get("DisconnectionObject", "")) time_down = format_time(item.get("DisconnectionDateTime", "")) time_up = format_time(item.get("EnergyOnPlanningDateTime", "")) - lines.append(f"{street}\nОтключение: {time_down} — {time_up}\n{'─' * 30}") + lines.append(f"{street}\nВремя: с {time_down} по {time_up}\n{'-' * 30}") elif mode == 'avar': street = clean_street(item.get("StreetHome", "")) time_up = format_time(item.get("ScheduledTimeRemoval", "")) @@ -109,6 +112,7 @@ def parse_and_save(data, file_path: Path, mode: str): file_path.write_text('\n'.join(lines), encoding='utf-8') + def get_plan(): try: r = requests.get(URL_PLAN, headers=HEADERS, verify=False, timeout=15) @@ -123,6 +127,7 @@ def get_plan(): logger.error(f"Ответ: {r.text[:500]}") PLAN_FILE.write_text("[Ошибка загрузки данных]", encoding='utf-8') + def get_vnereglament(): try: r = requests.get(URL_VNEREGLAMENT, headers=HEADERS, verify=False, timeout=15) @@ -137,6 +142,7 @@ def get_vnereglament(): logger.error(f"Ответ: {r.text[:500]}") VN_FILE.write_text("[Ошибка загрузки данных]", encoding='utf-8') + def get_avar(): try: r = requests.get(URL_AVAR, headers=HEADERS, verify=False, timeout=15) @@ -151,8 +157,9 @@ def get_avar(): logger.error(f"Ответ: {r.text[:500]}") AVAR_FILE.write_text("[Ошибка загрузки данных]", encoding='utf-8') + def start_parser(): get_plan() get_vnereglament() get_avar() - logger.info("Парсер отработал") \ No newline at end of file + logger.info("Парсер отработал")