@pyreaper

Почему не получается запустить клиент через run в Pyrogram?

Я пишу юзербота на Pyrogram. Столкнулся с проблемой - никак не получается запустить клиент через функцию run (и чистый start тоже). В случае, если создавать класс с объектом клиента (он создаётся в init) не в асинхронной функции, ничего не срабатывает, после остановки программы вылетает ошибка ниже:

test.py:28: RuntimeWarning: coroutine 'Account.start_messaging' was never awaited
new_account.start_messaging([-123456789], ["123456789"])
RuntimeWarning: Enable tracemalloc to get the object allocation traceback


В случае, если создавать класс в асинхронной функции, то при попытке запустить его через run выходит ошибка ещё больше:

self.start()
RuntimeWarning: Enable tracemalloc to get the object allocation traceback
Traceback (most recent call last):
  File "c:\Users\makha\OneDrive\Рабочий стол\rassilka\test.py", line 31, in <module>
    asyncio.run(main())
  File "C:\Users\makha\AppData\Local\Programs\Python\Python311\Lib\asyncio\runners.py", line 190, in run
    return runner.run(main)
           ^^^^^^^^^^^^^^^^
  File "C:\Users\makha\AppData\Local\Programs\Python\Python311\Lib\asyncio\runners.py", line 118, in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\makha\AppData\Local\Programs\Python\Python311\Lib\asyncio\base_events.py", line 653, in run_until_complete        
    return future.result()
           ^^^^^^^^^^^^^^^
  File "c:\Users\makha\OneDrive\Рабочий стол\rassilka\test.py", line 28, in main
    new_account = Account("+447435260883")
                  ^^^^^^^^^^^^^^^^^^^^^^^^
  File "c:\Users\makha\OneDrive\Рабочий стол\rassilka\test.py", line 14, in __init__
    self.client.run()
  File "C:\Users\makha\OneDrive\Рабочий стол\rassilka\.venv\Lib\site-packages\pyrogram\methods\utilities\run.py", line 85, in run  
    run(idle())
  File "C:\Users\makha\AppData\Local\Programs\Python\Python311\Lib\asyncio\base_events.py", line 629, in run_until_complete        
    self._check_running()
  File "C:\Users\makha\AppData\Local\Programs\Python\Python311\Lib\asyncio\base_events.py", line 588, in _check_running
    raise RuntimeError('This event loop is already running')
RuntimeError: This event loop is already running
sys:1: RuntimeWarning: coroutine 'idle' was never awaited


Пробовал запускать функцию run и через asyncio, и через loop. Ничего не помогло. Прошу у вас помощи

Фрагмент кода:

import asyncio
import os

api_id = None
api_hash = None

class Account:
    def __init__(self, number: str):
        self.client = Client("test_app", api_id=api_id, api_hash=api_hash, phone_number=number)
        self.client.run()

    async def _send_message(self, group_id: int, message: str):
        response = await self.client.send_message(group_id, message)
        print(response)
        return response
    
    async def start_messaging(self, groups: list, posts: list):
        for post in posts:
            for group in groups:
                await self._send_message(group, post)
            await asyncio.sleep(5)

new_account = Account("+123456789")
new_account.start_messaging([-123456789], ["123456789"])

# все значения изменил на другие
  • Вопрос задан
  • 86 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
В документации pyrogram английским по белому написано (выделение моё):
Client.run()
Start the client, idle the main script and finally stop the client.
When calling this method without any argument it acts as a convenience method that calls start(), idle() and stop() in sequence. It makes running a single client less verbose.

pyrogram.idle()
Block the main script execution until a signal is received.

Отсюда вывод: у тебя дальше self.client.run() управление не пойдёт, даже конструктор Account не завершится, не говоря уж о вызове new_account.start_messaging().

И к слову о нём: ты сделал этот метод async, а вызываешь его как будто он синхронный. WTF?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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