You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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字段:

  1. 提及的用户是当前聊天中的成员;
  2. 使用的是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 23:11:17