You need to enable JavaScript to run this app. Discord.py开发:如何移除已有消息Embed的时间戳?设置timestamp为None报错
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.03 03:54:04