@AlexHDreal

Как зациклить функцию отправки сообщения ботом на aiogram?

Нужно чтобы цикл выполнялся каждые 10 сек. Первый цикл проходит удачно и сообщение приходит, после ожидания в 10 сек второй цикл не проходит и вылетает вот эта ошибка:

Traceback (most recent call last):
File "X:\TELEGRAMM\КРИПТА ПИТОН\TEST2.py", line 30, in
asyncio.run(start_command())
File "C:\Program Files\Python39\lib\asyncio\runners.py", line 44, in run
return loop.run_until_complete(main)
File "C:\Program Files\Python39\lib\asyncio\base_events.py", line 642, in run_until_complete
return future.result()
File "X:\TELEGRAMM\КРИПТА ПИТОН\TEST2.py", line 27, in start_command
await bot.send_message(owner, "Hello!")
File "C:\Program Files\Python39\lib\site-packages\aiogram\bot\bot.py", line 318, in send_message
result = await self.request(api.Methods.SEND_MESSAGE, payload)
File "C:\Program Files\Python39\lib\site-packages\aiogram\bot\base.py", line 208, in request
return await api.make_request(self.session, self.server, self.__token, method, data, files,
File "C:\Program Files\Python39\lib\site-packages\aiogram\bot\api.py", line 139, in make_request
async with session.post(url, data=req, **kwargs) as response:
File "C:\Program Files\Python39\lib\site-packages\aiohttp\client.py", line 1117, in __aenter__
self._resp = await self._coro
File "C:\Program Files\Python39\lib\site-packages\aiohttp\client.py", line 429, in _request
handle = tm.start()
File "C:\Program Files\Python39\lib\site-packages\aiohttp\helpers.py", line 586, in start
return self._loop.call_at(when, self.__call__)
File "C:\Program Files\Python39\lib\asyncio\base_events.py", line 725, in call_at
self._check_closed()
File "C:\Program Files\Python39\lib\asyncio\base_events.py", line 510, in _check_closed
raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed
ERROR:asyncio:Unclosed client session
client_session:
ERROR:asyncio:Unclosed connector
connections: ['[(, 1901792.828)]']
connector:
ERROR:asyncio:Fatal error on SSL transport
protocol:
transport: <_ProactorSocketTransport fd=824 read=<_OverlappedFuture cancelled>>
Traceback (most recent call last):
File "C:\Program Files\Python39\lib\asyncio\sslproto.py", line 684, in _process_write_backlog
self._transport.write(chunk)
File "C:\Program Files\Python39\lib\asyncio\proactor_events.py", line 359, in write
self._loop_writing(data=bytes(data))
File "C:\Program Files\Python39\lib\asyncio\proactor_events.py", line 395, in _loop_writing
self._write_fut = self._loop._proactor.send(self._sock, data)
AttributeError: 'NoneType' object has no attribute 'send'
Exception ignored in:
Traceback (most recent call last):
File "C:\Program Files\Python39\lib\asyncio\sslproto.py", line 321, in __del__
File "C:\Program Files\Python39\lib\asyncio\sslproto.py", line 316, in close
File "C:\Program Files\Python39\lib\asyncio\sslproto.py", line 593, in _start_shutdown
File "C:\Program Files\Python39\lib\asyncio\sslproto.py", line 598, in _write_appdata
File "C:\Program Files\Python39\lib\asyncio\sslproto.py", line 706, in _process_write_backlog
File "C:\Program Files\Python39\lib\asyncio\sslproto.py", line 720, in _fatal_error
File "C:\Program Files\Python39\lib\asyncio\proactor_events.py", line 151, in _force_close
File "C:\Program Files\Python39\lib\asyncio\base_events.py", line 746, in call_soon
File "C:\Program Files\Python39\lib\asyncio\base_events.py", line 510, in _check_closed
RuntimeError: Event loop is closed
[Finished in 13.0s]

САМ КОД:

# Работа с ботом
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)
  • Вопрос задан
  • 2530 просмотров
Пригласить эксперта
Ответы на вопрос 2
shurshur
@shurshur
Сисадмин, просто сисадмин...
Так нельзя, это же 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()
Ответ написан
Комментировать
@schmoopie
Для этого придумали планировщик aka scheduler, читать тут
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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