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

如何为Disnake Bot发送至其他频道的消息添加按钮

如何在频道消息中添加交互按钮实现昵称审批功能

核心思路是利用Discord机器人开发库提供的**消息组件(Message Components)**创建按钮,并监听按钮交互事件完成审批操作。下面以Discord.js v14为例给出具体实现步骤:

1. 创建并发送带按钮的审批消息

当用户发送!nick [name]命令后,构造包含"Accept"和"Reject"按钮的消息并发送到管理频道:

const { ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js');

// 监听!nick命令
client.on('messageCreate', async (message) => {
  if (!message.content.startsWith('!nick') || message.author.bot) return;

  const newNick = message.content.split(' ')[1];
  if (!newNick) return message.reply('请提供你想要修改的昵称!');

  // 构建Accept按钮(绿色成功样式)
  const acceptBtn = new ButtonBuilder()
    .setCustomId('nick_accept')
    .setLabel('Accept')
    .setStyle(ButtonStyle.Success);

  // 构建Reject按钮(红色危险样式)
  const rejectBtn = new ButtonBuilder()
    .setCustomId('nick_reject')
    .setLabel('Reject')
    .setStyle(ButtonStyle.Danger);

  // 将按钮放入ActionRow容器(Discord要求按钮必须包裹在ActionRow中)
  const actionRow = new ActionRowBuilder().addComponents(acceptBtn, rejectBtn);

  // 获取目标管理频道(替换为你的管理频道ID)
  const modChannel = client.channels.cache.get('123456789012345678');
  if (!modChannel) return message.reply('无法找到管理频道,请检查配置!');

  // 发送带按钮的审批消息
  await modChannel.send({
    content: `用户 ${message.author.tag} (ID: ${message.author.id}) 请求修改昵称为:${newNick}`,
    components: [actionRow]
  });

  message.reply('你的昵称修改请求已提交,等待管理员审批!');
});

2. 监听按钮交互事件处理审批

按钮发送后,监听点击操作,根据自定义ID区分审批类型并执行对应逻辑:

// 监听所有交互事件
client.on('interactionCreate', async (interaction) => {
  // 只处理按钮类型的交互
  if (!interaction.isButton()) return;

  // 处理昵称审批按钮
  if (['nick_accept', 'nick_reject'].includes(interaction.customId)) {
    // 从审批消息中提取用户ID和请求的新昵称
    const content = interaction.message.content;
    const userIdMatch = content.match(/ID: (\d+)/);
    const nickMatch = content.match(/修改昵称为:(.+)/);
    
    if (!userIdMatch || !nickMatch) return interaction.reply({ content: '无法解析审批消息内容', ephemeral: true });

    const userId = userIdMatch[1];
    const newNick = nickMatch[1];
    const targetMember = interaction.guild.members.cache.get(userId);
    const targetUser = await client.users.fetch(userId);

    if (interaction.customId === 'nick_accept') {
      try {
        // 修改用户昵称
        await targetMember.setNickname(newNick);
        // 向管理员发送私密回复
        await interaction.reply({ content: `已批准 ${targetUser.tag} 的昵称修改请求,新昵称:${newNick}`, ephemeral: true });
        // 通知用户审批结果
        targetUser.send(`你的昵称修改请求已通过,新昵称:${newNick}`).catch(() => {});
      } catch (err) {
        await interaction.reply({ content: `修改昵称失败:${err.message}`, ephemeral: true });
      }
    } else {
      // 处理拒绝请求
      await interaction.reply({ content: `已拒绝 ${targetUser.tag} 的昵称修改请求`, ephemeral: true });
      targetUser.send(`你的昵称修改请求已被拒绝`).catch(() => {});
    }

    // 禁用按钮,防止重复点击
    await interaction.message.edit({
      components: [
        ActionRowBuilder.from(interaction.message.components[0]).setComponents(
          interaction.message.components[0].components.map(btn => btn.setDisabled(true))
        )
      ]
    });
  }
});

关键注意事项

  • 自定义ID:每个按钮的setCustomId需唯一,用于区分不同操作。
  • ActionRow容器:Discord要求所有按钮必须放在ActionRowBuilder中,单个ActionRow最多容纳5个按钮。
  • 权限控制:确保机器人拥有修改成员昵称、向管理频道发送消息的权限。
  • Ephemeral回复:ephemeral: true让管理员的回复仅自己可见,避免频道消息杂乱。
  • 错误处理:处理修改昵称失败、用户关闭DM无法接收通知的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 04:32:41