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

discord.js中如何获取非机器人已加入服务器的表情URL?

解决Discord机器人获取跨服务器表情URL的问题

首先得说清楚为什么你现在的方法只能拿到已加入服务器的表情:bot.emojis这个缓存集合只存储机器人已经加入的服务器里的自定义表情,跨服务器的表情不在这个缓存范围内,所以用bot.emojis.get(emojiID)肯定查不到。

下面给你两个实用的解决方案,适配不同的场景:

方案1:直接从用户消息的表情对象提取URL(推荐)

你的场景是「用户发送表情后机器人回复」,这时候最靠谱的方式是直接从用户发送的消息里拿表情的URL——因为Discord在传递消息时,已经把表情的完整信息(包括URL)附带过来了,不管机器人有没有加入表情所在的服务器。

比如用Discord.js v14+的代码示例:

client.on('messageCreate', async (message) => {
  // 忽略机器人自己的消息
  if (message.author.bot) return;

  // 检查消息里是否包含自定义表情
  if (message.emojis.size > 0) {
    // 取消息里的第一个表情(你可以根据需求调整,比如遍历所有表情)
    const emoji = message.emojis.first();
    
    // 发送带表情图片的消息
    await message.channel.send({
      content: `你发送的表情:`,
      files: [emoji.url]
    });

    // 或者直接发送表情的链接,甚至可以用表情的标记格式
    await message.channel.send(`表情链接:${emoji.url}\n表情标记:${emoji.toString()}`);
  }
});

这里的核心是message.emojis里的每个Emoji实例都自带url属性,完全不需要依赖机器人的服务器缓存。

方案2:解析表情标记构造URL(仅部分场景可用)

如果用户发送的不是直接的表情,而是表情的标记字符串(比如<:BlobCat:123456789>)或者纯ID,你可以解析出ID后构造CDN链接,但要注意局限性:

client.on('messageCreate', async (message) => {
  if (message.author.bot) return;

  // 匹配表情标记格式:<a:名称:ID>(动态表情)或<:名称:ID>(静态表情)
  const emojiRegex = /<(a?):\w+:(\d+)>/;
  const matchResult = message.content.match(emojiRegex);

  if (matchResult) {
    const isAnimated = matchResult[1] === 'a';
    const emojiID = matchResult[2];
    // 构造CDN链接
    const emojiUrl = `https://cdn.discordapp.com/emojis/${emojiID}.${isAnimated ? 'gif' : 'png'}`;

    try {
      await message.channel.send({ files: [emojiUrl] });
    } catch (error) {
      // 如果机器人没有访问该表情的权限,会返回403,这里可以做错误处理
      await message.channel.send('抱歉,无法获取这个表情的图片哦😥');
    }
  }
});

⚠️ 注意:这种方法对机器人未加入的服务器的自定义表情可能失效——Discord的CDN会验证请求权限,没有权限的话会返回403错误。所以只有当用户是通过Nitro使用该表情(此时CDN链接会临时开放),或者表情所在服务器对机器人开放了权限,这个方法才管用。

总结

优先用方案1,因为它完全依赖用户消息里的表情数据,不需要考虑服务器权限问题,是最稳定的解决方式。方案2只能作为补充,处理用户发送表情标记或ID的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:25:07