首页 > 解决方案 > 用于不和谐机器人的 base 64 url​​ 转换器

问题描述

我使用 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;

      case 'mc':
        const util = require('minecraft-server-util');
    
        util.status(args[1])
        .then ((response) => {
            const embed = new MessageEmbed()
            .setColor("RANDOM")
            .setTitle('__Server Status__')
            .addField('Server IP', response.host)
            .addField('Server Version', response.version)
            .addField('Online Players', response.onlinePlayers)
            .addField('Max Players', response.maxPlayers)    
            .setThumbnail("Server Icon", response.favicon)
            message.channel.send(embed)
        
        })
       .catch((error, response) => {
           throw error;
       });
       break;
      }
  }
)

bot.login(token);```

标签: javascriptdiscorddiscord.jsbase64url

解决方案


解决方案

我花了一段时间,以及很多失败的测试,才弄清楚这一点。但我终于让它工作了,这是最终结果:

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 和 Buffers 都不能直接设置为嵌入的缩略图。缩略图仅支持常规 URL。所以我们可以使用 discord.js 提供的解决方法,它允许我们首先将缓冲区作为附件附加,然后将其移动到缩略图中。这一行创建了我们的附件,并将其命名为“favicon.png”(这很重要,因为我们稍后需要访问这个名称)。

  1. .attachFiles([attachment])

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

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

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

相关资源

https://discord.js.org/#/docs/main/stable/class/MessageEmbed?scrollTo=attachFiles https://discord.js.org/#/docs/main/stable/class/MessageAttachment

https://github.com/discordjs/discord.js/issues/2175#issuecomment-538948474
^ 这是为 discord.js v11 编写的,不是一个完整/有效的解决方案,但提供了如何做的总体思路这个


推荐阅读