O
O
okamitsukiwolf2021-12-03 13:34:26
Python
okamitsukiwolf, 2021-12-03 13:34:26

Bot not working, what's wrong?

Source:

import config
import logging
import asyncio
from datetime import datetime

from aiogram import Bot, Dispatcher, executor, types
from sqlighter import SQLighter

from stopgame import StopGame

# задаем уровень логов
logging.basicConfig(level=logging.INFO)

# инициализируем бота
bot = Bot(token=config.API_TOKEN)
dp = Dispatcher(bot)

# инициализируем соединение с БД
db = SQLighter('db.db')

# инициализируем парсер
sg = StopGame('lastkey.txt')

# Команда активации подписки
@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("Вы успешно отписаны от рассылки.")

# проверяем наличие новых игр и делаем рассылки
async def scheduled(wait_for):
  while True:
    await asyncio.sleep(wait_for)

    # проверяем наличие новых игр
    new_games = sg.new_games()

    if(new_games):
      # если игры есть, переворачиваем список и итерируем
      new_games.reverse()
      for ng in new_games:
        # парсим инфу о новой игре
        nfo = sg.game_info(ng)

        # получаем список подписчиков бота
        subscriptions = db.get_subscriptions()

        # отправляем всем новость
        with open(sg.download_image(nfo['image']), 'rb') as photo:
          for s in subscriptions:
            await bot.send_photo(
              s[1],
              photo,
              caption = nfo['title'] + "\n" + "Оценка: " + nfo['score'] + "\n" + nfo['excerpt'] + "\n\n" + nfo['link'],
              disable_notification = True
            )
        
        # обновляем ключ
        sg.update_lastkey(nfo['id'])

# запускаем лонг поллинг
if __name__ == '__main__':
  dp.loop.create_task(scheduled(10)) # пока что оставим 10 секунд (в качестве теста)
  executor.start_polling(dp, skip_updates=True)

does not work exactly
_____________________________________________________________________________
# запускаем лонг поллинг
if __name__ == '__main__':
  dp.loop.create_task(scheduled(10)) # пока что оставим 10 секунд (в качестве теста)
  executor.start_polling(dp, skip_updates=True)

________________________________________________________________________
writes 'nonetype' object has no attribute 'create_task'

Answer the question

In order to leave comments, you need to log in

1 answer(s)
V
Vindicar, 2021-12-03
@Vindicar

I suspect that before start_polling() the dp.loop attribute is set to None.
Surely the bot provides an event that fires when the bot has started - look in the docks, and run the task inside this event.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question