Возможно ли получить id пользователя по упоминанию в Aiogram?
Снова я. В общем делаю так сказать чат-менеджера для моей группы. Мне нужно получить id пользователя, которого я тегнул, чтобы записать его в массив. Как это сделать? Все, что я нашел в интернете -
В объекте Message есть атрибут entities, который содержит список сущностей, найденных в тексте сообщения. Сущности могут быть разных типов, например, хештеги, ссылки и имена пользователей. Чтобы получить упомянутого пользователя, нужно обработать список сущностей, найти там сущность типа MessageEntityMentionName и взять из нее user_id.
Но при помощи такого кода:
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)
у меня получилось достать такой словарь
{'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(). Не красиво, но работает и очень быстро.
Вам нужно будет использовать регулярные выражения для поиска упоминания пользователя в тексте сообщения. Вот пример кода:
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 пользователя.