如何制作可提取用户名与对应ID并发送文本文件的Discord bot
Discord Bot 成员数据导出功能修复方案
现有代码问题
- 事件注册逻辑错误:在
message事件回调内重复注册client.on("message"),会导致事件多次触发、内存泄漏 - 成员数据获取逻辑错误:
guild.members是成员集合,不能直接读取username和id属性,需要遍历集合逐个提取字段 - 缺失文件生成逻辑:没有将整理好的成员数据转换为文本文件的逻辑
- 频道调用语法过时:新版discord.js的频道查找需要走cache层,旧版
find方法已废弃
修复后可用代码
// 引入discord.js必要模块,v14版本请替换为const { AttachmentBuilder } = require('discord.js') const { MessageAttachment } = require('discord.js'); const devs = ['填写你的开发者用户ID']; client.on("message", async (message) => { // 响应触发指令 if (message.content === '16') { // 权限校验 if (!devs.includes(message.author.id)) return; if (message.channel.type === "dm") return; const currentGuild = message.guild; // 拉取服务器全量成员,需要提前开启Server Members Intent权限 await currentGuild.members.fetch(); const exportContent = []; // 按要求格式整理成员数据 currentGuild.members.cache.forEach(member => { exportContent.push(`${member.user.username}: ${member.user.id} used`); }); // 生成文本文件附件 const txtBuffer = Buffer.from(exportContent.join('\n'), 'utf-8'); // v14版本请替换为 const attachment = new AttachmentBuilder(txtBuffer, { name: 'member_list.txt' }) const attachment = new MessageAttachment(txtBuffer, 'member_list.txt'); // 发送到目标频道,替换为你的实际频道ID const targetChannel = client.channels.cache.get('75759********20'); if (targetChannel) { targetChannel.send({ files: [attachment] }); } } });
前置配置要求
- 前往Discord开发者平台的Bot管理页,开启
Server Members Intent权限,否则无法拉取完整成员列表 - 确保Bot在当前服务器拥有
Server Members Intent对应权限,在目标发送频道拥有发送消息、上传附件权限 - 如使用discord.js v14版本,按照代码注释修改附件构造方法即可
内容的提问来源于stack exchange,提问作者Smsm
相关产品推荐
相关产品推荐

