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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:10:09