У меня есть модуль на 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 вместе?
обнажает проблему.
Надо одновременно запускать несколько задач.
В качестве примера, параллельный запуск:
- user-бота,
- двух обычных ботов,
- функции.
(суммарно 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