マインクラフトで次のことがしたい。
- あるプライヤー名(MCID)に対して、
- そのUUIDをMineCraft APIから調べる
- そこからスキン画像を取得する
それにはMojang APIを使うのが簡単です。
ここではAPI呼び出しによって、
マイクラプレイヤー名からスキン取得する方法
その具体的方法+pythonコード例を紹介します。
このページの目次
1.プレイヤー名をUUIDに変換する
例えば次のプレイヤー名がいたとしましょう。
プレイヤー名(MCID) : CutePikapu
このプレイヤー名は任意に変更できます。
そしてマインクラフト内で表示される名前です。
これを不変なUUIDに変換する必要があります。
▼ そのためのMojangAPIがこれ
https://api.mojang.com/users/profiles/minecraft/<username>
▼ <username>にあるプレイヤー名を渡した結果
1 2 3 4 |
{ "id" : "975dbd9156fc43b59820d6f40f66577c", "name" : "CutePikapu" } |
この <username> にはマイクラ内のプライヤー名を渡してください。MCIDとも呼ばれ、マイクラでプレイヤーの上に表示される名前です。
取得に成功すると "975dbd9156fc43b59820d6f40f66577c" のようなUUIDが返ってきます。これはプレイヤー名が変更されても変わらない不変IDです。
PythonによるUUIDの取得コード例
ちなみにコード的に取得する方法について。
Pythonなら以下のようにAPI呼出が可能です。
▼ その変換コードがこちら(Python)
1 2 3 4 5 6 7 8 9 10 |
import requests import json username = "CutePikapu" url = "https://api.mojang.com/" \ + "users/profiles/minecraft/"+username headers = {"content-type": "application/json"} r = requests.get(url, headers=headers) data = r.json() print(json.dumps(data, indent=4)) |
ブラウザで実行するのと同じ結果が返ってきます。
ただしJavaScriptではCORSポリシーエラーが出るため、fetch APIなどでMojang APIを呼び出せないことに注意が必要ですね。(CORSエラーの詳細 : https://pisuke-code.com/js-blocked-by-cors-policy-error/)
Python以外でも簡単にUUID取得ができます。
2.UUIDからプロフィール情報を取得する
プレイヤー名からUUIDへの変換は成功。
次はUUIDからプロフィールを取得します。
▼ そのために必要なMojang APIがこれです。
https://sessionserver.mojang.com/session/minecraft/profile/<uuid>
リファレンス : https://wiki.vg/Mojang_API#UUID_to_Profile_and_Skin.2FCape
▼ 例えばこういうJSONレスポンシブが返る
1 2 3 4 5 6 7 8 |
{ "id" : "975dbd9156fc43b59820d6f40f66577c", "name" : "CutePikapu", "properties" : [ { "name" : "textures", "value" : "ewogICJ0aW1lc3RhbXAiIDogMTY4ODQyNjU4NjQ4OCwKICAicHJvZmlsZUlkIiA6ICI5NzVkYmQ5MTU2ZmM0M2I1OTgyMGQ2ZjQwZjY2NTc3YyIsCiAgInByb2ZpbGVOYW1lIiA6ICJDdXRlUGlrYXB1IiwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2NhMmJmMWVlNjYzNTA1M2IzY2YwZGYzMjM2NzJhOTUyNWY3NDA5M2EwNGY3Y2YxNjFkNGFmNjI0MWE1YzY5MDEiCiAgICB9CiAgfQp9" } ] } |
上記APIの <uuid> には先ほど取得した "975dbd9156fc43b59820d6f40f66577c" みたいな32文字のIDを渡せばOKです。上記のレスポンスが返ってくるはず。
そして重要なのが "value" の値です。
ここには意味不明な文字列が並んでますが、それはBase64エンコードされたJSON文字列です。そこにスキン画像のURLなども含まれてます。
3.Base64デコードしてスキン画像のURL取得
それでは目的のスキン画像の取得です。
先ほどのレスポンスの以下の部分に含まれてます。
▼ Base64エンコードされている
1 |
"value" : "ewogICJ0aW1lc3RhbXAiIDogMTY4ODQyNjU4NjQ4OCwKICAicHJvZmlsZUlkIiA6ICI5NzVkYmQ5MTU2ZmM0M2I1OTgyMGQ2ZjQwZjY2NTc3YyIsCiAgInByb2ZpbGVOYW1lIiA6ICJDdXRlUGlrYXB1IiwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2NhMmJmMWVlNjYzNTA1M2IzY2YwZGYzMjM2NzJhOTUyNWY3NDA5M2EwNGY3Y2YxNjFkNGFmNjI0MWE1YzY5MDEiCiAgICB9CiAgfQp9" |
これはBase64化されたJSON文字列です。
試しにデコードできるツールを使いました。
▼ ここでは以下のオンラインツールを使用
▼ 上記の "ewogIC..." を貼付けしてデコード
▼ デコードされたプロフィールのJSON例
1 2 3 4 5 6 7 8 9 10 |
{ "timestamp" : 1688426586488, "profileId" : "975dbd9156fc43b59820d6f40f66577c", "profileName" : "CutePikapu", "textures" : { "SKIN" : { "url" : "http://textures.minecraft.net/texture/ca2bf1ee6635053b3cf0df323672a9525f74093a04f7cf161d4af6241a5c6901" } } } |
上記JSONの中の texture => SKIN に注目です。
ここに url というキーがありますが、
それがスキン画像へのリンクになってます。
▼ 実際に開くとスキンの展開図画像が手に入る
プレイヤー名からスキン画像の取得に成功!
大変だけどブラウザ上でも実行できる手順です。
ここまでの手順をPythonコードでまとめる
ついでに手順をPythonコード化してみます。
▼ このようなコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
import requests import json import base64 ## 各自のマイクラユーザー名に置き換え username = "CutePikapu" ## ユーザー名 => UUID に変換 url = "https://api.mojang.com/" \ + "users/profiles/minecraft/"+username headers = {"content-type": "application/json"} r = requests.get(url, headers=headers) data = r.json() uuid = data['id'] ## UUIDからプロフィール情報取得 url = "https://sessionserver.mojang.com/" \ + "session/minecraft/profile/"+uuid headers = {"content-type": "application/json"} r = requests.get(url, headers=headers) data = r.json() properties = data['properties'] textures = list(filter( lambda x: x["name"]=="textures", properties) )[0]["value"] ## スキン画像のURL取得 textures = json.loads(base64.b64decode(textures)) skin_url = textures["textures"]["SKIN"]["url"] print(json.dumps(textures, indent=2)) print("skin_url : "+skin_url) |
コードに書き起こすと面倒な手順です。
以上、マインクラフトでスキン取得でした。
プレイヤー名からスキン取得は簡単、
数回のAPI呼び出しだけでゲットできます。