@nulovkin

Почему корутина работает без вызова в telethon?

Я использую бота для парсинга сообщений из чатов в ТГ. Перед началом работы мне нужно вызвать эту функцию.
def chat_prepare(client: TelegramClient, chat_to_work):
    messages = client.get_messages(chat_to_work, limit=1)
    if len(messages) == 0:
        # print(f'В чате {chat_to_work} не удается получить номера сообщений')
        return -1
    m1 = messages[0].id
    return m1


Все работало прекрасно, пока я не решил обособить всю работу с телеграмом в отдельный класс. Тогда telegram вспомнил, что это get_messages это вообще-то корутина. А когда я внес правки стал слать The asyncio event loop must not change after connection.

Вопрос:
Какого черта корутина может работать без вызова? Такое вообще бывает?
  • Вопрос задан
  • 106 просмотров
Пригласить эксперта
Ответы на вопрос 1
Lord_of_Rings
@Lord_of_Rings
Северный странник. Злой, но добрый
Ошибка
The asyncio event loop must not change after connection
обычно возникает, когда вы пытаетесь изменить цикл событий asyncio после того, как он уже был запущен. Или пытаетесь запустить асинхронные операции вне асинхронного контекста или пытаетесь изменить цикл событий после его запуска.

Этот код должен работать
import asyncio
from telethon import TelegramClient

class TelegramBot:
    def __init__(self, api_id, api_hash, session_name):
        self.client = TelegramClient(session_name, api_id, api_hash)

    async def start(self):
        await self.client.start()

    async def chat_prepare(self, chat_to_work):
        messages = await self.client.get_messages(chat_to_work, limit=1)
        if len(messages) == 0:
            return -1
        m1 = messages[0].id
        return m1

    async def run(self, chat_to_work):
        await self.start()
        result = await self.chat_prepare(chat_to_work)
        print(f'Result: {result}')

# Пример использования
api_id = 'YOUR_API_ID'
api_hash = 'YOUR_API_HASH'
session_name = 'YOUR_SESSION_NAME'
chat_to_work = 'YOUR_CHAT_ID'

bot = TelegramBot(api_id, api_hash, session_name)

# Запуск асинхронного контекста
asyncio.run(bot.run(chat_to_work))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы