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

Discord.js欢迎画布功能触发Server responded with 403报错怎么修复?

问题原因

403错误表示服务器拒绝了访问请求,从报错栈定位是Canvas.loadImage加载远程资源时触发,核心问题出在加载 Discord 用户头像的环节,同时你的代码缺少错误捕获逻辑才会抛出UnhandledPromiseRejectionWarning警告。

修复方案

  • 开启Discord开发者后台的必要权限
    进入Discord Developer Portal,找到你的机器人应用,在「Privileged Gateway Intents」板块开启Server Members Intent,否则guildMemberAdd事件无法正常触发,也会导致用户资源访问被拒。
  • 修复头像加载逻辑,增加兜底
    部分新用户没有自定义头像,member.user.avatarURL()会返回null,直接传入加载会报错,需要补全参数并添加默认头像兜底。
  • 补充空值判断与权限校验
    你当前代码直接调用channel.send(),如果频道不存在、机器人没有该频道的「发送消息」「发送附件」权限,都会触发报错,需要提前判断。
  • 修复代码语法错误
    你当前的字体设置有重复px的问题,会导致字体渲染异常。
  • 增加错误捕获逻辑
    给整个异步事件回调添加try/catch,避免未处理的Promise拒绝导致程序崩溃。

修改后完整代码

client.on('guildMemberAdd', async (member) => {
  try {
    const leftright = 147; 
    const upkdown = 138; 
    const ksize = 240; 
    const namleftright04 = 310; 
    const namupdown14 = 155; 
    let textsize = 25; 
    
    const canvas = Canvas.createCanvas(705,290); 
    const ctx = canvas.getContext('2d');
    const WelcomeImage = await Canvas.loadImage("./image.png");
    ctx.drawImage(WelcomeImage, 0, 0, canvas.width, canvas.height);
    ctx.font = `${textsize}px Arial`;
    ctx.shadowColor = 'rgba(22, 22, 22, 1)'; 
    ctx.shadowOffsetY = 1; 
    ctx.shadowBlur = 1; 
    ctx.fillStyle = 'WHITE';
    ctx.fillText(member.user.username, namleftright04, namupdown14);
    ctx.beginPath();
    ctx.arc(leftright, upkdown, ksize/2, 0, Math.PI * 2, true);
    ctx.closePath();
    ctx.clip();

    // 修复头像加载逻辑
    const avatarUrl = member.user.avatarURL({ format: 'jpg', size: 256 }) || member.user.defaultAvatarURL;
    const avatarUser = await Canvas.loadImage(avatarUrl);
    ctx.drawImage(
        avatarUser, 
        leftright - 120,
        upkdown - 120,
        ksize, 
        ksize
    )
    const attachment = new Discord.MessageAttachment(
        canvas.toBuffer(),
        'welcome.png'
    );

    const channel = member.guild.channels.cache.find(ch => ch.id == '870381834624700447');
    if (!channel) return console.log('未找到指定欢迎频道');
    const canSend = channel.permissionsFor(client.user).has(['SendMessages', 'AttachFiles']);
    if (!canSend) return console.log('机器人没有欢迎频道的发送权限');

    channel.send(attachment);
  } catch (err) {
    console.error('欢迎消息发送失败:', err);
  }
});

内容的提问来源于stack exchange,提问作者Sarite

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:18:02