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

如何用Discord.js V14.5结合Node.js实现自定义前缀的成员封禁/踢出

使用Discord.js V14.5实现带自定义前缀的封禁与踢出功能

前置要求

  • 已安装Discord.js V14.5:npm install discord.js@14.5.0
  • 在Discord开发者门户中,为你的机器人开启以下特权网关意图:
    • Guilds
    • GuildMembers
    • GuildMessages
    • Message Content(必须开启,否则无法读取用户消息内容)

基础框架与前缀设置

先搭建机器人核心结构,定义自定义前缀(示例用!,可自行修改):

const { Client, GatewayIntentBits } = require('discord.js');
const client = new Client({
  intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildMembers,
    GatewayIntentBits.GuildMessages,
    GatewayIntentBits.MessageContent
  ]
});

// 自定义前缀
const PREFIX = '!';

client.on('ready', () => {
  console.log(`Logged in as ${client.user.tag}!`);
});

实现踢出(Kick)命令

在消息事件中解析命令,添加权限检查与踢出逻辑:

client.on('messageCreate', async (message) => {
  // 忽略机器人自身消息和非前缀开头的消息
  if (message.author.bot || !message.content.startsWith(PREFIX)) return;

  // 拆分命令与参数
  const args = message.content.slice(PREFIX.length).trim().split(/ +/);
  const command = args.shift().toLowerCase();

  // 踢出命令逻辑
  if (command === 'kick') {
    // 检查用户权限
    if (!message.member.permissions.has('KickMembers')) {
      return message.reply('你没有权限执行踢出操作!');
    }
    // 检查机器人权限
    if (!message.guild.members.me.permissions.has('KickMembers')) {
      return message.reply('我没有权限踢出成员!');
    }
    // 获取目标成员
    const target = message.mentions.members.first();
    if (!target) {
      return message.reply('请@你要踢出的成员!');
    }
    // 防止非法操作
    if (target.id === message.author.id) return message.reply('你不能踢出自己!');
    if (target.id === client.user.id) return message.reply('你不能踢出我!');
    if (target.roles.highest.position >= message.member.roles.highest.position) {
      return message.reply('你不能踢出角色层级比你高或相等的成员!');
    }

    try {
      await target.kick(`由${message.author.tag}发起踢出`);
      message.reply(`已成功踢出 ${target.user.tag}`);
    } catch (err) {
      console.error(err);
      message.reply('踢出失败,请检查我的权限是否足够!');
    }
  }
});

实现封禁(Ban)命令

在同一个messageCreate事件中添加封禁逻辑,注意权限与方法差异:

// 接上面的代码,在kick命令后添加
if (command === 'ban') {
  // 检查用户权限
  if (!message.member.permissions.has('BanMembers')) {
    return message.reply('你没有权限执行封禁操作!');
  }
  // 检查机器人权限
  if (!message.guild.members.me.permissions.has('BanMembers')) {
    return message.reply('我没有权限封禁成员!');
  }
  // 获取目标成员
  const target = message.mentions.members.first();
  if (!target) {
    return message.reply('请@你要封禁的成员!');
  }
  // 防止非法操作
  if (target.id === message.author.id) return message.reply('你不能封禁自己!');
  if (target.id === client.user.id) return message.reply('你不能封禁我!');
  if (target.roles.highest.position >= message.member.roles.highest.position) {
    return message.reply('你不能封禁角色层级比你高或相等的成员!');
  }

  // 可选:删除目标最近7天的消息
  const deleteMessageDays = 7;
  try {
    await target.ban({
      deleteMessageSeconds: deleteMessageDays * 24 * 60 * 60,
      reason: `由${message.author.tag}发起封禁`
    });
    message.reply(`已成功封禁 ${target.user.tag}`);
  } catch (err) {
    console.error(err);
    message.reply('封禁失败,请检查我的权限是否足够!');
  }
}

启动机器人

最后添加登录代码,替换为你的机器人令牌:

client.login('你的机器人TOKEN');

额外提示

  • 若需要每个服务器使用不同前缀,可通过数据库(如SQLite、MongoDB)存储各服务器的前缀配置,解析命令时先读取对应服务器的前缀。
  • 可扩展临时封禁功能,使用timeout方法实现,需额外处理时长参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 13:35:33