@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)
  • Вопрос задан
  • 4131 просмотр
Решения вопроса 2
Vindicar
@Vindicar
RTFM!
Ну во-первых, зачем тебе 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
Python backend developer
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
22 нояб. 2024, в 03:54
1500 руб./за проект
22 нояб. 2024, в 02:56
10000 руб./за проект
22 нояб. 2024, в 00:55
500 руб./за проект