@qwwwwwty

Как заставить бота отправлять сообщение раз в 30 секунд, Python Aiogram?

нужно, что бот отправлял сообщение (рандомная связка слов из списка) раз в 30 секунд в беседу, так, что бы цикл был бесконечный и не обрывался. у меня уже есть код, но проблема в том, что бот работает исправно (отправляет сообщение в беседу как нужно), НО из-за моей функции бот начал игнорировать команды (например !help). вот сама моя функция:
loop = asyncio.get_event_loop()
bot = Bot("3213213131", loop)

a = ["привет", "мир", ]
print(random.choice(a))

b = ["как", "дела?", ]
print(random.choice(b))

local_time = "30"
from aiogram import Bot
import asyncio
import time
import random

async def helloworld():
    while True:
        bot_info = await bot.get_me()
        print(bot_info.username)
        time.sleep(int(local_time))
        await dp.bot.send_message(config.GROUP_ID, text = (random.choice(a) +" "+ random.choice(b)))
        print(random.choice(a))
        print(random.choice(b))
    
    

if __name__ == '__main__':
    try:
        loop.run_until_complete(helloworld())
    except KeyboardInterrupt:
        loop.stop()



#run long-polling
if __name__ == "__main__":
    executor.start_polling(dp, skip_updates=True)


к слову, консоль не выдает ошибок и по сути все работает как надо, за исключением игнорирования команд (например !help)
  • Вопрос задан
  • 124 просмотра
Решения вопроса 2
@Vindicar
Ну во-первых, зачем тебе 2 main-блока?
При этом обрати внимание, что первый main-блок не закончит работу, пока не закончит работу твоя корутина helloworld(), так как ты используешь метод run_until_complete(). А твоя корутина никогда не закончит работу.
Используй loop.create_task(), чтобы запланировать выполнение корутины "в свободное время" работы системы и продолжить работу.
if __name__ == '__main__':
  loop.create_task(helloworld())
  executor.start_polling(dp, skip_updates=True)


Во-вторых, длительные синхронные операции в корутине блокируют её работу, и работу остальных корутин. Это основы асинхронного прогарммирования, блин!
Поэтому твой time.sleep() вешает всего бота. Используй await asyncio.sleep(), она отдаст управление другим корутинам бота на время сна текущей корутины.
Ответ написан
Комментировать
@twistfire92
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы