Laginatory
@Laginatory

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

Пишу бота, который будет банить пользователей.

Бан по айди реализовать было довольно легко, но постоянно его получать неудобно, и хочется, чтобы команда работала и с юзернеймом.

Но для бана пользователя нужен его айди, а не юзер.

Как получить айди пользователя, зная только его юзернейм, при условии, что пользователь ничего не писал боту и без баз данных?
  • Вопрос задан
  • 2729 просмотров
Решения вопроса 1
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
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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