Задать вопрос

Как в telethon отслеживать сообщения с нескольких аккаунтов параллельно?

Пользуюсь библиотекой telethon для python, для связи с api telegram
Возникла загвоздка
Есть массив с данными (api_id, api_hash, phone) аккаунтов. Их может быть разное количество. Мне нужно авторизоваться с каждого из них (окей, это не трудно, можно в цикле) и ждать сообщение. Как только прилетает - он отправляет ответ в телеграмм. В telethon есть events для такого случая с таким синтаксисом:
@client.on(events.NewMessage(incoming=True)
async def handler(event):
    # some action after reciving a message

Но как мне сделать такие хендлеры для заранее неизвестного количества аккаунтов? Я пробовал что-то типо такого:
def main():
     client = TelegramClient(f'sessions', api_id, api_hash)
     client.connect()
     client.send_message("some entity", messageToSend, parse_mode="html")
     threading.Thread(target = secondMessage, args = (client, phone, accountToLogin)).start()

И в secondMessage() указывал код из первого примера с отлавкой сообщений, но это не работает
  • Вопрос задан
  • 377 просмотров
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
@nozzy
Symfony, Laravel, SQL, Python, Telegram
Создай класс, например TgClient и что-то типа этого:

class TgClient:
 def __init__(self, session_file, api_id, api_hash):
  ...
  client = TelegramClient(self.session_file, self.api_id, self.api_hash)
 @client.on(events.NewMessage(incoming=True)
  def handler(event):
    # some action after reciving a message


и в цикле создавай сколько нужно TgClient
Ответ написан
Комментировать
@mgearr
Использовать треды, когда уже используется asyncio - грязноватая методика. Иногда, конечно, это имеет смысл, но в данном случае можно (и нужно?) обойтись одним asyncio. Вот кабы библиотека была синхронная, то другое дело, треды были бы в тему. Но она асинхронная

Гуглить на тему gather и concurrent tasks
Сцылочка на соответствующий пунт штатной документации: Running Tasks Concurrently. Там в примере почти в точности точно то, что нужно

Или, может быть, лучше сделать через wait и обрабатывать события более тонко/гибко/сложно
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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