使用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
相关产品推荐
相关产品推荐

