Не получается запустить работу кода по расписанию

Написал код, суть которого в сборе определенных сообщений из чата по ключевым словам и их отправка в другой чат.

Хочу сделать автоматический запуск скрипта по расписанию. Для этих целей поместил свой код внутрь функции. Но при запуске кода ничего не происходит. При этом код, находящийся внутри функции работает исправно.

async def parcer_chats():
  chat = 'https://t.me/skoraya_santekhpomoshch'
  keywords = [' Вы ', ' Они ', ' Кран ', ' Ошибка ', ' привет ', ' ок ', ' я ']
  date = date.today() - timedelta(days=1)
  
  data_message = []
  part_mes= await client.get_messages(chat, limit=2000)
  
  for message in part_mes:
    if message.text:
      for word in keywords:
        if word in message.text and message.date.date() == date:
          await client.send_message('https://t.me/parcer_chat_tdld', message.chat.title)
          await client.send_message('https://t.me/parcer_chat_tdld', str(message.date))
          await message.forward_to('https://t.me/parcer_chat_tdld')

schedule.every(1).minutes.do(await parcer_chats())

while True:
  schedule.run_pending()
  time.sleep(1)

Ответы (1 шт):

Автор решения: insolor

По коду не совсем понятно (не весь код приведен, не видны импорты), но в целом похоже, что вы используете обычный пакет schedule, он не умеет работать с асинхронными функциями. Используйте его асинхронный форк aioschedule (либо аналоги, например, apscheduler, см. пример кода)

Также, при планировании выполнения функции через метод .do() нужно передавать саму функцию (просто ее имя - без скобок и без await), а не пытаться ее вызвать, а результат передать в .do():

import asyncio
import aioschedule as schedule
import time


async def parcer_chats():
    ...  # ваш код


schedule.every(1).minutes.do(parcer_chats)

loop = asyncio.get_event_loop()
while True:
    loop.run_until_complete(schedule.run_pending())
    time.sleep(1)

C aioschedule могут быть проблемы на новых версиях Python (3.11 и выше), см. pull request (на момент написания ответа еще не влитый).

С apscheduler аналогичный код будет выглядеть примерно так:


from datetime import datetime
import asyncio

from apscheduler.schedulers.asyncio import AsyncIOScheduler


async def parcer_chats():
    ...


async def main():
    scheduler = AsyncIOScheduler()
    scheduler.add_job(parcer_chats, 'interval', minutes=1)
    scheduler.start()

    while True:
        await asyncio.sleep(1000)


if __name__ == '__main__':
    asyncio.run(main())
→ Ссылка