1 回答
TA贡献1946条经验 获得超3个赞
解决方案
我花了一段时间,并进行了很多失败的测试,才弄清楚这一点。但我终于让它工作了,这是最终结果:
const Discord = require('discord.js');
const util = require('minecraft-server-util');
util.status("hypixel.net").then(response => {
var fav = response.favicon.split(",").slice(1).join(",");
var imageStream = Buffer.from(fav, "base64");
var attachment = new Discord.MessageAttachment(imageStream, "favicon.png");
const embed = new Discord.MessageEmbed()
.attachFiles([attachment])
.setThumbnail("attachment://favicon.png");
message.channel.send(embed);
}).catch(console.error);
我使用我的机器人的 eval 命令对此进行了测试,它使用我自己的 Minecraft 服务器的 IP 运行起来就像一个魅力。如果您的 base64 URL 格式或文件类型与我的不同,您可能需要稍微调整代码。
解释
我将在下面解释该解决方案的每个步骤:
response.favicon.split(",").slice(1).join(",")
这从 base64 字符串获取数据。Base64 的格式通常类似于:data:<media type>;[charset=<character set>];base64,<data>
。正如您所看到的,base64 的实际数据仅在第一个逗号之后开始,因此我删除了这行代码中逗号之前的所有内容。
Buffer.from(fav, "base64")
这会将 Base64 转换为缓冲区。Discord 的消息附件不能使用 base64 URL,但它们可以使用任何可以解析为Buffer
. 该行允许将我们的 base64 数据转换为可以在 Discord 中作为附件发送的数据。
new Discord.MessageAttachment(imageStream, "favicon.png")
请注意,base64 URL 和 Buffer 都不能直接设置为嵌入的缩略图。缩略图仅支持常规 URL。因此,我们可以使用 Discord.js 提供的解决方法,它允许我们首先将缓冲区作为附件附加,然后将其移动到缩略图中。此行创建我们的附件,并将其命名为“favicon.png”(这很重要,因为我们稍后需要访问该名称)。
.attachFiles([attachment])
该行将我们新创建的内容附加MessageAttachment
到嵌入中。它仅作为文件附加,尚未出现在我们嵌入的缩略图中。
.setThumbnail("attachment://favicon.png")
现在我们可以使用discord.js 的解决方法将图像放入缩略图中。我们可以用来attachment://fileName.extension
访问嵌入中的任何和所有附加文件。这将允许我们通过从附件中抓取文件来将嵌入的缩略图、图标或图像设置到我的世界服务器的图标上。最重要的是,当我们执行此操作时,文件会移动到缩略图,并且不会另外作为附件发送。
添加回答
举报