Как запустить асинхронную функцию при работе с 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 шт):
Проблема в этой строке:
loop.run_until_complete(preparation_posts)
Корутину нужно вызывать со скобками:
loop.run_until_complete(preparation_posts())
В данном случае возможно имеет смысл запускать корутину в фоне через loop.create_task
, а не дожидаться ее завершения:
loop.create_task(preparation_posts())
но это уже зависит от логики программы, нужно ли обязательно чтобы корутина выполнилась до запуска клиента или нет.