Top.Mail.Ru
Ответы

Возможно ли получить id пользователя по упоминанию в Aiogram?

Снова я. В общем делаю так сказать чат-менеджера для моей группы. Мне нужно получить id пользователя, которого я тегнул, чтобы записать его в массив. Как это сделать? Все, что я нашел в интернете -

1
 В объекте Message есть атрибут entities, который содержит список сущностей, найденных в тексте сообщения. Сущности могут быть разных типов, например, хештеги, ссылки и имена пользователей. Чтобы получить упомянутого пользователя, нужно обработать список сущностей, найти там сущность типа MessageEntityMentionName и взять из нее user_id. 

Но при помощи такого кода:

12345678
 ent = message.entities 
        x = "" 
        if len(ent) > 1: 
            for i in ent: 
                print(i) 
                x = i.values.get("type") 
                if x == "mention": 
                    print(i.values) 

у меня получилось достать такой словарь

1
 {'type': 'mention', 'offset': 8, 'length': 8, 'url': None, 'user': None, 'language': None, 'custom_emoji_id': None} 

В котором ну явно нет id пользователя.

По дате
По Рейтингу
Аватар пользователя
Мудрец

MessageEntityMentionName

Это из телетон.
Я бы записывал user_id и username в БД, а при упоминании забирал оттуда необходимое

Аватар пользователя
Ученик

Привет.
Возможно вопрос уже не актуален. Но на просторах интернета я не нашел ничего быстрее и лучше, я решил проблему своим способом.

Если вкратце библиотека aiogram имеет функцию получения юзера, но требуется вводить его id.

Однако. pyrogram имеет метод получения пользователя и его данных не только через message.id , но и через его @username.
(В документации можете заметить user_id может быть int и (!) STR. Ну и так же в документации указано, о возможности передачи user_id как @username.

Для решения своей задачи на работе я внедрил в aiogram другую библиотеку - pyrogram.
Получалось, что я просто запускаю вместо с клиентом aiogram еще и pyrogram, вот так:

И потом просто внутри хендлера aiogram использую функцию get_chat_member() pyrogram (не путать с get_chat_member() aiogram):

Импортировать app нельзя. Иначе будет экспешн на авторизацию от телеги и клиент будет заморожен на 45 минут. Поэтому приходится те хендлеры, что используют функционал pyrogram писать прямо внутри async def main(). Не красиво, но работает и очень быстро.

Аватар пользователя
Оракул

Вам нужно будет использовать регулярные выражения для поиска упоминания пользователя в тексте сообщения. Вот пример кода:

1234567891011
 import re 
from aiogram import types 
 
@dp.message_handler() 
async def handle_message(message: types.Message): 
    mention = re.search(r'@(\w+)', message.text) 
    if mention: 
        username = mention.group(1) 
        # TODO: get user_id using username 
        await message.reply(f'ID пользователя {user_id}') 
 

В этом коде мы используем регулярное выражение r'@(\w+)' для поиска упоминаний в тексте сообщения. Если упоминание найдено, мы извлекаем имя пользователя из упоминания и затем используем это имя пользователя для получения ID пользователя.

Однако, стоит отметить, что Telegram не предоставляет прямого способа получить ID пользователя по его имени. Вам придется использовать метод get_chat с вашим ботом и передать имя пользователя в качестве аргумента. Это вернет объект User, который содержит ID пользователя.