You need to enable JavaScript to run this app. Discord.py:如何从B发送的回复A的消息中获取A的用户ID
优惠活动
大模型
产品
解决方案
定价
更多

Discord.py:如何从B发送的回复A的消息中获取A的用户ID

报错根因

你触发报错的核心原因是,message.reference对象上的message_id属性本身就是整数类型的消息编号,不是完整的消息实例,直接链式调用.author.id自然会抛出AttributeError: 'int' object has no attribute 'author'。

修正方案

整个判断流程需要补全边界校验,按discord.py的API设计取被引用消息的对象,再做作者校验:

  • 先过滤非目标机器人发送的消息,减少无意义的逻辑判断
  • 校验当前消息的reference字段非空,排除所有普通非回复消息的干扰
  • 优先通过reference.resolved属性获取被引用的消息对象,这个属性是discord.py SDK在解析消息时自动加载的完整Message实例,不需要手动发起API请求,开销极低
  • 校验拿到的被引用消息是有效的Message对象,排除原消息被删除、缓存失效导致返回空值的边界情况
  • 确认被引用消息的作者ID匹配你的账号ID后,再执行后续提取、回发内容的逻辑
  • 替换代码中已被弃用的旧版接口:bot.send_message是discord.py 0.x版本的老旧写法,现在主流1.x、2.x版本直接在消息所在的频道对象上调用send方法即可。
修正后的完整可运行代码
import discord
# 提前替换为实际的账号ID
TARGET_BOT_ID = 朋友机器人的账号ID
MY_ID = 你自己的用户账号ID

@bot.event
async def on_message(message):
    # 非目标机器人发的消息直接跳过
    if message.author.id != TARGET_BOT_ID:
        return
    
    content = str(message.content)
    reference = message.reference
    # 排除非回复类消息
    if not reference:
        return
    
    # 获取被引用的消息对象
    referenced_msg = reference.resolved
    # 排除无效的被引用消息(比如原消息被删除、缓存未加载)
    if not isinstance(referenced_msg, discord.Message):
        return
    
    # 校验这条回复是不是针对你发的消息
    if referenced_msg.author.id == MY_ID:
        # 提取反引号包裹的内容
        target_word = content.split('`')[1].split('`')[0]
        # 同频道发回内容
        await message.channel.send(target_word)
特殊场景补充

如果遇到resolved拿不到有效消息的极端情况(比如机器人本地缓存过期、被引用的消息发布时间太久远没有被加载到缓存),可以手动通过消息ID拉取完整对象:

# 替换原来的referenced_msg取值逻辑
referenced_msg = await message.channel.fetch_message(reference.message_id)

这种方式会主动向Discord接口发请求获取消息,相比从缓存读取会多一次网络开销,只有resolved失效的时候再用。

内容的提问来源于stack exchange,提问作者BrightBulb123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 13:54:02