gamerteam
本帖最后由 gamerteam 于 2016-6-30 16:53 编辑

本翻译使用署名 - 相同方式共享 3.0协议


更多Minecraft开发资料,请查阅Wiki.vg
翻译By Frost Studio
以及CthuWork开发讨论群的各位成员

特别鸣谢:yushijinhun
我们会尽力保证本文的准确性,如果你对本文的一些内容有疑议,或者有什么不对的地方,欢迎指正

目录:



gamerteam
本帖最后由 gamerteam 于 2016-6-28 12:17 编辑

1.注意



2.API状态
  1. GET https://status.mojang.com/check
复制代码

返回Mojang服务的可用性。
可能返回的值green(没有问题),yellow(有些问题),red(服务不可用)。

响应
  1. [
  2.   {
  3.     "minecraft.net": "yellow"
  4.   },
  5.   {
  6.     "session.minecraft.net": "green"
  7.   },
  8.   {
  9.     "account.mojang.com": "green"
  10.   },
  11.   {
  12.     "auth.mojang.com": "green"
  13.   },
  14.   {
  15.     "skins.minecraft.net": "green"
  16.   },
  17.   {
  18.     "authserver.mojang.com": "green"
  19.   },
  20.   {
  21.     "sessionserver.mojang.com": "yellow"
  22.   },
  23.   {
  24.     "api.mojang.com": "green"
  25.   },
  26.   {
  27.     "textures.minecraft.net": "red"
  28.   },
  29.   {
  30.     "mojang.com": "green"
  31.   }
  32. ]
复制代码


3.用户名 -> 基于时间戳的UUID
  1. GET https://api.mojang.com/users/profiles/minecraft/<username>?at=<timestamp>
复制代码

返回在给定时间戳时,使用这个名字的玩家的UUID
(翻译注:该时间戳是一个UNIX时间戳,按秒计算)
?at=0可以获取该用户名的初始UUID,但是只有在该账号曾经改过名,或者是老版本Minecraft账号才会有效(这一段还有争议,建议自行阅读原文理解)


响应
  1. {
  2.   "id": "7125ba8b1c864508b92bb5c042ccfe2b",
  3.   "name": "KrisJelbring"
  4. }
复制代码


4.UUID -> 曾用名
  1. https://api.mojang.com/user/profiles/<uuid>/names
复制代码

返回该UUID曾经使用的用户名以及现在所使用的用户名。UUID务必无连字符(-)。
响应
  1. [
  2.     {
  3.         "name": "Gold"
  4.     },
  5.     {
  6.         "name": "Diamond",
  7.         "changedToAt": 1414059749000
  8.     }
  9. ]
复制代码

changedToAt一个UNIX时间戳,按秒计算



5.玩家名 -> UUIDs
  1. POST https://api.mojang.com/profiles/minecraft
复制代码

这将返回该玩家的UUID以及一些其他信息。

Payload
  1. [
  2.     "maksimkurb",
  3.     "nonExistingPlayer" //测试一个不存在的玩家
  4. ]
复制代码

响应

  1. [
  2.     {
  3.         "id": "0d252b7218b648bfb86c2ae476954d32",
  4.         "name": "maksimkurb",
  5.         "legacy": true,
  6.         "demo": true
  7.     }
  8. ]
复制代码

翻译者注释:上面的提示部分语法非常奇葩,所以可能出现翻译不太准确的情况,部分内容为我个人理解,这里我提供一下原文




6.UUID -> 用户信息 + 皮肤/披风
  1. https://sessionserver.mojang.com/session/minecraft/profile/<uuid>
复制代码

返回玩家的用户名以及该账号的其他信息(例如皮肤)。例:https://sessionserver.mojang.com ... 8ee8d71d7ba5aa00d20

这个API对请求频率有很严格的限制:你一分钟内只能查询同一个玩家一次,然而你却可以查询任意多的不同的玩家。

  1. {
  2.     "id": "<账号配置标识符>",
  3.     "name": "<玩家名>",
  4.     "properties": [
  5.         {
  6.             "name": "textures",
  7.             "value": "<base64字符串>",
  8.             "signature": "<base64字符串; 使用Yggdrasil's 私钥进行签名>"//只有当提供?unsigned=false 附加到url的时候才有
  9.         }
  10.     ]
  11. }
复制代码

value使用base64进行解密后会得到以下内容:
  1. {
  2.     "timestamp": "<毫秒级Java时间戳>",
  3.     "profileId": "<账号配置标识符>",
  4.     "profileName": "<玩家名称>",
  5.     "isPublic": "<true 或 false>",
  6.     "textures": {
  7.         "SKIN": {
  8.             "url": "<玩家皮肤URL>"
  9.         },
  10.         "CAPE": {
  11.             "url": "<玩家披风URL>"
  12.         }
  13.     }
  14. }
复制代码





7.修改皮肤
等待更新中



8.上传皮肤
等待更新中



9.重置皮肤
等待更新中


10.账号信息
等待更新中


11.禁止玩家进入的服务器(违反EULA的服务器黑名单)
返回被封禁的服务器的SHA1列表。当客户端尝试连接服务器的时候,将会检查服务器地址是否在此列表中。


客户端首先把服务器地址转换成小写的字符串,然后用ISO-8859-1来编码这段字符串,再检查列表里有没有哈希值和它相同的。同时也会检查子域名,它会依次把每一级域名替换成*(星号),再检查是否在列表中。具体就是:首先将域名以.(点)为分界分割,依次将最前面的一段剔除掉。比如mc.example.com,会依次检查mc.example.com、*.example.com、*.com。如果是ip地址(地址被.(点)分隔为3段,每一段都是0~255间的整数),则会依次从最后开始把每一段替换成*再检查。比如192.168.0.1,就会依次检查192.168.0.1、192.168.0.*、192.168.*、192.*。


这个检查是由Netty的Bootstrap类完成的。Netty原来的Bootstrap类被版本json中的com.mojang:netty这个依赖给覆盖了。因此这会影响到所有使用Netty的mc版本(1.7+)。


响应

  1. 6f2520f8bd70a718c568ab5274c56bdbbfc14ef4
  2. b13009db1e2fbe05465716f67c8d58b9c0503520
  3. 3e560742576af9413fca72e70f75d7ddc9416020
  4. e3985eb936d66c9b07aa72c15358f92965b1194e
  5. b140bec2347bfbe6dcae44aa876b9ba5fe66505b
  6. c005ad34245a8f2105658da2d6d6e8545ef0f0de
  7. 11a2c115510bfa6cb56bbd18a7259a4420498fd5
  8. c78697e385bfa58d6bd2a013f543cdfbdc297c4f
  9. c645d6c6430db3069abd291ec13afebdb320714b
  10. 073ca448ef3d311218d7bd32d6307243ce22e7d0
  11. 33839f4006d6044a3a6675c593fada6a690bb64d
  12. 4d303ec6c914007f3214ce9184e1891e97af71de
  13. 266723d98e2cccb7b45c9364c7716efe4da00dfa
复制代码

目前该hash已经被破解,得到的结果如下:
  1. 6f2520f8bd70a718c568ab5274c56bdbbfc14ef4 : *.minetime.com
  2. b13009db1e2fbe05465716f67c8d58b9c0503520 : *.endercraft.com
  3. 3e560742576af9413fca72e70f75d7ddc9416020 : *.insanefactions.org
  4. e3985eb936d66c9b07aa72c15358f92965b1194e : *.insanenetwork.org
  5. b140bec2347bfbe6dcae44aa876b9ba5fe66505b : *.phoenixnexus.net
  6. c005ad34245a8f2105658da2d6d6e8545ef0f0de : *.skygod.us
  7. 11a2c115510bfa6cb56bbd18a7259a4420498fd5 : *.slaughterhousepvp.com
  8. c78697e385bfa58d6bd2a013f543cdfbdc297c4f : *.mineaqua.net
  9. c645d6c6430db3069abd291ec13afebdb320714b : *.mineaqua.es
  10. 073ca448ef3d311218d7bd32d6307243ce22e7d0 : *.diacraft.org
  11. 33839f4006d6044a3a6675c593fada6a690bb64d : *.diacraft.de
  12. 4d303ec6c914007f3214ce9184e1891e97af71de : *.menoxia.com
  13. 266723d98e2cccb7b45c9364c7716efe4da00dfa : *.styxnetwork.net
复制代码





12.统计信息
获得Minecraft销售的统计数据。该payload是一个 metricKeys key 的json列表,下面的范例使用的key是https://minecraft.net/en/stats/页面的数据

  1. {
  2.     "metricKeys": [
  3.         "item_sold_minecraft",
  4.         "prepaid_card_redeemed_minecraft"
  5.     ]
  6. }
复制代码

目前有用的metricKeys key有:
  1.    item_sold_minecraft
  2.    prepaid_card_redeemed_minecraft
  3.    item_sold_cobalt
  4.    item_sold_scrolls
复制代码

响应
然后会返回一个目前已经销售的数量,以及24小时内和每秒销售了多少份Minecraft
  1. {
  2.     "total": 总共销售份数,
  3.     "last24h": 24小时内销售份数,
  4.     "saleVelocityPerSeconds":平均每秒销售份数
  5. }
复制代码





13.示例
译者注(前面为使用的开发语言,后面为介绍)

Go | 通过UUID或者玩家名,获取该玩家的皮肤、披风和历史名字(改名前的名字)
Python | 通过UUID或玩家名获取账号信息
Python | 通过玩家名返回玩家名+UUID信息
PHP | 通过UUID或者玩家名获取账号信息、皮肤、披风和历史名字
PHP | 通过UUID获取玩家名
PHP | 通过UUID获取玩家名,或者通过玩家名获取UUID
JavaScript | 通过UUID或者玩家名,获取账号信息、皮肤、披风和历史名字




wadang
这个厉害了,终于出官方API,这个是单机版的吧,服务器端会出API吗?

gamerteam
wadang 发表于 2016-6-14 22:07
这个厉害了,终于出官方API,这个是单机版的吧,服务器端会出API吗?

这个可不是用在游戏里的,准确的说,这个是MOJANG账号的API

andylizi
https://github.com/bangbang93/mi ... /master/protocol.md
哦好吧这个是protocol的。
其实mojangapi这部分不难,还是能看懂的。。

gamerteam
andylizi 发表于 2016-6-14 22:16
https://github.com/bangbang93/minecraft-protocol/blob/master/protocol.md
哦好吧这个是protocol的。
其 ...

那是游戏里了的吧

wadang
gamerteam 发表于 2016-6-14 22:10
这个可不是用在游戏里的,准确的说,这个是MOJANG账号的API

啊,原来如此,谢谢了。

0x3B800001
拾贰歲的小萝莉不容易,顶一个!

lichi2050
官方API??? 看来我得好好学习了

PumpkinXD
没有VB的实例介绍吗?

gamerteam
Lne 发表于 2016-6-30 14:12
没有VB的实例介绍吗?

API已经给出了,如果你真的理解了的话,相信写一个也不难

第一页 上一页 下一页 最后一页