У меня есть модуль на Pyrogram как дополнение к aiogram, написал функцию асинхронно, не работает, пишет что клиент не стратовал, что можно сделать?

Пытаюсь сделать вот так:

import asyncio

from pyrogram import Client
from pyrogram.raw.functions.contacts import ResolveUsername

from utils.config import config

app = Client(name="test_name", 
            api_id=config.app_id.get_secret_value(), 
            api_hash=config.app_hash.get_secret_value(),
            bot_token=config.bot_token.get_secret_value())
    
async def resolve_username(username):
    with app:
        r = await app.invoke(ResolveUsername(username=username))
        if r.users:
            return r.users[0].id
        return None

Ошибка:

2024-07-28 10:31:13.156 | ERROR   | handlers.owner_commands:error_handler:25 - Произошла ошибка: Client has not been started yet  

Как я вызываю данную функцию:

import utils.pyrogram as helppyro

user = helppyro
rt = Router()

@rt.message(ChatTypeFilter(chat_type=["group", "supergroup"]), Command(commands=["test"],  prefix="/!"))
async def test(message: Message, bot: Bot, command: CommandObject):
    await user.resolve_username("name")

Также пытался через пример из документации pyrogram: (При этом подкрутив на свой лад, но не смог туда впихнуть функцию)

import asyncio
from pyrogram import Client

async def main():
    app = Client("my_account")

    async with app:
        await app.send_message("me", "Hi!")


asyncio.run(main())

Ответы (2 шт):

Автор решения: AnnaBazueva

Вопрос Сергея Ш - как вы запускаете Pyrogram и aiogram вместе? обнажает проблему.

Надо одновременно запускать несколько задач.

В качестве примера, параллельный запуск:

  1. user-бота,
  2. двух обычных ботов,
  3. функции.

(суммарно 4 задачи)

async def main():
    task1 = await asyncio.create_task(client.start())
    task2 = await asyncio.create_task(bigweld.start())
    task3 = await asyncio.create_task(wonder.start())
    task4 = await asyncio.create_task(start_pulling())
    await asyncio.gather(task1, task2, task3, task4, return_exceptions=True)


if __name__ == "__main__":
    try:
        asyncio.ensure_future(main())
        asyncio.get_event_loop().run_forever()
    except KeyboardInterrupt:
        logging.info("Program stopped by user")
        loop = asyncio.get_event_loop()
        loop.run_until_complete(stop_clients())

Ваш вопрос про python & asyncio остальные теги только контекст.

→ Ссылка
Автор решения: Semen

Т.к мне нужен только один метод, который увы недоступен для ботов, то я открываю сессию, выполняю метод нужный мне и закрываю сессию при этом метод ожидаю и записываю в переменную а дальше обрабатываю как мне надо:

async def resolve_username(username: str) -> int | None:
    app = Client(name="name", 
                api_id=config.app_id.get_secret_value(), 
                api_hash=config.app_hash.get_secret_value(),
                bot_token=config.bot_token.get_secret_value())
    await app.start()
    r = await app.invoke(ResolveUsername(username=username))
    await app.stop()
    if r.users:
        return r.users[0].id
    return None
→ Ссылка