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
相关产品推荐
相关产品推荐

