如何开发自动处理Webhook数字的Discord排序机器人?
Discord机器人自动处理Webhook数字并排序发送方案
原代码的核心问题
- 你当前监听的是普通用户消息的
message事件,但要处理Webhook发送的内容,得先识别Webhook来源的消息 - 代码需要手动输入
sort命令触发,不符合你要的自动化需求 - 缺少数字有效性校验,容易因为非数字内容导致排序出错
- 依赖@频道指定目标,自动化场景应该固定目标频道ID
修正后的实现方案
以下代码基于Discord.js v12(和你现有代码兼容),如果使用v14+版本,后续会补充适配说明。
步骤1:配置基础参数
提前配置目标频道ID、可选的特定Webhook ID,方便后续维护。
步骤2:监听消息并识别Webhook
通过msg.webhookID判断是否为Webhook发送的消息,提取其中的数字。
步骤3:数字提取与排序
用正则提取所有数字,转成数值类型后排序,避免字符串排序的逻辑错误。
步骤4:自动发送到指定频道
直接向预设的目标频道发送排序结果。
修正后的完整代码:
const Discord = require('discord.js'); const client = new Discord.Client(); const token = '<你的机器人令牌>'; // 替换成你的目标频道ID const TARGET_CHANNEL_ID = '123456789012345678'; // 可选:如果只处理特定Webhook的消息,填入对应Webhook ID const TARGET_WEBHOOK_ID = '可选的Webhook ID'; client.on('ready', () => { console.log(`Logged in as ${client.user.tag}!`); // 提前获取目标频道,避免每次消息都重复查找 client.targetChannel = client.channels.cache.get(TARGET_CHANNEL_ID); if (!client.targetChannel) { console.error('目标频道不存在,请检查频道ID是否正确'); } }); client.on('message', msg => { // 跳过非Webhook消息,或只处理指定Webhook的消息 if (!msg.webhookID || (TARGET_WEBHOOK_ID && msg.webhookID !== TARGET_WEBHOOK_ID)) { return; } // 提取消息中所有数字(支持正负整数、小数) const numberMatches = msg.content.match(/[-+]?\d*\.?\d+/g); if (!numberMatches || numberMatches.length === 0) { console.log('未从Webhook消息中提取到数字'); return; } // 转成数值类型并排序 const numbers = numberMatches.map(num => parseFloat(num)); const sortedNumbers = numbers.sort((a, b) => a - b); // 发送到目标频道 if (client.targetChannel) { const output = sortedNumbers.join('\n'); client.targetChannel.send(`Webhook发送的数字已排序:\n${output}`); } }); client.login(token);
关键细节说明
- Webhook识别:
msg.webhookID存在则说明是Webhook发送的消息,若只需处理特定Webhook,保留TARGET_WEBHOOK_ID的判断即可 - 数字提取:正则
/[-+]?\d*\.?\d+/g可覆盖正负整数、小数的提取需求 - 排序逻辑:先转成数值类型再排序,避免出现
10 < 2的字符串排序错误 - 频道缓存:在
ready事件中提前获取目标频道,既提升效率也能提前检查频道是否存在
适配Discord.js v14+的说明
如果使用v14+版本,语法有以下变化:
- 客户端初始化需要传入权限意图
- 事件名改为
messageCreate webhookID改为驼峰命名webhookId
适配后的初始化代码:
const { Client, GatewayIntentBits } = require('discord.js'); const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent ] });
内容的提问来源于stack exchange,提问作者meow meow meoow
相关产品推荐
相关产品推荐

