discord.py编辑Embed不丢失反应及fetch_message报错解决
discord.py 编辑已有反应角色Embed问题解决方案
报错核心原因
fetch_message 是文本频道(TextChannel)实例的专属方法,直接在bot客户端实例上调用该方法会触发方法不存在的错误。
方案说明
仅修改消息的Embed字段时,不会删除消息上已有的反应,也不会重新推送@提及通知,完全兼容Carl-bot已经配置好的反应角色规则,不需要额外做反应迁移操作。
你不需要使用bot.command装饰器,直接在on_message事件监听逻辑中写入如下代码即可实现需求:
# 以下代码放在on_message事件的判断逻辑中 if message.content.startswith("embededit"): # 请替换为实际的频道ID、目标消息ID TARGET_CHANNEL_ID = 你的反应角色频道ID TARGET_MESSAGE_ID = 要编辑的Embed消息ID # 先获取目标频道实例,再拉取目标消息 target_channel = bot.get_channel(TARGET_CHANNEL_ID) role_embed_msg = await target_channel.fetch_message(TARGET_MESSAGE_ID) # 仅传入embed参数执行编辑,不触动原有反应和消息正文 await role_embed_msg.edit(embed=embedEdit) # 可选:给触发指令的消息打成功标记 await message.add_reaction("✅")
注意事项
- 确保机器人账号在目标频道拥有「查看频道」「管理消息」权限,否则接口会返回权限不足错误
- 调用
edit方法时不要传入content参数,只要不修改消息正文内容,Carl-bot绑定的反应角色逻辑就不会失效 - 避免变量命名冲突:原代码中将拉取到的目标消息也命名为
message,会覆盖事件传入的用户触发消息对象,容易引发逻辑异常,建议用不同变量名区分 - 如果使用discord.py 2.0及以上版本,需要在开发者后台和bot初始化代码中开启
message_content意图,否则无法监听到用户发送的embededit指令内容
内容的提问来源于stack exchange,提问作者Zillah
相关产品推荐
相关产品推荐

