Aprende a obtener la skin (texturas) de un usuario de Minecraft por su nombre de usuario utilizando la API de Mojang y solicitándola con Python.

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):

Skin Minecraft File

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 ❤️!


Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores