使用discord.js-selfbot-v13获取可用频道的问题求助
解决discord.js-selfbot-v13中封禁后缓存频道导致的发送错误问题
问题核心是:用户被服务器封禁后,本地缓存的频道对象并未自动清除,但实际已无权限访问该频道所在服务器,直接用缓存或普通fetch/get会因为无法找到频道而报错。以下是可行的解决方案:
关键思路
- 强制从API拉取频道数据:不依赖本地缓存,直接向Discord API请求最新的频道状态,判断是否还能访问。
- 替换异步遍历方式:
forEach无法正确处理异步操作,改用for...of保证异步逻辑顺序执行。 - 精准捕获错误并清理无效ID:根据Discord API的错误码判断问题类型,自动从发送列表移除无效频道ID,避免后续重复报错。
修改后的完整代码
client.on("messageCreate", async (message) => { if (watchlist.includes(message.channel.id)) { let link = await filterLink(message.content); if (link != null) { let updated = await updateLink(link); if (updated) { // 用for...of替代forEach,确保异步操作按顺序执行 for (const id of sendList) { try { // 强制从API获取频道最新数据,忽略本地缓存 const channel = await client.channels.fetch(id, { force: true }); // 提前检查是否有发送消息的权限 if (!channel.permissionsFor(client.user).has("SEND_MESSAGES")) { console.log(`频道 ${id} 无发送权限,已从列表移除`); sendList = sendList.filter(channelId => channelId !== id); continue; } // 执行消息发送逻辑,替换成你实际要发的内容 await channel.send(`更新链接:${link}`); } catch (error) { // 根据Discord错误码处理不同情况 if (error.code === 10003) { // 未知频道(用户已被封禁,无法访问该服务器) console.log(`频道 ${id} 无法访问,已从列表移除`); sendList = sendList.filter(channelId => channelId !== id); } else if (error.code === 50001) { // 无访问权限 console.log(`频道 ${id} 无访问权限,已从列表移除`); sendList = sendList.filter(channelId => channelId !== id); } else { console.log(`发送到频道 ${id} 时出错:`, error); } } } } } } });
代码说明
client.channels.fetch(id, { force: true }):添加force: true参数会绕过本地缓存,直接向Discord API请求频道信息,能准确判断频道是否还处于可访问状态。for...of遍历:解决了forEach中异步函数无法按顺序执行的问题,同时能正确捕获每个循环中的错误。- 错误码处理:Discord API返回的错误码可以精准定位问题,比如
10003表示频道不存在(用户被封禁后,对应服务器已不在用户的服务器列表中,因此频道无法找到),50001表示无访问权限,针对这些情况直接清理无效ID,避免后续重复尝试。 - 权限预检查:提前判断是否有发送消息的权限,减少不必要的API请求和错误抛出。
内容的提问来源于stack exchange,提问作者KILLXR
相关产品推荐
相关产品推荐

