Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 20, 2024 14:18:21

RomanRens
Зарегистрирован: 2023-08-23
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Не работает обработка хендлера при цикличном опросе

Есть код Python, который проверяет активность ТГ канала с использованием длительного опроса и отправляет сообщение в канал при появлении нового поста:

 import asyncio
import logging
import os
from aiogram import Bot, Dispatcher, types
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup
from dotenv import load_dotenv
load_dotenv()
BOT_TOKEN = os.getenv('API_TOKEN')
CHANNEL_IDS = os.getenv('CHANNEL_ID').split(',')
WA_LINK = os.getenv('WA_LINK')
TEXT = os.getenv('TEXT')
BUTTON_TEXT = os.getenv('BUTTON_TEXT')
logging.basicConfig(level=logging.INFO)
bot = Bot(token=BOT_TOKEN)
dp = Dispatcher(bot)
message_sent = False
async def check_channel_activity_long_polling():
    global message_sent
    offset = None
    while True:
        try:
            updates = await bot.get_updates(offset=offset)
            channel_post_found = False
            for update in updates:
                offset = update.update_id + 1
                if 'channel_post' in update:
                        channel_post_found = True
                        if not message_sent:
                            channel_id = update.channel_post.chat.id
                            keyboard = InlineKeyboardMarkup().add(InlineKeyboardButton(BUTTON_TEXT, url=WA_LINK))
                            await bot.send_message(channel_id, TEXT, reply_markup=keyboard)
                            message_sent = True
            if not channel_post_found:
                message_sent = False
            await asyncio.sleep(2)
        except Exception as e:
            print(f"Ошибка: {e}")
            await asyncio.sleep(2)
@dp.message_handler(commands=['menu'])
async def handle_menu_command(message: types.Message):
    # Выводим сообщение в консоль при получении команды /menu
    print("Получена команда /menu")
if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.create_task(check_channel_activity_long_polling())
    try:
        loop.run_until_complete(dp.skip_updates())
        loop.run_forever()
    except KeyboardInterrupt:
        pass
    finally:
        loop.close()

Однако при этом не работает обработчик сообщений для команды /menu. Причина видимо в создании бесконечного цикла событий asyncio.
Как исправить код так, чтобы одновременно происходил и опрос обновлений в канале, и выполнялась обработка хэндлера /menu?

Отредактировано RomanRens (Фев. 21, 2024 14:43:21)

Офлайн

#2 Фев. 20, 2024 18:10:58

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1348
Репутация: +  118  -
Профиль   Отправить e-mail  

Не работает обработка хендлера при цикличном опросе

[code python]код обернуть в эти теги[/code]

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version