Как зациклить отправку сообщений

Run Settings
LanguagePython
Language Version
Run Command
# Работа с ботом from aiogram.contrib.fsm_storage.memory import MemoryStorage from aiogram.dispatcher.handler import CancelHandler from aiogram.dispatcher.middlewares import BaseMiddleware from aiogram.bot.api import Methods from aiogram.types.message import ContentType from aiogram.dispatcher.filters import BoundFilter import os import os.path from aiogram import Bot, Dispatcher, executor, types from aiogram.bot import api import aiogram from config import owner, API_TOKEN_REZKOBOT import logging import asyncpg import asyncio import telebot # Работа со временем import time # задаем уровень логов logging.basicConfig(level=logging.INFO) # инициализируем бота bot = Bot(token=API_TOKEN_REZKOBOT) storage = MemoryStorage() dp = Dispatcher(bot, storage=storage) async def start_command(): await bot.send_message(owner, "Hello!") while True: asyncio.run(start_command()) time.sleep(10) # запускаем лонг поллинг if __name__ == '__main__': executor.start_polling(dp, skip_updates=True)
''' Так нельзя, это же asyncio, тут любой синхронный код блокирует event loop и всё ломает. Для начала, надо вместо time.sleep использовать asyncio.sleep. Потом, таск бота запускается при вызове start_polling уже после цикла. При этом event loop к тому моменту закончился, так как asyncio.run отработал. Надо сделать как-то так: ''' async def main(): polling_task = asyncio.create_task(dp.start_polling()) while True: await asyncio.sleep(60) await bot.send_message(owner, "Hello!") loop = asyncio.get_event_loop() if __name__ == '__main__': loop.run_until_complete(main()) loop.close() ''' Ответ номер два: Для этого придумали планировщик aka scheduler, читать тут https://botfather.dev/blog/zapusk-funkczij-v-bote-po-tajmeru '''
Editor Settings
Theme
Key bindings
Full width
Lines