Как запустить асинхронную функцию при работе с Telethon

Итак, я использую библиотеку telethon для создания и программирования telegram клиента. Но я хочу, чтобы мой клиент писал сообщение каждый день во сколько-то часов (нужно для сбора данных, организовано в функции preparation_posts())

from telethon import TelegramClient, events, sync

async def preparation_posts():
    print("Подготовка запросов пошла")
    
    for auto in autos:
        for i in range(1, len(auto)):
            await ask_topic(auto[0], auto[I])

# Обработчик сообщений клиента
@client.on(events.NewMessage(chats=('@chat')))
async def chat_messages_handler(msg):
    ...


if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(preparation_posts)
    client.run_until_disconnected()

Получается у меня запускается клиент в последней строке, но еще нужно запустить асинхронную функцию preparation_posts(). Пробовал через aioschedule, но в конечном итоге были ошибки, посидел на форуме, там пишут, что это из-за того, что библиотека давно не обновлялась и в python3.12 лезут ошибки

Ссылка на файл на гитхаб: https://github.com/Khlon-Stepan/questionForStackOverflow.git

Текст ошибки:

Traceback (most recent call last):
  File "/Users/gutark/Documents/Проекты/telegram боты/GPT генератор/main.py", line 113, in <module>
    loop.run_until_complete(preparation_posts)
  File "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/base_events.py", line 664, in run_until_complete
    future = tasks.ensure_future(future, loop=self)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/tasks.py", line 689, in ensure_future
    raise TypeError('An asyncio.Future, a coroutine or an awaitable '
TypeError: An asyncio.Future, a coroutine or an awaitable is required

В общем помогите, пожалуйста


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

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

Проблема в этой строке:

loop.run_until_complete(preparation_posts)

Корутину нужно вызывать со скобками:

loop.run_until_complete(preparation_posts())

В данном случае возможно имеет смысл запускать корутину в фоне через loop.create_task, а не дожидаться ее завершения:

loop.create_task(preparation_posts())

но это уже зависит от логики программы, нужно ли обязательно чтобы корутина выполнилась до запуска клиента или нет.

→ Ссылка