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

使用Discord.Net与C#开发机器人时自定义表情无法显示求助

问题

我正在用Discord.Net和C#开发Discord机器人,服务器公告里包含大量自定义表情,但使用以下代码发送消息时,自定义表情无法正常显示,仅呈现纯文本形式。我尝试过转义符、表情ID、ToString()方法及表情名称等方式,均无效。

代码示例:

private Emote getEmote(string slashEmote = "<:338_patch:751808652834373673>")
{
    Emote Emotion;
    if(Emote.TryParse(slashEmote, out Emotion))
    {
        return Emotion;
    }
    return Emotion;
}

[SlashCommand("emote", "Test function for custom emotes")]
public async Task respondEmote()
{
    var test1 = getEmote();
    if(test1 == null) { await RespondAsync("EMOTE NOT FOUND"); return; }
    string test = getEmote() + "**TEST** <:338_patch:751808652834373673>";
    await RespondAsync(test);
}

运行结果:发送的消息中,自定义表情的代码<:338_patch:751808652834373673>直接以纯文本显示,未渲染为对应的自定义表情。

解决方案
  • 问题根源:直接拼接Emote对象与字符串时,Emote的ToString()方法返回值不符合渲染要求;且直接在字符串中写入表情代码时,Discord.Net默认会对内容进行转义,导致表情代码无法被识别。

  • 修复方案1:使用MessageBuilder构建消息
    这是最可靠的方式,MessageBuilder会自动处理表情的渲染:

    [SlashCommand("emote", "Test function for custom emotes")]
    public async Task respondEmote()
    {
        var emote = getEmote();
        if(emote == null) 
        { 
            await RespondAsync("EMOTE NOT FOUND"); 
            return; 
        }
        var messageBuilder = new MessageBuilder()
            .AddEmote(emote)
            .WithContent("**TEST**");
        await RespondAsync(message: messageBuilder);
    }
    
  • 修复方案2:发送时禁用不必要的转义
    若要保留字符串拼接的方式,可通过AllowedMentions.None参数禁用转义,让Discord正常解析表情代码:

    [SlashCommand("emote", "Test function for custom emotes")]
    public async Task respondEmote()
    {
        var emote = getEmote();
        if(emote == null) 
        { 
            await RespondAsync("EMOTE NOT FOUND"); 
            return; 
        }
        string test = $"{emote} **TEST** <:338_patch:751808652834373673>";
        await RespondAsync(test, allowedMentions: AllowedMentions.None);
    }
    
  • 优化getEmote方法
    简化冗余代码,提升可读性:

    private Emote GetEmote(string slashEmote = "<:338_patch:751808652834373673>")
    {
        Emote.TryParse(slashEmote, out var emote);
        return emote;
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 18:12:40