Discord.py开发:如何移除已有消息Embed的时间戳?设置timestamp为None报错
discord.py 移除Embed时间戳报错的解决方案
问题根源
你直接给embed.timestamp赋值None触发错误,本质是两个逻辑冲突:
- 从
msg.embeds[0]取出的Embed是Discord API返回的原始数据解析对象,部分版本discord.py对这类实例的属性赋值校验逻辑不完善,赋值None时会直接触发内部错误。 - Discord API的规则要求:要移除Embed的可选字段(如时间戳、图片等),需要在提交的请求载荷中完全省略该字段,而非传入
null值。直接赋值None序列化后会携带timestamp: null的字段,不符合接口规范,甚至会被拒绝请求。
你之前修改颜色、设置新时间戳可以正常运行,是因为这类操作传入的都是有效非空值,序列化后会正确更新对应字段,符合接口要求。
正确处理方案
方案一(全版本兼容,最稳妥)
通过将Embed转为字典结构删除timestamp字段,再重新构建Embed的方式适配接口规则:
@commands.command() async def remove_timestamp(self, ctx, msg: discord.MessageConverter): # 先校验目标消息是否存在Embed,避免空列表取索引报错 if not msg.embeds: await ctx.send("目标消息未携带任何Embed内容") return # 把原Embed转为可编辑的字典 embed_raw = msg.embeds[0].to_dict() # 直接移除timestamp字段,不存在时也不会报错 embed_raw.pop("timestamp", None) # 用修改后的字典生成新Embed new_embed = discord.Embed.from_dict(embed_raw) await msg.edit(embed=new_embed)
方案二(discord.py 2.0+版本可用,更简洁)
使用discord.py内置的MISSING常量赋值,直接告诉序列化器不要在请求中携带timestamp字段:
@commands.command() async def remove_timestamp(self, ctx, msg: discord.MessageConverter): if not msg.embeds: await ctx.send("目标消息未携带任何Embed内容") return embed = msg.embeds[0] # 用MISSING替代None,触发序列化逻辑省略该字段 embed.timestamp = discord.utils.MISSING await msg.edit(embed=embed)
补充注意事项
- 如果目标消息携带多个Embed,需要遍历所有Embed逐个处理,编辑时用
embeds=[处理后的embed1, embed2]参数传入全量列表,而非单个embed参数。 - 不要省略Embed存在性的校验逻辑,否则目标消息无Embed时会直接触发
IndexError。
内容的提问来源于stack exchange,提问作者Ceres
相关产品推荐
相关产品推荐

