Difference between revisions of "Zh:Mojang API"

From wiki.vg
Jump to navigation Jump to search
(Created page with "== 注意 == * 所有公共API均受速率限制,因此您应该缓存这些结果。当前的设置为每10分钟600个请求,但可能会更改。 * 对于API的某些...")
 
m
 
Line 2: Line 2:
  
 
* 所有公共API均受速率限制,因此您应该缓存这些结果。当前的设置为每10分钟600个请求,但可能会更改。
 
* 所有公共API均受速率限制,因此您应该缓存这些结果。当前的设置为每10分钟600个请求,但可能会更改。
* 对于API的某些部分,有时包括演示版帐户但有时又不包括。Mojang一直在改动它。
+
* 对于API的某些部分,有时包括演示版帐号但有时又不包括。Mojang一直在改动它。
  
 
== API状态 ==
 
== API状态 ==
Line 53: Line 53:
 
这将返回在提供的时间戳时该用户名的UUID。
 
这将返回在提供的时间戳时该用户名的UUID。
  
<code>?at=0</code>可用于获取该名称原始用户的UUID,但是这只有在名称至少更改一次或帐户是旧帐户的情况下才有效。
+
<code>?at=0</code>可用于获取该名称原始用户的UUID,但是这只有在名称至少更改一次或帐号是旧版帐号的情况下才有效。
  
 
* 时间戳是指[[wikipedia:zh:Unix时间|UNIX时间戳]](不包含毫秒)
 
* 时间戳是指[[wikipedia:zh:Unix时间|UNIX时间戳]](不包含毫秒)
Line 68: Line 68:
  
 
* <code>name</code>是'''该uuid的当前名称''',而并不是'''请求的名称'''!
 
* <code>name</code>是'''该uuid的当前名称''',而并不是'''请求的名称'''!
* <code>legacy</code>仅在为true时显示(未迁移到mojangd的帐户)
+
* <code>legacy</code>仅在为true时显示(未迁移到mojangd的帐号)
* <code>demo</code>仅在为true(未付款的帐户)时显示
+
* <code>demo</code>仅在为true(未付款的帐号)时显示
  
 
如果不存在使用给定用户名的玩家,则会发送不带任何HTTP正文的HTTP状态代码<code>204 (No Content)</code>。<br/>
 
如果不存在使用给定用户名的玩家,则会发送不带任何HTTP正文的HTTP状态代码<code>204 (No Content)</code>。<br/>
Line 132: Line 132:
 
* 名称区分大小写
 
* 名称区分大小写
 
* 旧版仅在为true时显示(档案未迁移到mojang.com)
 
* 旧版仅在为true时显示(档案未迁移到mojang.com)
* 演示版仅在为true时显示(帐户未付款)
+
* 演示版仅在为true时显示(帐号未付款)
 
* 如果任何用户名为null或空,则返回IllegalArgumentException
 
* 如果任何用户名为null或空,则返回IllegalArgumentException
 
* <code>Content-Type</code>HTTP头必须为<code>application/json</code>
 
* <code>Content-Type</code>HTTP头必须为<code>application/json</code>
Line 141: Line 141:
 
   <nowiki>GET https://sessionserver.mojang.com/session/minecraft/profile/<uuid></nowiki>
 
   <nowiki>GET https://sessionserver.mojang.com/session/minecraft/profile/<uuid></nowiki>
  
这将返回玩家的用户名以及它们相关的所有其他信息(如皮肤)。示例https://sessionserver.mojang.com/session/minecraft/profile/4566e69fc90748ee8d71d7ba5aa00d20
+
这将返回玩家的用户名以及它们相关的所有其他信息(如皮肤)。示例:https://sessionserver.mojang.com/session/minecraft/profile/4566e69fc90748ee8d71d7ba5aa00d20
  
 
这有一个更严格的速率限制:你只可以每分钟请求一次相同的档案,但是您可以发送任意多的唯一请求。
 
这有一个更严格的速率限制:你只可以每分钟请求一次相同的档案,但是您可以发送任意多的唯一请求。
 
[[Category:ZH:Protocol Details]]
 
[[Category:ZH:Minecraft Modern]]
 
  
 
=== 响应 ===
 
=== 响应 ===
Line 163: Line 160:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
* 如果用户尚未将minecraft.net帐户迁移到mojang,则<code>"legacy": true</code>将出现在响应中。
+
* 如果用户尚未将minecraft.net帐号迁移到mojang,则<code>"legacy": true</code>将出现在响应中。
 
"textures"对象"value"的base64解码后字符串:
 
"textures"对象"value"的base64解码后字符串:
 
<syntaxhighlight lang="javascript" style="overflow-x: scroll">
 
<syntaxhighlight lang="javascript" style="overflow-x: scroll">
Line 194: Line 191:
 
  POST <nowiki>https://api.mojang.com/user/profile/</nowiki>'''<uuid>'''/skin
 
  POST <nowiki>https://api.mojang.com/user/profile/</nowiki>'''<uuid>'''/skin
  
这将为所选档案设置皮肤,但Mojang的服务器将从URL获取皮肤。这也适用于旧版帐户。
+
这将为所选档案设置皮肤,但Mojang的服务器将从URL获取皮肤。这也适用于旧版帐号。
  
 
=== 响应 ===
 
=== 响应 ===
Line 402: Line 399:
 
[https://github.com/thechunknetwork/mojang-api JavaScript] | UUID或名称至拥有皮肤、披风和名称历史的档案
 
[https://github.com/thechunknetwork/mojang-api JavaScript] | UUID或名称至拥有皮肤、披风和名称历史的档案
  
[[Category:ZH:Protocol Details]]
+
[[Category:ZH:协议细节]]
 
[[Category:ZH:Minecraft Modern]]
 
[[Category:ZH:Minecraft Modern]]

Latest revision as of 05:46, 28 September 2019

注意

  • 所有公共API均受速率限制,因此您应该缓存这些结果。当前的设置为每10分钟600个请求,但可能会更改。
  • 对于API的某些部分,有时包括演示版帐号但有时又不包括。Mojang一直在改动它。

API状态

 GET https://status.mojang.com/check

返回各类Mojang服务的状态。可能的值为green(无问题)、yellow(有些许问题)、red(服务不可用)。

响应

[
  {
    "minecraft.net": "yellow"
  },
  {
    "session.minecraft.net": "green"
  },
  {
    "account.mojang.com": "green"
  },
  {
    "auth.mojang.com": "green"
  },
  {
    "skins.minecraft.net": "green"
  },
  {
    "authserver.mojang.com": "green"
  },
  {
    "sessionserver.mojang.com": "yellow"
  },
  {
    "api.mojang.com": "green"
  },
  {
    "textures.minecraft.net": "red"
  },
  {
    "mojang.com": "green"
  }
]

用户名 -> 在某时间的UUID

 GET https://api.mojang.com/users/profiles/minecraft/<username>?at=<timestamp>

这将返回在提供的时间戳时该用户名的UUID。

?at=0可用于获取该名称原始用户的UUID,但是这只有在名称至少更改一次或帐号是旧版帐号的情况下才有效。

  • 时间戳是指UNIX时间戳(不包含毫秒)
  • 当未发送at参数时,将使用当前时间

响应

{
  "id": "7125ba8b1c864508b92bb5c042ccfe2b",
  "name": "KrisJelbring"
}
  • name该uuid的当前名称,而并不是请求的名称
  • legacy仅在为true时显示(未迁移到mojangd的帐号)
  • demo仅在为true(未付款的帐号)时显示

如果不存在使用给定用户名的玩家,则会发送不带任何HTTP正文的HTTP状态代码204 (No Content)
如果时间戳不是数字、太大或太小都会发送HTTP状态代码400 (Bad Request),并显示如下错误消息:

{
  "error": "IllegalArgumentException",
  "errorMessage": "Invalid timestamp."
}

UUID -> 名称历史

 GET https://api.mojang.com/user/profiles/<uuid>/names

返回该用户之前使用过的所有用户名和当前使用的用户名。UUID必须不带连字符。


响应

[
  {
    "name": "Gold"
  },
  {
    "name": "Diamond",
    "changedToAt": 1414059749000
  }
]

changedToAt字段是Java时间戳(以毫秒为单位)。

玩家名 -> UUIDs

 POST https://api.mojang.com/profiles/minecraft

负载

[
    "maksimkurb",
    "nonExistingPlayer" //测试不存在的玩家
]

响应

[
    {
        "id": "0d252b7218b648bfb86c2ae476954d32",
        "name": "maksimkurb",
        "legacy": true,
        "demo": true
    }
]
  • 名称区分大小写
  • 旧版仅在为true时显示(档案未迁移到mojang.com)
  • 演示版仅在为true时显示(帐号未付款)
  • 如果任何用户名为null或空,则返回IllegalArgumentException
  • Content-TypeHTTP头必须为application/json
  • 每个请求不能超过10个名字

UUID -> 档案 + 皮肤/披风

 GET https://sessionserver.mojang.com/session/minecraft/profile/<uuid>

这将返回玩家的用户名以及它们相关的所有其他信息(如皮肤)。示例:https://sessionserver.mojang.com/session/minecraft/profile/4566e69fc90748ee8d71d7ba5aa00d20

这有一个更严格的速率限制:你只可以每分钟请求一次相同的档案,但是您可以发送任意多的唯一请求。

响应

{
    "id": "<profile identifier>",
    "name": "<player name>",
    "properties": [ 
        {
            "name": "textures",
            "value": "<base64 string>",
            "signature": "<base64 string; signed data using Yggdrasil's private key>" //仅在url后接?unsigned=false时提供
        }
    ]
}
  • 如果用户尚未将minecraft.net帐号迁移到mojang,则"legacy": true将出现在响应中。

"textures"对象"value"的base64解码后字符串:

{
    "timestamp": <java time in ms>,
    "profileId": "<profile uuid>",
    "profileName": "<player name>",
    "signatureRequired": true, // 仅在url后接?unsigned=false时提供
    "textures": {
        "SKIN": {
            "url": "<player skin URL>"
        },
        "CAPE": {
            "url": "<player cape URL>"
        }
    }
}
  • 时间戳有时会是过去的(可能是由于缓存了结果?)
  • 若玩家模型拥有纤细的手臂(“Alex”样式),则"SKIN"对象将拥有"metadata": {"model": "slim"}。而对于方形手臂(“Steve”样式),则将缺少"metadata"
  • 如果未设置自定义皮肤,则将缺少"SKIN"
    玩家是否具有“Alex?”或“Steve?”外观,取决于其UUID的Java哈希码。奇哈希则将使用Steve。示例实现:
  • 相似地,当帐号没有披风时将缺少"CAPE"

更换皮肤

POST https://api.mojang.com/user/profile/<uuid>/skin

这将为所选档案设置皮肤,但Mojang的服务器将从URL获取皮肤。这也适用于旧版帐号。

响应

发生错误时,服务器将发送回带有错误的JSON。(若成功为空白有效负载)

Authorization: Bearer <access token>

负载

此API的有效负载由两个url编码的表单字段(由'&'组成)组成。

model=<""/"slim">&url=<skin url>

model是默认模型的空字符串,而slim模型为“slim”。

示例

curl -H "Authorization: Bearer <access token>" --data-urlencode "model=" --data-urlencode "url=http://assets.mojang.com/SkinTemplates/steve.png" https://api.mojang.com/user/profile/<uuid>/skin
POST /user/profile/<uuid>/skin HTTP/1.1
Host: api.mojang.com
User-Agent: curl/7.49.0
Accept: */*
Authorization: Bearer <access token>
Content-Length: 69
Content-Type: application/x-www-form-urlencoded

model=&url=http%3A%2F%2Fassets.mojang.com%2FSkinTemplates%2Fsteve.png

上传皮肤

PUT https://api.mojang.com/user/profile/<uuid>/skin

这会将皮肤上传到Mojang的服务器,同时设置了用户的皮肤。这也适用于旧版帐号。

响应

除非错误,否则无响应

Authorization: Bearer <access token>

负载

该API的负载由多部分表单数据组成。有两部分(顺序与边界的b/c无关):

model 默认模型为空字符串,纤细模型为"slim"
file 原始图像文件数据

示例

curl -X PUT -H "Authorization: Bearer <access token>" -F model=alex -F file="@alex.png;type=image/png" https://api.mojang.com/user/profile/<uuid>/skin
PUT /user/profile/<uuid>/skin HTTP/1.1
Host: api.mojang.com
User-Agent: curl/7.49.0
Accept: */*
Authorization: Bearer <access token>
Content-Length: <length>
Content-Type: multipart/form-data; boundary=<boundary>

--<boundary>
Content-Disposition: form-data; name="model"

slim
--<boundary>
Content-Disposition: form-data; name="file"; filename="alex.png"
Content-Type: image/png

<image data>
--<boundary>--

重置皮肤

DELETE https://api.mojang.com/user/profile/<uuid>/skin

将用户的皮肤重置为默认皮肤。

响应

除非错误,否则无响应

Authorization: Bearer <access token>

示例

curl -X DELETE -H "Authorization: Bearer <access token>" https://api.mojang.com/user/profile/<uuid>/skin
DELETE /user/profile/<uuid>/skin HTTP/1.1
Host: api.mojang.com
User-Agent: curl/7.46.0
Accept: */*
Authorization: Bearer <access token>

被阻止的服务器

  GET https://sessionserver.mojang.com/blockedservers

返回用于在客户端尝试连接时对照服务器地址进行检查的SHA1哈希列表。

客户端使用ISO-8859-1字符集依据此列表检查小写名称。他们还将尝试检查子域名,并用*替换每个级别。具体来说,它会根据域名中的.进行拆分,遍历每个部分,一次删除一个。例如,对于mc.example.com,它将尝试mc.example.com*.example.com*.com。使用IP地址(通过划分为4个部分进行验证,每个部分都是0到255之间的有效整数,包括0和255之间的有效整数),替换将从头开始,因此对于192.168.0.1,它将尝试192.168.0.1192.168.0.*192.168.*192.*

此检查由netty中的bootstrap类完成。默认netty类被启动器加载的com.mojang:netty依赖覆盖。这使其可以影响使用netty(1.7+)的任何版本。

响应

所有按行分隔的SHA1哈希列表。

目前约有2200种哈希值已被破解。

6f2520f8bd70a718c568ab5274c56bdbbfc14ef4:*.minetime.com
7ea72de5f8e70a2ac45f1aa17d43f0ca3cddeedd:*.trollingbrandon.club
c005ad34245a8f2105658da2d6d6e8545ef0f0de:*.skygod.us
c645d6c6430db3069abd291ec13afebdb320714b:*.mineaqua.es
8bf58811e6ebca16a01b842ff0c012db1171d7d6:*.eulablows.host
8789800277882d1989d384e7941b6ad3dadab430:*.moredotsmoredots.xyz
e40c3456fb05687b8eeb17213a47b263d566f179:*.brandonlovescock.bid
278b24ffff7f9f46cf71212a4c0948d07fb3bc35:*.brandonlovescock.club
c78697e385bfa58d6bd2a013f543cdfbdc297c4f:*.mineaqua.net
b13009db1e2fbe05465716f67c8d58b9c0503520:*.endercraft.com
3e560742576af9413fca72e70f75d7ddc9416020:*.insanefactions.org
986204c70d368d50ffead9031e86f2b9e70bb6d0:*.playmc.mx
65ca8860fa8141da805106c0389de9d7c17e39bf:*.howdoiblacklistsrv.host
7dca807cc9484b1eed109c003831faf189b6c8bf:*.brandonlovescock.online
c6a2203285fb0a475c1cd6ff72527209cc0ccc6e:*.brandonlovescock.press
e3985eb936d66c9b07aa72c15358f92965b1194e:*.insanenetwork.org
b140bec2347bfbe6dcae44aa876b9ba5fe66505b:*.phoenixnexus.net
27ae74becc8cd701b19f25d347faa71084f69acd:*.arkhamnetwork.org
48f04e89d20b15de115503f22fedfe2cb2d1ab12:brandonisan.unusualperson.com
9f0f30820cebb01f6c81f0fdafefa0142660d688:*.kidslovemy500dollarranks.club
cc90e7b39112a48064f430d3a08bbd78a226d670:*.eccgamers.com
88f155cf583c930ffed0e3e69ebc3a186ea8cbb7:*.fucktheeula.com
605e6296b8dba9f0e4b8e43269fe5d053b5f4f1b:*.mojangendorsesbrazzers.webcam
5d2e23d164a43fbfc4e6093074567f39b504ab51:touchmybody.redirectme.net
f3df314d1f816a8c2185cd7d4bcd73bbcffc4ed8:*.mojangsentamonkeyinto.space
073ca448ef3d311218d7bd32d6307243ce22e7d0:*.diacraft.org
33839f4006d6044a3a6675c593fada6a690bb64d:*.diacraft.de
e2e12f3b7b85eab81c0ee5d2e9e188df583fe281:*.eulablacklist.club
11a2c115510bfa6cb56bbd18a7259a4420498fd5:*.slaughterhousepvp.com
75df09492c6c979e2db41116100093bb791b8433:*.timelesspvp.net
d42339c120bc10a393a0b1d2c6a2e0ed4dbdd61b:*.herowars.org
4a1b3b860ba0b441fa722bbcba97a614f6af9bb8:justgiveinandblockddnsbitches.ddns.net
b8c876f599dcf5162911bba2d543ccbd23d18ae5:brandonisagainst.health-carereform.com
9a9ae8e9d0b6f3bf54c266dcd1e4ec034e13f714:brandonwatchesporn.onthewifi.com
336e718ffbc705e76b4a72884172c6b95216b57c:canyouwildcardipsplease.gotdns.ch
27cf97ecf24c92f1fe5c84c5ff654728c3ee37dd:letsplaysome.servecounterstrike.com
32066aa0c7dc9b097eed5b00c5629ad03f250a2d:mojangbrokeintomy.homesecuritymac.com
39f4bbfd123a5a5ddbf97489877831c15a70d7f2:*.primemc.org
f32f824d41aaed334aef248fbe3a0f8ecf4ac1a0:*.meep.in
c22efe4cf7fb319ca2387bbc930c1fdf77ab72fc:*.itsjerryandharry.com
cc8e1ae93571d144bf4b37369cb8466093d6db5a:*.thearchon.net
9c0806e5ffaccb45121e57e4ce88c7bc76e057f1:*.goatpvp.com
5ca81746337088b7617c851a1376e4f00d921d9e:*.gotpvp.com
a5944b9707fdb2cc95ed4ef188cf5f3151ac0525:*.guildcraft.org

统计信息

 POST https://api.mojang.com/orders/statistics

获取有关Minecraft销量的统计信息。

负载

负载是"metricKeys"键下的json选项列表。 您将收到与所请求类型的销售总额相对应的单个对象。 您必须请求至少一种销售类型。 以下是https://minecraft.net/en/stats/使用的默认列表

{
    "metricKeys": [
        "item_sold_minecraft",
        "prepaid_card_redeemed_minecraft"
    ]
}

有效选项有:

   item_sold_minecraft
   prepaid_card_redeemed_minecraft
   item_sold_cobalt
   item_sold_scrolls

响应

返回一个包含已销售副本总数、最近24小时内售出的副本数量和每秒的销售量的json对象。

{
    "total": integer total amount sold,
    "last24h": integer total sold in last 24 hours,
    "saleVelocityPerSeconds": decimal average sales per second
}

示例

C# | 完整的API包装器

Go | UUID或名称至拥有皮肤、披风和名称历史的档案

Python | 完整的API包装器

Python | UUID或名称至档案

Python | 名称的文件至UUID和名称的文件

PHP | UUID或名称至拥有皮肤、头颅和名称历史的档案

PHP | UUID至名称

PHP | UUID至名称、名称至UUID

Java | 几近完整的API包装器

JavaScript | UUID或名称至拥有皮肤、披风和名称历史的档案