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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:48:00