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

Discord.py自定义表情在Embed中随机不显示的问题解决

问题修复与替代方案

一、修复自定义表情加载问题

你的核心问题是创建表情后直接从本地缓存查询,而Discord的缓存同步存在延迟,导致get方法偶尔找不到刚创建的表情。正确的做法是直接使用create_custom_emoji返回的表情对象,跳过缓存查询步骤:

修复后的代码调整

@bot.command()
async def draft(ctx, counter):
    embed = discord.Embed(title='Lords')
    try:
        count = int(counter)
    except ValueError:
        await ctx.send("请输入有效的数字(1-3)")
        return
    
    # 修正原逻辑错误:仅当数字在1-3范围内时执行选取
    if 1 <= count <= 3:
        rand_lords = random.sample(lords, count)
        created_emojis = []  # 记录创建的表情,用于后续精准删除
        
        for rand_lord in rand_lords:
            # 创建表情并直接获取返回的Emoji实例
            with open(f'assets/{rand_lord["asset"]}.webp', 'rb') as fd:
                emoji = await ctx.guild.create_custom_emoji(
                    name=rand_lord['asset'], 
                    image=fd.read()
                )
            created_emojis.append(emoji)
            embed.add_field(
                name=rand_lord["lord"], 
                value=str(emoji),  # 直接转成Discord可识别的表情字符串
                inline=False
            )
        
        await ctx.send(embed=embed)
        
        # 删除本次创建的表情
        for emoji in created_emojis:
            await emoji.delete()
    else:
        await ctx.send("请输入1-3之间的数字")

关键改进点

  • 直接使用create_custom_emoji返回的对象,彻底避免缓存不一致问题
  • 修正原代码中if条件的逻辑颠倒错误
  • 增加数字格式校验,防止非数字输入引发报错
  • 记录本次创建的表情,精准删除避免误删服务器其他表情

二、无需自定义表情的替代方案

自定义表情存在服务器数量限制,且频繁创建删除效率低下,推荐两种更稳定的方案:

方案1:使用附件引用图片

将图片作为附件上传,在Embed字段中通过attachment://文件名引用:

@bot.command()
async def draft(ctx, counter):
    embed = discord.Embed(title='Lords')
    try:
        count = int(counter)
    except ValueError:
        await ctx.send("请输入有效的数字(1-3)")
        return
    
    if 1 <= count <= 3:
        rand_lords = random.sample(lords, count)
        files = []
        
        for idx, rand_lord in enumerate(rand_lords):
            file_path = f'assets/{rand_lord["asset"]}.webp'
            # 重命名文件避免同名冲突
            file = discord.File(file_path, filename=f'lord_{idx}.webp')
            files.append(file)
            # 在字段中插入附件图片
            embed.add_field(
                name=rand_lord["lord"], 
                value=f'![{rand_lord["lord"]}](attachment://lord_{idx}.webp)',
                inline=False
            )
        
        # 同时发送Embed和附件
        await ctx.send(embed=embed, files=files)
    else:
        await ctx.send("请输入1-3之间的数字")

方案2:使用公开图片链接

如果图片已上传到公开CDN(如自建服务器、图床),可直接在Embed字段中使用链接:

@bot.command()
async def draft(ctx, counter):
    embed = discord.Embed(title='Lords')
    try:
        count = int(counter)
    except ValueError:
        await ctx.send("请输入有效的数字(1-3)")
        return
    
    if 1 <= count <= 3:
        rand_lords = random.sample(lords, count)
        
        for rand_lord in rand_lords:
            # 替换为你的图片CDN链接前缀
            img_url = f'https://your-cdn-domain.com/assets/{rand_lord["asset"]}.webp'
            embed.add_field(
                name=rand_lord["lord"], 
                value=f'![{rand_lord["lord"]}]({img_url})',
                inline=False
            )
        
        await ctx.send(embed=embed)
    else:
        await ctx.send("请输入1-3之间的数字")

这两种方案无需依赖自定义表情,避免了缓存、权限和数量限制问题,运行效率更稳定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:10:29