如何用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
相关产品推荐
相关产品推荐

