本帖最后由 gamerteam 于 2016-6-30 16:53 编辑
本翻译使用署名 - 相同方式共享 3.0协议

更多Minecraft开发资料,请查阅Wiki.vg
翻译By Frost Studio
以及CthuWork开发讨论群的各位成员
特别鸣谢:yushijinhun
我们会尽力保证本文的准确性,如果你对本文的一些内容有疑议,或者有什么不对的地方,欢迎指正
目录:
本翻译使用署名 - 相同方式共享 3.0协议

更多Minecraft开发资料,请查阅Wiki.vg
翻译By Frost Studio
以及CthuWork开发讨论群的各位成员
特别鸣谢:yushijinhun
我们会尽力保证本文的准确性,如果你对本文的一些内容有疑议,或者有什么不对的地方,欢迎指正
目录:
- 1 注意事项
- 2 API状态
- 3 用户名 -> 基于时间的UUID
- 4 UUID -> 曾用名
- 5 玩家名 -> UUIDs
- 6 UUID -> 用户信息 + 皮肤/披风
- 7 修改皮肤
- 8 上传皮肤
- 9 重置皮肤
- 10 账号信息
- 11 封禁服务器
- 12 统计
- 13 示例
本帖最后由 gamerteam 于 2016-6-28 12:17 编辑
1.注意
2.API状态
复制代码
返回Mojang服务的可用性。
可能返回的值green(没有问题),yellow(有些问题),red(服务不可用)。
响应
复制代码
3.用户名 -> 基于时间戳的UUID
复制代码
返回在给定时间戳时,使用这个名字的玩家的UUID
(翻译注:该时间戳是一个UNIX时间戳,按秒计算)
?at=0可以获取该用户名的初始UUID,但是只有在该账号曾经改过名,或者是老版本Minecraft账号才会有效(这一段还有争议,建议自行阅读原文理解)
响应
复制代码
4.UUID -> 曾用名
复制代码
返回该UUID曾经使用的用户名以及现在所使用的用户名。UUID务必无连字符(-)。
响应复制代码
changedToAt一个UNIX时间戳,按秒计算
5.玩家名 -> UUIDs
复制代码
这将返回该玩家的UUID以及一些其他信息。
Payload
复制代码
响应复制代码
翻译者注释:上面的提示部分语法非常奇葩,所以可能出现翻译不太准确的情况,部分内容为我个人理解,这里我提供一下原文
6.UUID -> 用户信息 + 皮肤/披风
复制代码
返回玩家的用户名以及该账号的其他信息(例如皮肤)。例:https://sessionserver.mojang.com ... 8ee8d71d7ba5aa00d20
这个API对请求频率有很严格的限制:你一分钟内只能查询同一个玩家一次,然而你却可以查询任意多的不同的玩家。
复制代码
value使用base64进行解密后会得到以下内容:
复制代码
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+)。
响应
复制代码
目前该hash已经被破解,得到的结果如下:
复制代码
12.统计信息
获得Minecraft销售的统计数据。该payload是一个 metricKeys key 的json列表,下面的范例使用的key是https://minecraft.net/en/stats/页面的数据
复制代码
目前有用的metricKeys key有:复制代码
响应
然后会返回一个目前已经销售的数量,以及24小时内和每秒销售了多少份Minecraft
复制代码
13.示例
译者注(前面为使用的开发语言,后面为介绍)
Go | 通过UUID或者玩家名,获取该玩家的皮肤、披风和历史名字(改名前的名字)
Python | 通过UUID或玩家名获取账号信息
Python | 通过玩家名返回玩家名+UUID信息
PHP | 通过UUID或者玩家名获取账号信息、皮肤、披风和历史名字
PHP | 通过UUID获取玩家名
PHP | 通过UUID获取玩家名,或者通过玩家名获取UUID
JavaScript | 通过UUID或者玩家名,获取账号信息、皮肤、披风和历史名字
1.注意
- 注意,所有的公共API都有访问频率限制,所以你应该对结果进行缓存。目前是限制每10分钟进行600次请求,但是这可能会根据实际情况而变化。
- 部分API,有的将可以使用Demo账号,有的则不能,MOJANG会不断的修改的。
2.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"
- }
- ]
3.用户名 -> 基于时间戳的UUID
- GET https://api.mojang.com/users/profiles/minecraft/<username>?at=<timestamp>
返回在给定时间戳时,使用这个名字的玩家的UUID
(翻译注:该时间戳是一个UNIX时间戳,按秒计算)
?at=0可以获取该用户名的初始UUID,但是只有在该账号曾经改过名,或者是老版本Minecraft账号才会有效(这一段还有争议,建议自行阅读原文理解)
响应
- {
- "id": "7125ba8b1c864508b92bb5c042ccfe2b",
- "name": "KrisJelbring"
- }
4.UUID -> 曾用名
- https://api.mojang.com/user/profiles/<uuid>/names
返回该UUID曾经使用的用户名以及现在所使用的用户名。UUID务必无连字符(-)。
响应
- [
- {
- "name": "Gold"
- },
- {
- "name": "Diamond",
- "changedToAt": 1414059749000
- }
- ]
changedToAt一个UNIX时间戳,按秒计算
5.玩家名 -> UUIDs
- POST https://api.mojang.com/profiles/minecraft
这将返回该玩家的UUID以及一些其他信息。
Payload
- [
- "maksimkurb",
- "nonExistingPlayer" //测试一个不存在的玩家
- ]
响应
- [
- {
- "id": "0d252b7218b648bfb86c2ae476954d32",
- "name": "maksimkurb",
- "legacy": true,
- "demo": true
- }
- ]
- 名字不区分大小写
- 如果legacy为true,说明该账号没有迁移到mojang.com
- 如果demo为true,说明该账号没有购买游戏
- 如果名字为null或者"",将抛出IllegalArgumentException
- Content-Type(一个HTTP header)必须为application/json
- 你一次性不能请求超过100个名字
翻译者注释:上面的提示部分语法非常奇葩,所以可能出现翻译不太准确的情况,部分内容为我个人理解,这里我提供一下原文
6.UUID -> 用户信息 + 皮肤/披风
- https://sessionserver.mojang.com/session/minecraft/profile/<uuid>
返回玩家的用户名以及该账号的其他信息(例如皮肤)。例:https://sessionserver.mojang.com ... 8ee8d71d7ba5aa00d20
这个API对请求频率有很严格的限制:你一分钟内只能查询同一个玩家一次,然而你却可以查询任意多的不同的玩家。
- {
- "id": "<账号配置标识符>",
- "name": "<玩家名>",
- "properties": [
- {
- "name": "textures",
- "value": "<base64字符串>",
- "signature": "<base64字符串; 使用Yggdrasil's 私钥进行签名>"//只有当提供?unsigned=false 附加到url的时候才有
- }
- ]
- }
value使用base64进行解密后会得到以下内容:
- {
- "timestamp": "<毫秒级Java时间戳>",
- "profileId": "<账号配置标识符>",
- "profileName": "<玩家名称>",
- "isPublic": "<true 或 false>",
- "textures": {
- "SKIN": {
- "url": "<玩家皮肤URL>"
- },
- "CAPE": {
- "url": "<玩家披风URL>"
- }
- }
- }
- 有时候时间戳的时间是过去的(可能是因为缓存导致的?)
- 在使用Alex皮肤的时候,SKIN类将会有"metadata": {"model": "slim"},反之,Steve没有。
- 如果你没有自定义皮肤,将不会有SKIN类。
- 同样,如果玩家没有披风,也不会有CAPE类
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+)。
响应
- 6f2520f8bd70a718c568ab5274c56bdbbfc14ef4
- b13009db1e2fbe05465716f67c8d58b9c0503520
- 3e560742576af9413fca72e70f75d7ddc9416020
- e3985eb936d66c9b07aa72c15358f92965b1194e
- b140bec2347bfbe6dcae44aa876b9ba5fe66505b
- c005ad34245a8f2105658da2d6d6e8545ef0f0de
- 11a2c115510bfa6cb56bbd18a7259a4420498fd5
- c78697e385bfa58d6bd2a013f543cdfbdc297c4f
- c645d6c6430db3069abd291ec13afebdb320714b
- 073ca448ef3d311218d7bd32d6307243ce22e7d0
- 33839f4006d6044a3a6675c593fada6a690bb64d
- 4d303ec6c914007f3214ce9184e1891e97af71de
- 266723d98e2cccb7b45c9364c7716efe4da00dfa
目前该hash已经被破解,得到的结果如下:
- 6f2520f8bd70a718c568ab5274c56bdbbfc14ef4 : *.minetime.com
- b13009db1e2fbe05465716f67c8d58b9c0503520 : *.endercraft.com
- 3e560742576af9413fca72e70f75d7ddc9416020 : *.insanefactions.org
- e3985eb936d66c9b07aa72c15358f92965b1194e : *.insanenetwork.org
- b140bec2347bfbe6dcae44aa876b9ba5fe66505b : *.phoenixnexus.net
- c005ad34245a8f2105658da2d6d6e8545ef0f0de : *.skygod.us
- 11a2c115510bfa6cb56bbd18a7259a4420498fd5 : *.slaughterhousepvp.com
- c78697e385bfa58d6bd2a013f543cdfbdc297c4f : *.mineaqua.net
- c645d6c6430db3069abd291ec13afebdb320714b : *.mineaqua.es
- 073ca448ef3d311218d7bd32d6307243ce22e7d0 : *.diacraft.org
- 33839f4006d6044a3a6675c593fada6a690bb64d : *.diacraft.de
- 4d303ec6c914007f3214ce9184e1891e97af71de : *.menoxia.com
- 266723d98e2cccb7b45c9364c7716efe4da00dfa : *.styxnetwork.net
12.统计信息
获得Minecraft销售的统计数据。该payload是一个 metricKeys key 的json列表,下面的范例使用的key是https://minecraft.net/en/stats/页面的数据
- {
- "metricKeys": [
- "item_sold_minecraft",
- "prepaid_card_redeemed_minecraft"
- ]
- }
目前有用的metricKeys key有:
- item_sold_minecraft
- prepaid_card_redeemed_minecraft
- item_sold_cobalt
- item_sold_scrolls
响应
然后会返回一个目前已经销售的数量,以及24小时内和每秒销售了多少份Minecraft
- {
- "total": 总共销售份数,
- "last24h": 24小时内销售份数,
- "saleVelocityPerSeconds":平均每秒销售份数
- }
13.示例
译者注(前面为使用的开发语言,后面为介绍)
Go | 通过UUID或者玩家名,获取该玩家的皮肤、披风和历史名字(改名前的名字)
Python | 通过UUID或玩家名获取账号信息
Python | 通过玩家名返回玩家名+UUID信息
PHP | 通过UUID或者玩家名获取账号信息、皮肤、披风和历史名字
PHP | 通过UUID获取玩家名
PHP | 通过UUID获取玩家名,或者通过玩家名获取UUID
JavaScript | 通过UUID或者玩家名,获取账号信息、皮肤、披风和历史名字
这个厉害了,终于出官方API,这个是单机版的吧,服务器端会出API吗?
andylizi 发表于 2016-6-14 22:16
https://github.com/bangbang93/minecraft-protocol/blob/master/protocol.md
哦好吧这个是protocol的。
其 ...
gamerteam 发表于 2016-6-14 22:10
这个可不是用在游戏里的,准确的说,这个是MOJANG账号的API
啊,原来如此,谢谢了。
拾贰歲的小萝莉不容易,顶一个!
官方API??? 看来我得好好学习了
没有VB的实例介绍吗?
Lne 发表于 2016-6-30 14:12
没有VB的实例介绍吗?
API已经给出了,如果你真的理解了的话,相信写一个也不难