使用Autocode开发的Discord机器人无法移动语音用户问题求助
问题原因分析
- 未定义
guild对象:你使用的是Autocode封装的Discord API调用方式,没有引入discord.js原生的guild实例,直接调用guild.member()会直接抛出未定义错误,导致后续逻辑终止。 - 未实现
sleep方法:JS原生没有全局sleep函数,直接调用会触发引用错误,打断循环执行。 - 单频道移动逻辑无效:如果目标用户本来就待在ID为
789946095341535242的语音频道,重复调用设置同个频道不会产生移动效果,需要准备至少两个语音频道来回切换。 - 权限遗漏:机器人需要拥有移动成员的权限,同时目标语音频道也要给机器人开放连接、移动成员的权限,否则API调用会被拒绝。
修复方案
替换为如下适配Autocode调用规则的代码,注意提前准备同服务器下第二个语音频道的ID,填入代码对应位置:
const lib = require('lib')({token: process.env.STDLIB_SECRET_TOKEN}); // 实现sleep方法 const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); // 两个语音频道ID,用于来回切换 const CHANNEL_A = "789946095341535242"; // 你原有的目标频道 const CHANNEL_B = "替换为第二个语音频道的ID"; // 补充同服务器下另一个语音频道ID let isAdmin = (context.params.event.member.permissions & (1<<3)) === (1<<3); if (isAdmin) { let userId = context.params.event.data.options[0].value; let number = context.params.event.data.options[1].value; // 获取当前服务器ID const guildId = context.params.event.guild_id; await lib.discord.channels['@0.1.0'].messages.create({ channel_id: `${context.params.event.channel_id}`, content: `It's time to Jump for ${number} times` }); for(let i = 0; i < number; i++){ // 交替切换两个频道 const targetChannel = i % 2 === 0 ? CHANNEL_A : CHANNEL_B; // 用Autocode官方API移动成员 await lib.discord.guilds['@0.1.0'].members.voice.update({ guild_id: guildId, user_id: userId, channel_id: targetChannel }); await sleep(1000); } } else { await lib.discord.channels['@0.1.0'].messages.create({ channel_id: `${context.params.event.channel_id}`, content: `This command is admin only!`, }); }
额外注意事项
- 提前确认机器人角色拥有「移动成员」权限,且两个目标语音频道都对机器人开放了对应权限
- 如果目标用户没有加入任何语音频道,API调用会失败,可根据需求在循环前添加用户语音状态判断逻辑
- 不要设置过大的
number数值,否则容易触发Discord的API速率限制,导致机器人被临时限制调用接口
内容的提问来源于stack exchange,提问作者Magform
相关产品推荐
相关产品推荐

