Discord机器人Banner自动更换功能失效,对应代码无法运行该如何解决?
问题排查及修复方案
你现有代码存在以下几个核心错误:
- 图片加载为异步操作,直接在设置
img.src后立即执行绘制逻辑,此时背景图还未加载完成,最终生成的Banner会是空白的 - 文件写入是异步操作,未等待写入完成就调用服务器Banner更新接口,会出现读取文件失败/读取到损坏文件的问题
- Discord.js的
setBanner方法不支持直接传入本地文件路径,需要传入Buffer、附件对象或base64格式的资源 - 若未开启
GUILD_MEMBERS网关意图,获取到的memberCount数值会不准确,仅返回在线成员数量 - 需确认机器人账号拥有
管理服务器权限,且目标Discord服务器已达到可自定义Banner的要求(服务器Boost等级1及以上、或为认证/合作伙伴服务器)
修复后代码
if (updateBanner) { const guild = client.guilds.cache.get('866048794272595999'); if (!guild) return console.log('未找到目标服务器'); const userCount = guild.memberCount; const canvas = Canvas.createCanvas(960, 540); const ctx = canvas.getContext('2d'); const img = new Canvas.Image(); img.src = 'dm.png'; // 等待背景图加载完成后再执行绘制逻辑 img.onload = async () => { ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.drawImage(img, 0, 0, canvas.width, canvas.height); ctx.fillStyle = 'white'; ctx.textAlign = 'center'; ctx.font = '40pt Acrom Light'; ctx.fillText(userCount, 500, 500); // 直接转Buffer无需写入本地文件,规避异步写入问题 const bannerBuffer = canvas.toBuffer(); try { await guild.setBanner(bannerBuffer); console.log('Banner更新成功'); updateBanner = false; } catch (err) { console.error('Banner更新失败', err); } } } else { console.log('无需更新Banner!'); } // 原10分钟间隔的定时逻辑可直接保留
内容的提问来源于stack exchange,提问作者Eldar
相关产品推荐
相关产品推荐

