为了账号安全,请及时绑定邮箱和手机立即绑定

用于 Discord 机器人的 Base 64 url​​ 转换器

用于 Discord 机器人的 Base 64 url​​ 转换器

HUWWW 2023-12-14 14:26:28
我使用 api 来获取 mincraft 服务器详细信息,它为我提供了 ip、玩家数量和所有这些爵士乐,但对于服务器图标,它为我提供了一个基本 64url,所以我需要先在我的不和谐机器人中对其进行解码,但我不确定这是如何实现的可以完成 https://www.npmjs.com/package/minecraft-server-util这是我使用的 api,如果你想看一下,如果你需要看一下我的代码,这样你就可以向我展示如何整合它就是这样const discord = require("discord.js");const util = require('minecraft-server-util');const {MessageEmbed} = require('discord.js');const bot = new discord.Client();const token = "my token but i removed it here for privecy reasons";const PREFIX = "-";var version = "1.0.1"util.status("hypixel.net")bot.on("ready", ()=>{  console.log("this bot is online!")})bot.on("message", message=>{  let args = message.content.slice(PREFIX.length).split(" ")  switch(args[0]){    case "ping":      message.reply ("pong");      break;    case "website":      message.channel.send("youtube.com/probler")      break;    case "info":      if(args[1] === "version"){        message.channel.send("We Are Curently In Version " + version)      }      else{        message.channel.send("Invalid Command")      }      break;    case "clear":      if(!args[1]) return message.reply("Error Please Define A Number")      message.channel.bulkDelete(args[1]);      break;    case "embed":      const embed = new MessageEmbed()      .setColor('RANDOM')      .setTitle("User Information")      .addField("Player Name", message.author.username, true)      .addField("Current Server", message.guild.name,)      .setThumbnail(message.author.displayAvatarURL())      .setFooter("Version " + version)      message.channel.send(embed);      break;        })       .catch((error, response) => {           throw error;       });       break;      }  })
查看完整描述

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 格式或文件类型与我的不同,您可能需要稍微调整代码。

解释

我将在下面解释该解决方案的每个步骤:

  1. response.favicon.split(",").slice(1).join(",")

这从 base64 字符串获取数据。Base64 的格式通常类似于:data:<media type>;[charset=<character set>];base64,<data>。正如您所看到的,base64 的实际数据仅在第一个逗号之后开始,因此我删除了这行代码中逗号之前的所有内容。

  1. Buffer.from(fav, "base64")

这会将 Base64 转换为缓冲区。Discord 的消息附件不能使用 base64 URL,但它们可以使用任何可以解析为Buffer. 该行允许将我们的 base64 数据转换为可以在 Discord 中作为附件发送的数据。

  1. new Discord.MessageAttachment(imageStream, "favicon.png")

请注意,base64 URL 和 Buffer 都不能直接设置为嵌入的缩略图。缩略图仅支持常规 URL。因此,我们可以使用 Discord.js 提供的解决方法,它允许我们首先将缓冲区作为附件附加,然后将其移动到缩略图中。此行创建我们的附件,并将其命名为“favicon.png”(这很重要,因为我们稍后需要访问该名称)。

  1. .attachFiles([attachment])

该行将我们新创建的内容附加MessageAttachment到嵌入中。它仅作为文件附加,尚未出现在我们嵌入的缩略图中。

  1. .setThumbnail("attachment://favicon.png")

现在我们可以使用discord.js 的解决方法将图像放入缩略图中。我们可以用来attachment://fileName.extension访问嵌入中的任何和所有附加文件。这将允许我们通过从附件中抓取文件来将嵌入的缩略图、图标或图像设置到我的世界服务器的图标上。最重要的是,当我们执行此操作时,文件会移动到缩略图,并且不会另外作为附件发送。

查看完整回答
反对 回复 2023-12-14
  • 1 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信