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

使用discord.js获取用户简介并渲染到node canvas的可行性咨询

Discord机器人获取用户「关于我」生成资料卡片实现方案

该功能可以正常实现。Discord用户个人资料的「关于我」板块对应discord.js User对象的bio属性,默认获取的message.author未包含该字段,主动拉取完整用户资料即可获取。

现有代码问题修正

你当前提交的代码存在一处可触发报错的问题:message.author.displayAvatarURL配置中的format: jpg缺少引号,会触发变量未定义错误,需修改为format: 'jpg'。

修改后完整可运行代码

const Discord = require('discord.js')
const Canvas = require('canvas');
const client = new Discord.Client({
    intents: ['DIRECT_MESSAGES', 'GUILD_MESSAGES', 'GUILDS', 'GUILD_MEMBERS', 'GUILD_MESSAGE_REACTIONS', 'GUILD_VOICE_STATES', 'GUILD_PRESENCES']
});

const applyText = (canvas, text) => {
const context = canvas.getContext('2d');
let fontSize = 70;

do {
    context.font = `${fontSize -= 10}px sans-serif`;
} while (context.measureText(text).width > canvas.width - 300);
return context.font;
};

client.on('messageCreate', async message => {
    if (message.author.bot) return;
    if (message.channel.type === 'dm') return;
    if (!prefix[message.guild.id]) return;
    if (!langs[message.author.id]) return;
    if (message.content.toLowerCase().startsWith(prefix[message.guild.id].custprefix + 'profile')) {
        // 拉取完整用户资料获取关于我内容
        const fullUser = await client.users.fetch(message.author.id, { force: true });
        const userBio = fullUser.bio || '暂无个人介绍';
        
        const canvas = Canvas.createCanvas(700, 250);
        const context = canvas.getContext('2d');
        const background = await Canvas.loadImage('./profiles/backround.jpg');
        context.drawImage(background, 0, 0, canvas.width, canvas.height);
        context.strokeStyle = '#34eb6e';
        context.strokeRect(0, 0, canvas.width, canvas.height);

        // 渲染用户名
        context.font = applyText(canvas, message.author.username);
        context.fillStyle = '#ffffff';
        context.fillText(message.author.username, canvas.width / 2.5, canvas.height / 3.8);
        
        // 渲染关于我内容
        context.font = '28px sans-serif';
        context.fillText(userBio, canvas.width / 2.5, canvas.height / 1.8);

        // 裁剪并渲染头像
        context.beginPath();
        context.arc(125, 125, 100, 0, Math.PI * 2, true);
        context.closePath();
        context.clip();
        const avatar = await Canvas.loadImage(message.author.displayAvatarURL({ dynamic: true, format: 'jpg' }));
        context.drawImage(avatar, 25, 25, 200, 200);
        
        const attachment = new Discord.MessageAttachment(canvas.toBuffer(), 'profile-image.png');
        message.channel.send({ files: [attachment] })
    }
})

可选优化点

  • 可以仿照用户名的applyText逻辑给关于我内容加自适应字号,避免内容过长超出画布边界
  • 可自定义关于我文本的颜色、行高等样式匹配设计需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:45:03