You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 08:52:50