Aiogram中提及用户的entities无user字段,无法获取用户ID
Aiogram中@提及的MessageEntity.user为None的问题解决
我在用aiogram开发Telegram机器人时遇到一个问题:我实现了/buy命令,需要接收的参数包括命令本身、可选的@username(如果没有则用消息发送者ID)、物品名称。目标是从@username中提取用户ID,但发现mention类型的MessageEntity的user字段始终为None。
相关代码如下:
@dp.message(Command("buy")) @UsOper.public async def buy_item(message: Message): try: text_words = message.text.split() print(message.entities) if len(text_words) == 3: for entity in message.entities: if entity.type == 'mention': user_id = entity.user.id item_title = text_words[2] elif len(text_words) == 2: item_title = text_words[1] user_id = message.from_user.id await AssortOper.buy_item(item_title, user_id, message.chat.id) await message.reply(f"Item {item_title} purchased!") except Exception as ex: print(ex, "__buy_item")
当发送带@username的/buy命令时,message.entities的输出显示mention实体的user字段为None:
[MessageEntity(type='bot_command', offset=0, length=4, url=None, user=None, language=None, custom_emoji_id=None), MessageEntity(type='mention', offset=5, length=8, url=None, user=None, language=None, custom_emoji_id=None)]
原因分析
Telegram Bot API返回的mention类型实体不会自动附带用户信息,只有两种情况会填充user字段:
- 提及的用户是当前聊天中的成员;
- 使用的是
text_mention类型实体(即通过隐藏链接关联用户的方式)。
普通的@username格式的mention,Telegram仅会返回用户名的文本范围,不会主动查询并返回用户ID。
解决方案
需要手动从mention文本中提取用户名,再调用Bot的get_user方法获取用户ID,修改后的代码如下:
@dp.message(Command("buy")) @UsOper.public async def buy_item(message: Message, bot: Bot): try: text_words = message.text.split() print(message.entities) if len(text_words) == 3: # 提取用户名(去掉前缀@) mention_text = text_words[1] username = mention_text.lstrip('@') # 调用API获取用户信息 user = await bot.get_user(username) if not user: await message.reply("无法找到该用户,请检查用户名是否正确。") return user_id = user.id item_title = text_words[2] elif len(text_words) == 2: item_title = text_words[1] user_id = message.from_user.id await AssortOper.buy_item(item_title, user_id, message.chat.id) await message.reply(f"物品 {item_title} 购买成功!") except Exception as ex: print(ex, "__buy_item") await message.reply("购买过程中出现错误,请稍后重试。")
注意事项
- 若目标用户未与Bot互动过,
get_user可能返回None,需添加相应的错误处理; - 函数参数中需注入
Bot实例,aiogram会自动处理依赖注入; - 确保Bot具备访问目标用户信息的权限。
内容的提问来源于stack exchange,提问作者lucorus
相关产品推荐
相关产品推荐

