Discord.js slash commands type 5响应无法停止“思考”状态如何处理?
Discord机器人Slash Command Type5响应消除思考状态实现方案
核心原理
你发送的Type 5(DEFERRED_CHANNEL_MESSAGE_WITH_SOURCE)响应本质是告知Discord暂存交互、先展示加载状态,后续直接调用Discord原生REST接口编辑原始交互响应即可替换加载状态,无需依赖webhook配置,也不需要引入额外npm库,使用机器人token直接鉴权即可完成操作。
具体实现步骤
- 首次响应Slash Command时正确返回Type 5,此时Discord会自动展示*「Bot正在思考」*的加载状态
- 业务逻辑处理完成后,调用PATCH接口编辑原始交互响应,接口路径为
https://discord.com/api/v10/webhooks/{机器人应用ID}/{interaction_token}/messages/@original - 接口请求成功后,原思考加载状态会自动替换为你返回的消息内容,加载状态同步消失
原生Node.js实现示例(无第三方依赖)
// 替换为自身对应参数 const APP_ID = "你的机器人应用ID"; const BOT_TOKEN = "你的机器人Token"; const interactionToken = "当前Slash Command触发的interaction对应token"; const replyBody = { content: "最终展示给用户的消息内容", // 可按需添加embeds、components等消息字段,格式与普通Discord消息一致 }; // 用Node.js原生https模块发送请求,无需引入任何npm库 const https = require("https"); const postData = JSON.stringify(replyBody); const requestOptions = { hostname: "discord.com", port: 443, path: `/api/v10/webhooks/${APP_ID}/${interactionToken}/messages/@original`, method: "PATCH", headers: { "Content-Type": "application/json", "Authorization": `Bot ${BOT_TOKEN}`, "Content-Length": Buffer.byteLength(postData) } }; const req = https.request(requestOptions, (res) => { let responseData = ""; res.on("data", (chunk) => { responseData += chunk; }); res.on("end", () => { // 响应处理完成,加载状态已消除 console.log("交互编辑成功", responseData); }); }); req.on("error", (err) => { console.error("请求出错:", err); }); req.write(postData); req.end();
注意事项
- interaction token有效期为交互触发后的15分钟,超过有效期后无法调用该接口编辑响应
- 若需要返回仅触发用户可见的ephemeral消息,需在首次返回Type 5响应时就携带
flags: 64参数,后续编辑时无需重复携带该字段 - 仅需机器人已开通
applications.commands权限即可调用该接口,无需额外配置webhook相关权限
内容的提问来源于stack exchange,提问作者lewis clark
相关产品推荐
相关产品推荐

