如何通过message_id编辑Embed?React触发编辑时遇属性错误
问题原因
set_field_at 是 Embed 对象的方法,不是 Message 对象的方法。你直接在 message 上调用这个方法,自然会触发 AttributeError。
解决方法
要修改消息里的Embed,需要先提取消息中的Embed实例,修改它之后,再通过 message.edit() 方法替换原消息的Embed。
修改后的代码示例:
@bot.event async def on_raw_reaction_add(payload): channel = await bot.fetch_channel(payload.channel_id) message = await channel.fetch_message(payload.message_id) # 先检查消息是否包含Embed,避免无Embed时报错 if not message.embeds: return # 获取消息中的第一个Embed(假设消息只有一个Embed) embed = message.embeds[0] # 根据表情修改指定字段 if payload.emoji.name == "✅": embed.set_field_at(4, name="Status:", value="Accepted") elif payload.emoji.name == "❎": embed.set_field_at(4, name="Status:", value="Denied") elif payload.emoji.name == "❌": embed.set_field_at(4, name="Status:", value="Canceled") else: return # 编辑消息,替换为修改后的Embed await message.edit(embed=embed)
额外注意事项
- 字段索引从0开始计数,确认你要修改的第5个字段(索引4)确实存在,否则会触发
IndexError。 - 如果消息中有多个Embed,需要根据实际情况选择对应的索引(比如
message.embeds[1])。 - 可添加异常处理,捕获
IndexError处理字段不存在的情况:
try: embed.set_field_at(4, name="Status:", value="Accepted") except IndexError: # 字段不存在时的处理逻辑,比如添加新字段 embed.add_field(name="Status:", value="Accepted")
内容的提问来源于stack exchange,提问作者CraftyTheHawk
相关产品推荐
相关产品推荐

