• Как получить айди пользователя по его юзернейму в Aiogram?

    drygdryg
    @drygdryg
    Python-разработчик
    Telegram Bot API, на который опирается aiogram, не позволяет сделать это. Но для этого можно использовать Telegram MTProto API. Для работы с MTProto API из Python существуют такие популярные библиотеки, как Telethon и Pyrogram.
    Чтобы авторизоваться в Телеграме через MTProto API, помимо токена бота понадобится зарегистрировать своё приложение на https://my.telegram.org/apps и получить API ID и hash. Авторизация с аккаунтом бота в Pyrogram описана здесь. Пример функции, которая превращает имя пользователя в ID:
    from pyrogram import Client
    from pyrogram.raw.functions.contacts import ResolveUsername
    
    BOT_TOKEN = "<токен бота>"
    
    pyrogram_client = Client(
        "bot",
        api_id=6,
        api_hash="eb06d4abfb49dc3eeb1aeb98ae0f581e",
        bot_token=BOT_TOKEN,
        app_version="7.7.2",
        device_model="Lenovo Z6 Lite",
        system_version="11 R"
    )
    
    
    def resolve_username_to_user_id(username: str) -> int | None:
        with pyrogram_client:
            r = pyrogram_client.invoke(ResolveUsername(username=username))
            if r.users:
                return r.users[0].id
            return None
    
    
    print(resolve_username_to_user_id("Tishka17"))

    Обратите внимание, что этот код будет работать только с пользователями (не работает с чатами и с каналами). Чтобы сделать то же самое для чата или канала:
    def resolve_username_to_channel_id(username: str) -> int | None:
        with pyrogram_client:
            r = pyrogram_client.invoke(ResolveUsername(username=username))
            if r.chats:
                return r.chats[0].id
            return None
    Ответ написан
    Комментировать
  • Ошибка при импорте, как исправить?

    Vindicar
    @Vindicar
    RTFM!
    Проблема в том, что ты пытаешься сделать бота и скриптом, и модулем. А импорт работает только одним способом.
    Я бы сказал, просто вынеси main в папку выше (ну или остального бота в подпапку).
    Тогда бот будет модулем, а главный скрипт - скриптом.

    Не, ты, конечно, можешь в __init__ написать изврат в духе
    try:
        from .wtf import stuff
    except ImportError:
        from wtf import stuff

    И сделать в main from __init__ import *
    Но не надо так делать. Пожалеешь потом.
    Ответ написан
    1 комментарий