mcuuid/mcuuid/api.py

88 lines
3.2 KiB
Python

""" Username to UUID
Converts a Minecraft username to it's UUID equivalent.
Uses the official Mojang API to fetch player data.
"""
### Import necessary modules
import http.client
import json
from mcuuid.tools import is_valid_minecraft_username
from mcuuid.tools import is_valid_mojang_uuid
### Main class
class GetPlayerData:
def __init__(self, identifier, timestamp=None):
self.valid = True
"""
Get the UUID of the player.
Parameters
----------
username: string
The known minecraft username
timestamp : long integer (optional)
The time at which the player used this name, expressed as a Unix timestamp.
"""
# Handle the timestamp
get_args = ""
if timestamp is not None:
get_args = "?at=" + str(timestamp)
# Build the request path based on the identifier
req = ""
if is_valid_minecraft_username(identifier):
req = "/users/profiles/minecraft/" + identifier + get_args
elif is_valid_mojang_uuid(identifier):
req = "/user/profiles/" + identifier + "/names" + get_args
else:
self.valid = False
# Proceed only, when the identifier was valid
if self.valid:
# Request the player data
http_conn = http.client.HTTPSConnection("api.mojang.com");
http_conn.request("GET", req,
headers={'User-Agent':'https://github.com/clerie/mcuuid', 'Content-Type':'application/json'});
response = http_conn.getresponse().read().decode("utf-8")
# In case the answer is empty, the user dont exist
if not response:
self.valid = False
# If there is an answer, fill out the variables
else:
# Parse the JSON
json_data = json.loads(response)
### Handle the response of the different requests on different ways
# Request using username
if is_valid_minecraft_username(identifier):
# The UUID
self.uuid = json_data['id']
# The username written correctly
self.username = json_data['name']
#Request using UUID
elif is_valid_mojang_uuid(identifier):
# The UUID
self.uuid = identifier
current_name = ""
current_time = 0
# Getting the username based on timestamp
for name in json_data:
# Prepare the JSON
# The first name has no change time
if 'changedToAt' not in name:
name['changedToAt'] = 0
# Get the right name on timestamp
if current_time <= name['changedToAt'] and (timestamp is None or name['changedToAt'] <= timestamp):
current_time = name['changedToAt']
current_name = name['name']
# The username written correctly
self.username = current_name