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

Discord.py v0.16.12调用get_message出现404: Unknown Message错误求助

解决Discord.py v0.16.12中get_message返回404 Unknown Message的问题

我之前在使用Discord.py旧版本时也碰到过类似的404问题,结合你的描述,给你几个可行的排查方向和解决方案:

1. 验证频道对象的有效性

虽然你确认了channel已定义,但要确保它是实际可访问的TextChannel对象,而不是一个纯ID或不完整的对象。可以先打印频道的ID和名称,确认和你目标频道完全一致:

print(f"频道ID: {channel.id}, 频道名称: {channel.name}")

另外要检查机器人是否真的加入了该频道——有时候管理员权限不代表机器人自动出现在所有频道里,需要确认频道成员列表里有机器人的身影。

2. 排查权限的实际生效情况

管理员权限看似覆盖所有权限,但频道的单独权限设置可能会覆盖全局权限。请检查目标频道的权限面板:

  • 确保机器人在该频道拥有读取消息历史和读取消息的权限
  • 确认没有单独给机器人设置拒绝读取消息的权限(即使全局是允许状态,频道单独拒绝会优先生效)

3. 尝试直接调用HTTP接口绕过库的封装

Discord.py v0.16.12的get_message方法可能存在缓存或参数处理的bug,你可以跳过库的封装,直接调用底层HTTP接口试试:

try:
    msg_data = await self.bot.http.get_message(channel.id, req["message_id"])
    # 手动把返回的字典转成Message对象
    from discord import Message
    msg = Message(state=self.bot._connection, channel=channel, data=msg_data)
    print("成功获取消息:", msg.content)
except Exception as e:
    print("HTTP接口调用错误:", e)

如果这个方法也返回404,那基本可以确定是Discord API层面的问题(比如消息确实不在机器人可访问范围内);如果成功,那就是库的get_message方法本身存在问题。

4. 考虑版本兼容性问题

Discord.py v0.16.12是非常老旧的版本(发布于2018年),Discord的API已经经过多次更新,旧版本库可能存在不兼容的情况。如果项目允许的话,建议升级到Discord.py v1.x或更高版本(注意v1.x和v0.16的API有较大差异,需要调整部分代码逻辑)。

5. 确认消息是否在机器人的缓存范围内

旧版本的get_message会先从本地缓存查找消息,如果消息不在缓存里才会调用API。你可以尝试先拉取频道的消息历史,把目标消息加载到缓存中,再调用get_message:

# 拉取最近100条消息到缓存
async for msg in channel.history(limit=100):
    if msg.id == int(req["message_id"]):
        print("找到目标消息:", msg.content)
        break
# 再尝试获取消息
msg = await self.bot.get_message(channel, req["message_id"])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:27:59