discord.js使用bulkDelete删除自身消息报Missing Permissions错误如何解决
问题原因说明
- Discord API默认允许所有账号(含机器人)删除自身发送的单条消息,无需额外权限,这就是N=1时单独删一条能成功的原因。
- 你调用的
bulkDelete()方法底层对应Discord的/channels/{channel_id}/messages/bulk-delete端点,该端点本身的权限要求就是必须持有MANAGE_MESSAGES权限,和你要删除的消息归属无关,哪怕全是你自己发的,只要调用这个接口就需要对应权限,这就是N>1时触发权限报错的根本原因。
无MANAGE_MESSAGES权限的实现方案
不需要申请MANAGE_MESSAGES权限,只要把批量删除逻辑替换为逐条删除自身消息即可,同时添加短延迟避免触发Discord的速率限制,修改后的参考代码如下:
const botID = process.env.DISCORD_ID; if (message.channel.type == 'text') { await message.channel.messages.fetch({limit: 100}).then(async messages => { // 注意原代码直接对比author对象和ID字符串会判断失效,需取author.id对比 let botMessages = messages.filter(msg => msg.author.id == botID).array(); if (no_of_messages > 0){ botMessages.splice(no_of_messages); } let deleteCount = 0; // 逐条删除,每条间隔1秒避免触发速率限制 for (const msg of botMessages) { await msg.delete(); deleteCount++; await new Promise(resolve => setTimeout(resolve, 1000)); } client.log(`Deleted ${deleteCount} messages from ${botID}`) }).catch(err => { client.log('Error while deleting messages'); client.log(err); }); }
注意:该方案仅支持删除发送时间未满2周的自身消息,超过2周的消息无法通过普通接口删除。
内容的提问来源于stack exchange,提问作者Minh Pham
相关产品推荐
相关产品推荐

