Discord.js机器人如何定时自动触发执行已有的slash斜杠命令
核心原因
Discord 斜杠命令属于应用交互范畴,仅能通过客户端主动选择调用、或官方交互API触发,你直接发送纯文本/command string只会被判定为普通消息,不会被Discord识别为斜杠命令调用,自然不会触发对应逻辑。
最优解决方案:抽离复用命令逻辑
完全不需要模拟斜杠命令调用,直接把原有斜杠命令的执行逻辑封装为独立可复用函数,定时任务直接调用该函数即可,实现简单且稳定性最高。
示例代码如下:
// 1. 抽离原有斜杠命令的执行逻辑为独立函数 async function runMyCommand(targetChannel, param) { // 这里写入你原来/command命令的所有业务逻辑 // 比如需要发消息到频道直接用传入的targetChannel对象操作即可 await targetChannel.send(`命令执行完成,传入参数为:${param}`) } // 2. 原有斜杠命令监听处直接调用封装好的函数 bot.on('interactionCreate', async interaction => { if (!interaction.isChatInputCommand()) return if (interaction.commandName === 'command') { const inputParam = interaction.options.getString('你设置的参数名') await runMyCommand(interaction.channel, inputParam) await interaction.reply('命令已执行') } }) // 3. 定时任务直接调用封装好的函数,不需要发送纯文本斜杠命令 let commandInterval = null bot.on('messageCreate', async (msg) => { if (msg.content === "!loop") { // 启动前先清理已有定时,避免重复触发 if (commandInterval) clearInterval(commandInterval) // 5分钟间隔对应为 5 * 60 * 1000 毫秒 commandInterval = setInterval(async () => { // 传入指定频道和你需要的参数即可 await runMyCommand(msg.channel, 'string') }, 5 * 60 * 1000) await msg.reply('定时执行任务已启动') } })
注意事项
- 定时间隔不要设置过短,避免触发Discord的接口速率限制
- 建议给
runMyCommand函数添加try/catch异常捕获,避免单次逻辑报错导致整个定时任务中断 - 多场景触发定时任务时要做好实例隔离,避免出现多个定时任务同时运行的问题
内容的提问来源于stack exchange,提问作者JasonT
相关产品推荐
相关产品推荐

