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

Discord JS中如何通过customID检查按钮是否包含指定emoji

Discord.js 基于customId校验按钮emoji方案

适配版本:Discord.js v14

核心逻辑

按钮组件统一挂载在消息的components字段对应的ActionRow数组中,遍历所有行内组件找到customId匹配的按钮对象后,提取emoji的实际标识值和预期值做比对即可,注意区分Unicode默认表情和服务器自定义表情的取值规则。

可直接复用的实现代码

// 引入组件类型枚举,不想引入的话直接用数字2代表按钮类型即可
const { ComponentType } = require('discord.js');

/**
 * 校验指定customId的按钮是否配置了目标emoji
 * @param {Array} actionRows 消息的components数组,或本地构建的ActionRowBuilder数组
 * @param {string} targetCustomId 目标按钮的customId
 * @param {string} expectedEmoji 预期emoji:Unicode表情直接传字符,自定义表情传emoji id
 * @returns {boolean} 校验结果,找不到对应按钮/按钮无emoji/emoji不匹配均返回false
 */
function checkButtonEmoji(actionRows, targetCustomId, expectedEmoji) {
  for (const row of actionRows) {
    for (const comp of row.components) {
      // 过滤掉下拉框、输入框等非按钮组件
      if (comp.type !== ComponentType.Button) continue;
      if (comp.customId !== targetCustomId) continue;

      // 按钮未配置emoji
      if (!comp.emoji) return false;
      // 自定义emoji取id,Unicode表情取name做比对
      const currentEmoji = comp.emoji.id ?? comp.emoji.name;
      return currentEmoji === expectedEmoji;
    }
  }
  // 遍历完没找到对应按钮
  return false;
}

调用示例

对应customId为1的按钮预期emoji为🔷的场景,直接调用即可:

// 从已收到的消息对象上取按钮配置做校验
const isMatch = checkButtonEmoji(message.components, "1", "🔷");

// 如果是本地构建还未发送的按钮,直接传构建好的ActionRow数组即可
const isMatchForLocal = checkButtonEmoji(builtActionRows, "1", "🔷");

注意事项

  • 不要直接拿component.emoji对象和emoji字符串做全等比对,emoji字段是结构化对象,直接比对永远返回false
  • 若你的按钮customId携带动态参数(比如confirm_123这类拼接值),把customId的全等判断改成你需要的前缀/正则匹配即可,其余逻辑不变
  • 自定义服务器emoji校验时优先用emoji id做匹配,避免emoji重名导致校验误判

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 18:48:54