Gistrec

Minecraft Realm API

Jan 24th, 2026 (edited)
135
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.90 KB | None | 0 0
  1. import os
  2. import base64
  3. import hashlib
  4. import webbrowser
  5. import requests
  6. from http.server import BaseHTTPRequestHandler, HTTPServer
  7. from urllib.parse import urlencode, urlparse, parse_qs
  8.  
  9.  
  10. # =========================
  11. # CONFIG
  12. # =========================
  13. #
  14. CLIENT_ID = "c36a9fb6-4f2a-41ff-90bd-ae7cc92031eb"
  15. REDIRECT_URI = "http://localhost:3000"
  16. SCOPES = "XboxLive.signin offline_access"
  17.  
  18.  
  19. # =========================
  20. # PKCE
  21. # =========================
  22. def gen_pkce():
  23.     verifier = base64.urlsafe_b64encode(os.urandom(32)).decode().rstrip("=")
  24.     challenge = base64.urlsafe_b64encode(
  25.         hashlib.sha256(verifier.encode()).digest()
  26.     ).decode().rstrip("=")
  27.     return verifier, challenge
  28.  
  29.  
  30. # =========================
  31. # CALLBACK SERVER
  32. # =========================
  33. class CallbackHandler(BaseHTTPRequestHandler):
  34.     def do_GET(self):
  35.         qs = parse_qs(urlparse(self.path).query)
  36.         self.server.code = qs.get("code", [None])[0]
  37.         self.send_response(200)
  38.         self.end_headers()
  39.         self.wfile.write(b"You can close this window.")
  40.  
  41.     def log_message(self, *args):
  42.         pass
  43.  
  44.  
  45. # =========================
  46. # MICROSOFT LOGIN
  47. # =========================
  48. def microsoft_login():
  49.     verifier, challenge = gen_pkce()
  50.  
  51.     url = (
  52.         "https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize?"
  53.         + urlencode({
  54.             "client_id": CLIENT_ID,
  55.             "response_type": "code",
  56.             "redirect_uri": REDIRECT_URI,
  57.             "scope": SCOPES,
  58.             "code_challenge": challenge,
  59.             "code_challenge_method": "S256",
  60.         })
  61.     )
  62.  
  63.     print("🔐 Opening Microsoft login...")
  64.     webbrowser.open(url)
  65.  
  66.     server = HTTPServer(("localhost", 3000), CallbackHandler)
  67.     server.handle_request()
  68.  
  69.     code = server.code
  70.     if not code:
  71.         raise RuntimeError("Login failed")
  72.  
  73.     token = requests.post(
  74.         "https://login.microsoftonline.com/consumers/oauth2/v2.0/token",
  75.         data={
  76.             "client_id": CLIENT_ID,
  77.             "grant_type": "authorization_code",
  78.             "code": code,
  79.             "redirect_uri": REDIRECT_URI,
  80.             "code_verifier": verifier,
  81.         },
  82.     ).json()
  83.  
  84.     return token["access_token"]
  85.  
  86.  
  87. # =========================
  88. # XBOX AUTH
  89. # =========================
  90. def xbox_auth(ms_token):
  91.     r = requests.post(
  92.         "https://user.auth.xboxlive.com/user/authenticate",
  93.         json={
  94.             "Properties": {
  95.                 "AuthMethod": "RPS",
  96.                 "SiteName": "user.auth.xboxlive.com",
  97.                 "RpsTicket": f"d={ms_token}"
  98.             },
  99.             "RelyingParty": "http://auth.xboxlive.com",
  100.             "TokenType": "JWT"
  101.         }
  102.     ).json()
  103.  
  104.     return r["Token"], r["DisplayClaims"]["xui"][0]["uhs"]
  105.  
  106.  
  107. def xsts_auth(xbl_token):
  108.     r = requests.post(
  109.         "https://xsts.auth.xboxlive.com/xsts/authorize",
  110.         json={
  111.             "Properties": {
  112.                 "SandboxId": "RETAIL",
  113.                 "UserTokens": [xbl_token]
  114.             },
  115.             "RelyingParty": "rp://api.minecraftservices.com/",
  116.             "TokenType": "JWT"
  117.         }
  118.     ).json()
  119.  
  120.     return r["Token"], r["DisplayClaims"]["xui"][0]["uhs"]
  121.  
  122.  
  123. # =========================
  124. # MINECRAFT AUTH
  125. # =========================
  126. def minecraft_auth(xsts_token, uhs):
  127.     r = requests.post(
  128.         "https://api.minecraftservices.com/authentication/login_with_xbox",
  129.         json={
  130.             "identityToken": f"XBL3.0 x={uhs};{xsts_token}"
  131.         }
  132.     ).json()
  133.  
  134.     return r["access_token"]
  135.  
  136.  
  137. def get_profile(mc_token):
  138.     return requests.get(
  139.         "https://api.minecraftservices.com/minecraft/profile",
  140.         headers={"Authorization": f"Bearer {mc_token}"}
  141.     ).json()
  142.  
  143.  
  144. # =========================
  145. # REALMS
  146. # =========================
  147. def get_realms_avaliable(mc_token, uuid, name):
  148.     cookies = {
  149.         "sid": f"token:{mc_token}:{uuid}",
  150.         "user": name,
  151.         "version": "1.20.4"
  152.     }
  153.  
  154.     r = requests.get(
  155.         "https://pc.realms.minecraft.net/mco/available",
  156.         cookies=cookies
  157.     )
  158.  
  159.     return r.json()
  160.  
  161.  
  162. def get_realms(mc_token, uuid, name):
  163.     cookies = {
  164.         "sid": f"token:{mc_token}:{uuid}",
  165.         "user": name,
  166.         "version": "1.20.4"
  167.     }
  168.  
  169.     r = requests.get(
  170.         "https://pc.realms.minecraft.net/worlds",
  171.         cookies=cookies
  172.     )
  173.  
  174.     return r.json()
  175.  
  176.  
  177. def get_realm(mc_token, uuid, name, world_id):
  178.     cookies = {
  179.         "sid": f"token:{mc_token}:{uuid}",
  180.         "user": name,
  181.         "version": "1.20.4"
  182.     }
  183.  
  184.     r = requests.get(
  185.         f"https://pc.realms.minecraft.net/activities/liveplayerlist",
  186.         cookies=cookies
  187.     )
  188.  
  189.     return r.json()
  190.  
  191.  
  192. def get_online_players(mc_token, uuid, name, world_id):
  193.     cookies = {
  194.         "sid": f"token:{mc_token}:{uuid}",
  195.         "user": name,
  196.         "version": "1.20.4"
  197.     }
  198.  
  199.     r = requests.get(
  200.         f"https://pc.realms.minecraft.net/invites/{world_id}",
  201.         cookies=cookies
  202.     )
  203.  
  204.     return r.json()
  205.  
  206.  
  207. # =========================
  208. # MAIN
  209. # =========================
  210. def main():
  211.     print("== Microsoft login ==")
  212.     ms_token = microsoft_login()
  213.  
  214.     print("== Xbox auth ==")
  215.     xbl_token, uhs = xbox_auth(ms_token)
  216.  
  217.     print("== XSTS ==")
  218.     xsts_token, _ = xsts_auth(xbl_token)
  219.  
  220.     print("== Minecraft auth ==")
  221.     mc_token = minecraft_auth(xsts_token, uhs)
  222.  
  223.     profile = get_profile(mc_token)
  224.     print(f"Logged in as: {profile['name']}")
  225.  
  226.     avaliable = get_realms_avaliable(mc_token, profile["id"], profile["name"])
  227.     print("\n=== REALMS ===")
  228.     print(f"Avaliable: {avaliable}")
  229.  
  230.     realms = get_realms(mc_token, profile["id"], profile["name"])
  231.  
  232.     for realm in realms["servers"]:
  233.         realm = get_realm(mc_token, profile["id"], profile["name"], realm["id"])
  234.         print(realm)
  235.  
  236. if __name__ == "__main__":
  237.     main()
  238.  
Comments
  • User was banned
Add Comment
Please, Sign In to add comment