En este artículo, te explicaremos cómo recuperar fácilmente la skin de un jugador de Minecraft por su nombre de usuario utilizando la API de Mojang.
Especificacion de Skin
Las skins se sirven en formato PNG desde los servidores de Mojang. Las dimensiones de la imagen pueden ser 64 por 32 píxeles o 64 por 64 píxeles. El primero fue utilizado por las versiones de Minecraft anteriores a la 1.8, mientras que el segundo es aceptado por las versiones de Minecraft 1.8 y posteriores. Las posiciones de los elementos siguen siendo las mismas en 1.8, sin embargo, se han agregado nuevas "supercapas" al archivo de skin.
Para obtener la skin actual de un usuario, deberás acceder a la API de Mojang. En este caso, la primera URL de solicitud será:
https://api.mojang.com/users/profiles/minecraft/{USERNAME}
Debes reemplazar {USERNAME} con el nombre de usuario que estás buscando, por ejemplo, https://api.mojang.com/users/profiles/minecraft/elrubius devolverá la siguiente respuesta:
{
"name": "elrubius",
"id": "11f1cc006cc84499a174bc9b7fa1982a"
}
La solicitud mencionada devolverá el UUID del usuario de Minecraft. Ahora, para solicitar la información sobre el jugador, deberás solicitar la siguiente URL:
https://sessionserver.mojang.com/session/minecraft/profile/{USER_UUID}
Utilizando el ID del jugador por su nombre de usuario (obtenido anteriormente), deberías poder solicitar una vez más a la API la información de las texturas, por ejemplo https://sessionserver.mojang.com/session/minecraft/profile/ 11f1cc006cc84499a174bc9b7fa1982a devolverá la siguiente respuesta JSON:
{
"id": "11f1cc006cc84499a174bc9b7fa1982a",
"name": "elrubius",
"properties": [
{
"name": "textures",
"value": "ewogICJ0aW1lc3RhbXAiIDogMTU5NTY0ODQyODczOSwKICAicHJvZmlsZUlkIiA6ICIxMWYxY2MwMDZjYzg0NDk5YTE3NGJjOWI3ZmExOTgyYSIsCiAgInByb2ZpbGVOYW1lIiA6ICJlbHJ1Yml1cyIsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9hYzM3MzU3NTNjNzNjYzYwZWUxMjFkMzIyNGQ2ZDU2NDU5MzNlYWJjYmQzZDUyYzI3ZmZkMjEwNDNmMDQ4OTkyIgogICAgfQogIH0KfQ=="
}
]
}
El primer objeto en la matriz de propiedades contendrá 2 claves que especifican el tipo, en este caso las texturas y su valor, en formato Base64:
ewogICJ0aW1lc3RhbXAiIDogMTU5NTY0NjgzNDMzMSwKICAicHJvZmlsZUlkIiA6ICIxMWYxY2MwMDZjYzg0NDk5YTE3NGJjOWI3ZmExOTgyYSIsCiAgInByb2ZpbGVOYW1lIiA6ICJlbHJ1Yml1cyIsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9hYzM3MzU3NTNjNzNjYzYwZWUxMjFkMzIyNGQ2ZDU2NDU5MzNlYWJjYmQzZDUyYzI3ZmZkMjEwNDNmMDQ4OTkyIgogICAgfQogIH0KfQ==
Si decodificas el valor obtenido del formato Base64, la salida proporcionará el siguiente JSON:
{
"timestamp": 1595646834331,
"profileId": "11f1cc006cc84499a174bc9b7fa1982a",
"profileName": "elrubius",
"textures": {
"SKIN": {
"url": "http://textures.minecraft.net/texture/ac3735753c73cc60ee121d3224d6d5645933eabcbd3d52c27ffd21043f048992"
}
}
}
Que contiene el skin del usuario en la propiedad [textures] [SKIN] [url]: http://textures.minecraft.net/texture/ac3735753c73cc60ee121d3224d6d5645933eabcbd3d52c27ffd21043f048992 en este caso, la siguiente imagen (que luego sirve al skin como Content-Type : image/png):
Simplemente sabiendo cómo funciona esto, podrás escribir tu propio script para obtener el skin de un usuario en Minecraft, sin embargo, si estás buscando una forma fácil y directa de hacerlo, el siguiente script de Python 3 te ayudará a entender mejor.
Automatización para obtener el skin de un usuario de Minecraft
Usaremos el paquete Requests para Python, que es una biblioteca HTTP elegante y simple para Python. Requests está listo para las necesidades de construir aplicaciones de HTTP robustas y confiables, para las necesidades de hoy. Puedes instalarlo usando pip:
pip3 install requests
Una vez que esté seguro de que la biblioteca está instalada, puedes usar el siguiente Script (get_skin.py
) para descargar la skin de un usuario en Minecraft:
#!/usr/bin/env python3
import io
import sys
import json
import shutil
from base64 import b64decode
import requests
DEBUG = False
SIMULATE = False
userid_url = "https://api.mojang.com/users/profiles/minecraft/{username}"
userinfo_url = "https://sessionserver.mojang.com/session/minecraft/profile/{userid}"
class SimulatedResponse(object):
def __init__(self, content, is_json, raw=None):
self.content = content
self.is_json = is_json
self.status_code = 200
self.raw = raw
def json(self):
if self.is_json:
return json.loads(self.content)
return None
def fail(msg, verbose_msg):
print(msg, file=sys.stderr)
if DEBUG:
print(verbose_msg, file=sys.stderr)
sys.exit(1)
def find_texture_info(properties):
for prop in properties:
if prop['name'] == 'textures':
return json.loads(b64decode(prop['value'], validate=True).decode('utf-8'))
return None
def get_url(url, **kwargs):
if SIMULATE:
content = None
is_json = False
raw = None
# Estos archivos no se proporcionan en el repositorio de git porque los considero
# algo sensible. Siéntase libre de proporcionar el suyo en su lugar.
if url.startswith('https://api.mojang.com/users/profiles/minecraft/'):
with open('simulated_userid_response.json', 'r') as f:
content = f.read()
is_json = True
elif url.startswith('https://sessionserver.mojang.com/session/minecraft/profile/'):
with open('simulated_userinfo_response.json', 'r') as f:
content = f.read()
is_json = True
else:
with open('simulated_skin_response.png', 'rb') as f:
content = f.read()
is_json = False
raw = io.BytesIO(content)
return SimulatedResponse(content, is_json, raw)
else:
return requests.get(url, **kwargs)
def main():
if len(sys.argv) < 2:
print('Proporcione un nombre de usuario', file=sys.stderr)
sys.exit(1)
username = sys.argv[1]
r = get_url(userid_url.format(username=username))
if r.status_code != 200:
fail("Could not retrieve user ID for {username}".format(username=username),
"{0} {1}".format(r.status_code, userid_url.format(username=username)))
if DEBUG:
print("{0} {1}".format(r.status_code, userid_url.format(username=username)), file=sys.stderr)
userid = r.json()['id']
r = get_url(userinfo_url.format(userid=userid))
if r.status_code != 200:
fail("No se pudo descargar la información del usuario {username}".format(username=username),
"{0} {1}".format(r.status_code, userinfo_url.format(userid=userid)))
if DEBUG:
print("{0} {1}".format(r.status_code, userinfo_url.format(userid=userid)), file=sys.stderr)
userinfo = r.json()
texture_info = find_texture_info(userinfo['properties'])
if texture_info is None:
fail("No se pudo encontrar la información de textura para {username}".format(username=username),
userinfo)
try:
skin_url = texture_info['textures']['SKIN']['url']
except:
fail("No se pudo encontrar la información de textura para {username}".format(username=username),
texture_info)
r = get_url(skin_url, stream=True)
if r.status_code != 200:
fail("No se pudo descargar la máscara para {username}".format(username=username),
"{0} {1}".format(r.status_code, skin_url))
if DEBUG:
print("{0} {1}".format(r.status_code, skin_url), file=sys.stderr)
with open("{username}.png".format(username=sys.argv[1]), 'wb') as f:
shutil.copyfileobj(r.raw, f)
if __name__ == '__main__':
main()
Podrás ejecutar este script usando:
python get_skin.py {username}
Esto descargará la máscara del nombre de usuario dado en el mismo directorio.
Que te diviertas ❤️!
Conviertete en un programador más sociable