如何用Discord.js实现Discord机器人读取聊天附件文件?
使用Discord.js读取聊天附件的实现方法
当然可以通过Discord.js实现读取Discord聊天中上传的附件文件!我之前做类似功能的时候踩过一些小坑,给你一步步说清楚具体操作:
1. 先配置机器人权限并监听消息事件
首先得确保你的机器人开启了必要的权限,然后监听messageCreate事件(Discord.js v14+版本用这个,旧版是message),用来捕获带附件的消息:
const { Client, GatewayIntentBits } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent // 这个权限必须开,否则读不到附件信息 ] }); client.on('messageCreate', async (message) => { // 忽略机器人自己发的消息,避免循环触发 if (message.author.bot) return; // 判断当前消息是否带有附件 if (message.attachments.size > 0) { // 把附件处理逻辑抽成单独函数,代码更清晰 await processAttachments(message); } }); client.login('你的机器人令牌');
2. 针对不同类型附件做处理
message.attachments是一个Collection集合,你可以遍历它处理每个附件。不同类型的文件(比如TXT、图片)处理方式略有不同:
处理文本类文件(如TXT)
对于文本文件,我们可以通过附件的url发起请求,直接获取文件内容:
// Node.js 18+可以用内置fetch,低版本需要安装node-fetch包 async function processAttachments(message) { for (const [_, attachment] of message.attachments) { // 只处理TXT文件 if (attachment.name.endsWith('.txt')) { try { const response = await fetch(attachment.url); const textContent = await response.text(); console.log(`读取到TXT内容:\n${textContent}`); // 也可以把内容发回聊天频道 await message.channel.send(`读取到的文本内容:\n\`\`\`${textContent}\`\`\``); } catch (err) { console.error('读取TXT失败:', err); await message.channel.send('读取文本文件时出了点问题'); } } } }
处理图片类文件
如果是图片,你可以直接获取它的URL用于展示,或者保存到本地:
const fs = require('fs').promises; async function processAttachments(message) { const imageExts = ['.png', '.jpg', '.jpeg', '.gif', '.webp']; for (const [_, attachment] of message.attachments) { if (imageExts.some(ext => attachment.name.endsWith(ext))) { console.log(`图片链接:${attachment.url}`); // 发回频道展示 await message.channel.send(`收到图片:\n${attachment.url}`); // 保存到本地的逻辑 try { const response = await fetch(attachment.url); const buffer = await response.buffer(); await fs.writeFile(`./saved_${attachment.name}`, buffer); console.log(`图片已保存到本地:./saved_${attachment.name}`); } catch (err) { console.error('保存图片失败:', err); } } } }
几个注意点
- 一定要开启
MessageContent权限,不然机器人根本看不到消息里的附件信息; - 处理大文件时要注意超时和内存问题,比如可以加个请求超时限制;
- 其他类型的文件(比如CSV、JSON)都可以参照文本文件的方式读取内容,只要调整文件后缀判断即可。
内容的提问来源于stack exchange,提问作者Kookie
相关产品推荐
相关产品推荐

