@AlmazKayum

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

Привет. Этот код собирает посты из телеграм канала.
from telethon.sync import TelegramClient

class TelegramParse():
    def __init__(self, api_id, api_hash):
        self.api_id = api_id
        self.api_hash = api_hash
        self.client = TelegramClient('main', self.api_id, self.api_hash)

    async def __main(self, username, timeperiod:float): # username - имя канала текстовое значение (например d_code)
        """Основной цикл парсера"""
        self.result = []
        channel_entity = await self.client.get_entity(username) # Получаем entity канала по id
        async for message in self.client.iter_messages(channel_entity, wait_time=1): # итерируем сообщения в канале
            try:
                if message.date.timestamp() < timeperiod:
                    break
                params ={'post_text': message.message,
                           'post_id': message.id,
                           'unix_time': message.date.timestamp()}
                self.__set_message_type(message, params)
                self.result.append(params)
            except:
                continue

    def parse(self, username, timeperiod):  # Возвращает результат
        """Основной метод"""
        with self.client:
            self.client.loop.run_until_complete(self.__main(username=username, timeperiod=timeperiod))
            return self.result

Раньше работал, сейчас выдает такую ошибку:
638b2cea6bb7a763405432.png

Вообще не разбираюсь в асинхронных вещах. В чем может быть дело?
  • Вопрос задан
  • 55 просмотров
Пригласить эксперта
Ответы на вопрос 2
Vindicar
@Vindicar
Вообще не разбираюсь в асинхронных вещах.

Откладываешь бота, разбираешься как следует, возвращаешься к боту. Без понимания этого механизма бота сложнее hello world не написать.

В чем может быть дело?

Для работы асинхронного кода он должен быть запущен через рабочий цикл (т.н. реактор, в терминах asyncio - event loop). Этот цикл обычно занимает тот поток, где он создан, и поочерёдно планирует выполнение вызванных корутин (async функций). Когда корутина делает await-вызов, она приостанавливается, а реактор занимается другими делами (в частности, выполняет этот вызов), пока вызов не завершится. После чего корутина продолжает работу.
asyncio создаёт реактор автоматически для главного потока, но не для вспомогательных потоков. Просто потому, что обычно весь код асинхронного приложения работает в рамках реактора, а иметь несколько реакторов в разных потоках - это извращение. Но если очень нужно, ты можешь вызвать asyncio.new_event_loop() в твоём новом потоке, чтобы создать реактор, а потом задать этот реактор для потока вызовом asyncio.set_event_loop() (в этом же потоке). И только после этого запускать там асинхронный код.
Ответ написан
Комментировать
@nozzy
Silex, Symfony, Laravel, SQL
Потому что ты работаешь с синхронным клиентом, а по коду ты хочешь асинхронный.
Поменяй:
from telethon.sync import TelegramClient
на
from telethon import TelegramClient
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы