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

Discord.js中client.on('message')无法读取指定频道消息问题

问题分析与修复方案

核心原因:事件名称过时 + 缺少Bot登录逻辑

你的代码未执行的直接原因有两个:

  1. discord.js v14 已弃用message事件,改用messageCreate事件监听消息,旧事件名不会触发任何回调。
  2. 代码末尾没有调用client.login(),Bot根本没登录到Discord服务器,自然无法接收任何事件。

修复后的完整代码

const Discord = require('discord.js');
const fs = require('fs');

const client = new Discord.Client({
  intents: [
    Discord.GatewayIntentBits.Guilds,
    Discord.GatewayIntentBits.GuildMembers,
    Discord.GatewayIntentBits.MessageContent,
    Discord.GatewayIntentBits.GuildPresences,
  ],
});
const validStringsPath = 'valid_strings.txt';
const TARGET_CHANNEL_ID = '1144023627419897937';
const ROLE_NAME = 'reseller';

// 初始化时读取一次有效字符串,避免重复IO
let validStrings = [];
try {
  validStrings = fs.readFileSync(validStringsPath, 'utf8')
    .split('\n')
    .map(str => str.trim())
    .filter(str => str); // 过滤空行
} catch (err) {
  console.error('读取有效字符串文件失败:', err);
}

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

client.on('messageCreate', async (message) => {
  // 忽略Bot自身消息
  if (message.author.bot) return;
  // 检查目标频道
  if (message.channel.id !== TARGET_CHANNEL_ID) return;

  const content = message.content.trim();

  try {
    if (validStrings.includes(content)) {
      const role = message.guild.roles.cache.find(r => r.name === ROLE_NAME);
      if (!role) {
        await message.channel.send("指定的角色在服务器中不存在。");
        await message.delete();
        return;
      }

      // 分配角色
      await message.member.roles.add(role);
      // 更新有效字符串列表并写入文件
      validStrings = validStrings.filter(str => str !== content);
      fs.writeFileSync(validStringsPath, validStrings.join('\n'));

      console.log(`已为用户${message.author.tag}分配角色,并移除密钥: ${content}`);
    } else {
      // 发送错误私信
      await message.author.send('Wrong key');
    }
    // 删除用户消息
    await message.delete();
  } catch (err) {
    console.error('处理消息时出错:', err);
    // 出错时尝试删除消息
    if (!message.deleted) await message.delete().catch(() => {});
  }
});

// 替换成你的Bot令牌
client.login('YOUR_BOT_TOKEN_HERE');

额外注意事项

  • 权限检查:确保Bot拥有「管理角色」「发送消息」「删除消息」「读取消息历史」的权限,否则会出现操作失败。
  • 文件权限:确保Node.js进程有读写valid_strings.txt的权限,避免文件操作失败。
  • 私信限制:如果用户关闭了陌生人私信,发送私信会失败,可改为在频道内发送提示(可选)。
  • 密钥唯一性:当前逻辑会移除已使用的密钥,确保每个密钥只能用一次,符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 09:43:32