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

discord.py开发Discord机器人 发送GIF仅播放一次不循环问题

核心原因

Discord客户端会对所有嵌入的GIF动图强制开启无限循环,完全忽略GIF文件头内配置的循环次数参数,这是平台层面的固定行为,无法通过修改源文件属性、调整Embed参数绕过。

前置代码Bug修复

你当前的触发判断逻辑存在错误,会导致频道内所有消息都触发骰子回复:

  • 未读取message.content属性,直接判断message对象永远不可能匹配字符串"🎲"
  • or ":game_die:"属于恒真判断,非空字符串在Python中布尔值恒为True
    修正后的判断逻辑如下:
if message.content.strip() in ("🎲", ":game_die:"):
可行实现方案

你设想的「GIF播放完成后替换为最后一帧静态图」是目前所有同类骰子机器人通用的实现方案,针对你担心的弱网用户加载未完成就被替换的问题,只需要做两点优化即可解决:

  • 不使用固定1秒延时,按照GIF实际单轮播放时长增加300-500ms的缓冲时间,你使用的骰子GIF单轮时长约1.2秒,设置1.5-1.7秒延时即可覆盖绝大多数正常网络场景
  • 替换静态图时仅修改Embed内的图片链接,保留其他Embed属性,用户不会感知到消息重载
    完整实现代码参考:
import random
import asyncio
import discord
from discord.ext import commands

class Dice(commands.Cog):
    def __init__(self, bot):
        self.bot = bot
        # 提前配置对应点数的GIF地址、最后一帧静态图地址、播放时长(含缓冲)
        self.dice_conf = {
            i: {
                "gif": f"对应{i}点的GIF文件地址",
                "static": f"对应{i}点GIF最后一帧的静态图地址",
                "duration": 1.6
            } for i in range(1,7)
        }
         
    @commands.Cog.listener("on_message")
    async def dice(self, message):
        if message.author.bot:
            return
        if message.content.strip() not in ("🎲", ":game_die:"):
            return
        point = random.randint(1, 6)
        current = self.dice_conf[point]
        # 发送带GIF的初始消息
        embed = discord.Embed(color=discord.Color.random())
        embed.set_image(url=current["gif"])
        sent = await message.channel.send(embed=embed)
        # 等待播放完成+缓冲时间后替换静态图
        await asyncio.sleep(current["duration"])
        embed.set_image(url=current["static"])
        await sent.edit(embed=embed)

    
def setup(bot):
    bot.add_cog(Dice(bot))
注意事项
  • 不要尝试使用APNG、WebP等其他动图格式绕开循环限制,Discord对所有动图格式都会做强制无限循环处理
  • 若你的使用场景中弱网用户占比较高,可以将缓冲时长调整到2秒,对正常用户的体验影响极小
  • 静态帧建议提前导出后上传到稳定图床,不要运行时实时生成,稳定性最高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 18:22:21