@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)
  • Вопрос задан
  • 3947 просмотров
Решения вопроса 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
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
07 мая 2024, в 15:47
12000 руб./за проект
07 мая 2024, в 15:10
1500 руб./в час
07 мая 2024, в 15:07
1500 руб./в час