как зациклить функцию в aiogram?
Есть такой код. Все работает, но мне нужно чтобы @dp.message_handler(commands=['start']) вызывалась не по команде commands=['start'], а зациклена. Пробовал вызвать asyncio.run(scheduled(10)) Вот так:
# запускаем лонг поллинг
if __name__ == '__main__':
asyncio.run(scheduled(10))
executor.start_polling(dp, skip_updates=True,)
Но тогда не работает executor.start_polling(dp, skip_updates=True,) что я должен сделать что бы просто зациклить функцию dp.loop.create_task(scheduled(10)) так же не работает, выдает ошибку AttributeError: 'NoneType' object has no attribute 'create_task'
import config
import logging
import asyncio
from datetime import datetime
from aiogram import Bot, Dispatcher, executor, types
from sqlighter import SQLighter
from freesteam import FreeGame
# задаем уровень логов
logging.basicConfig(level=logging.INFO)
# инициализируем бота
bot = Bot(token=config.API_TOKEN)
dp = Dispatcher(bot)
# инициализируем соединение с БД
db = SQLighter('botgamebd.db')
# инициализируем парсер
fg = FreeGame()
# Команда активации подписки
@dp.message_handler(commands=['subscribe'])
async def subscribe(message: types.Message):
if (not db.subscriber_exists(message.from_user.id)):
# если юзера нет в базе, добавляем его
db.add_subscriber(message.from_user.id)
else:
# если он уже есть, то просто обновляем ему статус подписки
db.update_subscription(message.from_user.id, True)
await message.answer(
"Вы успешно подписались на рассылку!\nЖдите, скоро будут новые раздачи Игр и Софта, вы узнаете о них первыми =)")
# Команда отписки
@dp.message_handler(commands=['unsubscribe'])
async def unsubscribe(message: types.Message):
if (not db.subscriber_exists(message.from_user.id)):
# если юзера нет в базе, добавляем его с неактивной подпиской (запоминаем)
db.add_subscriber(message.from_user.id, False)
await message.answer("Вы итак не подписаны.")
else:
# если он уже есть, то просто обновляем ему статус подписки
db.update_subscription(message.from_user.id, False)
await message.answer("Вы успешно отписаны от рассылки.")
# проверяем наличие новых игр и делаем рассылки
@dp.message_handler(commands=['start'])
async def scheduled(self):
while True:
await asyncio.sleep(10)
game_info = fg.get_free_game()
game_info.reverse()
# получаем список подписчиков бота
subscriptions = db.get_subscriptions()
# получаем все игры
for new_game in game_info:
iterations = 3
for game_id in new_game:
if iterations >= 3:
if db.game_exists(int(game_id)):
iterations = iterations - 1
else:
db.add_game(new_game)
for s in subscriptions:
await bot.send_message(
s[1],
new_game
)
iterations = iterations - 1
continue
else:
continue
# запускаем лонг поллинг
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True,)
Ответы (1 шт):
Автор решения: Zhymabek Roman
→ Ссылка
У вас проблема в коде как раз во время вызова функции sheduled. Более поздних версиях aiogram нету метода loop, в классе dp. Вот фикс для вашей проблемы:
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.create_task(scheduled(10)) # поставим 10 секунд, в качестве теста
executor.start_polling(dp, skip_updates=True)