本条目在《知识共享 署名-相同方式共享》下发表。衍生作品必须使用相同或兼容的协议进行授权。

Mojang API

来自Minecraft Wiki
跳转到导航 跳转到搜索

Mojang APIMojang提供的应用程序编程接口,允许用户使用自编程序检索玩家数据,它适用于第三方启动器开发人员、服务器运营商和插件开发人员。

所有查询目前限制为每10分钟600次。对于没有购买游戏的注册账户,也可以进行部分信息的查询。

服务器的请求与响应

[编辑 | 编辑源代码]

服务器能接受很多请求,如果没有特殊说明,对于具有负载的请求服务器有下面的限制:

  • 请求头中的Content-Type必须是application/json。如果不是,服务器将返回HTTP状态码415。
  • 如果请求中要求负载,则负载必须是一个有效的JSON文本。如果不是,服务器将返回HTTP状态码400。

如果请求成功,服务器会做出如下的响应:

  • 一个成功的HTTP状态码(2XX)。
  • 返回一个空的负载(这时服务器返回状态码204)或是一个JSON文本。

如果请求失败,服务器会返回一个非2XX的HTTP状态码并返回形式如下方的负载:

  • NBT复合标签/JSON对象 根标签
    • 字符串error:对于错误的简短介绍。
    • 字符串errorMessage:错误信息。
    • 字符串cause:错误原因。

下面列出了一些常见的错误,在下文中不再重复说明。

HTTP状态码 错误(error) 错误具体信息(errorMessage) 错误说明
400 IllegalArgumentException (与具体API有关) 请求中包含了错误或无效的参数。
MismatchedInputException 请求负载中的JSON文本不满足API要求的格式或请求负载不是有效的JSON文本。
JsonParseException
401 (返回空负载) (返回空负载) API要求使用访问令牌,但是请求头中没有包含Authorization或请求中的访问令牌无效。
Unauthorized The request requires user authentication API要求使用访问令牌,但是请求头中没有包含Authorization
403 ForbiddenOperationException Forbidden 访问令牌无效。
404 Not Found The server has not found anything matching the request URI 服务器找不到请求的URI。
405 Method Not Allowed The method specified in the request is not allowed for the resource identified by the request URI 接收到了错误请求方法的请求。
415 Unsupported Media Type The server is refusing to service the request because the entity of the request is in a format not supported by the requested resource for the requested method 不支持的媒体类型,即请求头Content-Type不是API要求的类型。

获取玩家信息

[编辑 | 编辑源代码]

获取玩家信息的API都不需要身份验证得到的访问令牌,部分API可以查询没有购买游戏的注册账户。

获取玩家的UUID

[编辑 | 编辑源代码]
输入

玩家的名称(不区分大小写)。

GET请求
  • https://api.mojang.com/users/profiles/minecraft/<玩家名称>
  • https://api.minecraftservices.com/minecraft/profile/lookup/name/<玩家名称>
响应
  • NBT复合标签/JSON对象 根标签
    • 字符串id:玩家的UUID
    • 字符串name:正确大写的玩家名称。
    • 布尔型legacy:如果此账户没有迁移到Mojang账户,输出中包含此项。
    • 布尔型demo:如果是没有购买游戏的注册账户,输出中包含此项。
示例

https://api.mojang.com/users/profiles/minecraft/jeb_
提供玩家jeb_的UUID。

 {
   "name": "jeb_",
   "id": "853c80ef3c3749fdaa49938b674adae6"
 }
错误信息
  • 如果没有命名为这个名字的玩家,返回HTTP状态码404。

批量获取玩家UUID

[编辑 | 编辑源代码]
负载

一个存储小于10个的玩家名称字符串的JSON列表,玩家名称不区分大小写。

POST请求

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

响应
  • NBT列表/JSON数组 给定玩家的所有UUID列表。对于不存在的玩家名称,将不返回任何结果。
    • NBT复合标签/JSON对象 玩家名称。
      • 字符串id:玩家的UUID。
      • 字符串name:正确大小写的玩家名称。
      • 布尔型legacy:如果此账户没有迁移到Mojang账户,输出中包含此项。
      • 布尔型demo:如果是没有购买游戏的注册账户,输出中包含此项。
示例

发送["jeb_","notch"]

 [
   {
     "id": "853c80ef3c3749fdaa49938b674adae6",
     "name": "jeb_"
   },
   {
     "id": "069a79f444e94726a5befca90e38aaf5",
     "name": "Notch"
   }
 ]
错误信息
HTTP状态码 错误(error) 错误具体信息(errorMessage) 错误说明
400 CONSTRAINT_VIOLATION size must be between 1 and 10 请求负载的JSON列表为空。
请求负载的JSON列表中元素数量大于10个。
Invalid profile name 请求负载的JSON列表中含有空字符串。

获取玩家名称

[编辑 | 编辑源代码]
输入

玩家的UUID。

GET请求

https://api.minecraftservices.com/minecraft/profile/lookup/<UUID>

响应

获取玩家UUID

示例

https://api.minecraftservices.com/minecraft/profile/lookup/853c80ef3c3749fdaa49938b674adae6
返回如下结果:

{
  "id" : "853c80ef3c3749fdaa49938b674adae6",
  "name" : "jeb_"
}
错误信息
HTTP状态码 错误(error) 错误具体信息(errorMessage) 错误说明
404 NOT_FOUND Not Found 此UUID不代表任何玩家。
400 CONSTRAINT_VIOLATION Invalid UUID string: <输入的参数> URI中的UUID无效。

获取玩家的皮肤和披风

[编辑 | 编辑源代码]
输入

玩家的UUID以及签名的请求。可以在一分钟后最早重复对给定UUID的查询。

GET请求

https://sessionserver.mojang.com/session/minecraft/profile/<UUID>
https://sessionserver.mojang.com/session/minecraft/profile/<UUID>?unsigned=false

响应
  • NBT复合标签/JSON对象 根标签
    • 字符串id:玩家的UUID
    • 字符串name:正确大写的玩家名称。
    • 布尔型legacy:如果这个账户是一个旧的Minecraft账户,这项才存在。
    • NBT列表/JSON数组properties:玩家属性的列表。
      • 字符串name:玩家属性的名称。到目前为止只有textures(玩家纹理)这一属性。
      • 字符串signature:只有在请求unsigned=false时,使用Yggdrasil私钥的签名才会作为Base64字符串传递。
      • 字符串valueBase64字符串,其中包含玩家所有的纹理(皮肤和披风)。解码后的字符串内容如下:
        • NBT复合标签/JSON对象 纹理对象。
          • 整型timestampUnix时间戳,以毫秒为单位,时间为调用纹理数据的时间。
          • 字符串profileId:玩家的UUID,不带连字符。
          • 字符串profileName: 玩家名称。
          • 布尔型signatureRequired: 只有在请求unsigned=false时才存在。
          • NBT复合标签/JSON对象textures:纹理。
            • NBT复合标签/JSON对象SKIN皮肤纹理。如果这名玩家没有自定义皮肤,这项不存在。
              • 字符串url:皮肤纹理的URL链接。
              • NBT复合标签/JSON对象metadata:可选。皮肤的元数据。
                • 字符串model:固定值slim。当皮肤模型为Alex时这一项才存在,模型为Steve则无该元数据。
            • NBT复合标签/JSON对象CAPE披风纹理。如果这名玩家没有披风,这项不存在。
              • 字符串url:披风纹理的URL链接。默认没有披风,仅当Mojang在玩家的账户数据中输入了披风时,才会显示披风。
示例

https://sessionserver.mojang.com/session/minecraft/profile/853c80ef3c3749fdaa49938b674adae6
返回如下结果:

 {
   "id": "853c80ef3c3749fdaa49938b674adae6",
   "name": "jeb_",
   "properties":
   [
     {
       "name": "textures",
       "value": "ewogICJ0aW1lc3R..."
     }
   ]
 }

其中字符串value使用Base64解码之后的内容为:

{
  "timestamp" : 1653838459263,
  "profileId" : "853c80ef3c3749fdaa49938b674adae6",
  "profileName" : "jeb_",
  "textures" : {
    "SKIN" : {
      "url" : "http://textures.minecraft.net/texture/7fd9ba42a7c81eeea22f1524271ae85a8e045ce0af5a6ae16c6406ae917e68b5"
    },
    "CAPE" : {
      "url" : "http://textures.minecraft.net/texture/9e507afc56359978a3eb3e32367042b853cddd0995d17d0da995662913fb00f7"
    }
  }
}
错误信息
HTTP状态码 错误(error) 错误具体信息(errorMessage) 错误说明
204 (返回空负载) (返回空负载) 此UUID不代表任何玩家。
400 (无) Not a valid UUID: <输入的参数> URI中的UUID无效。

Mojang身份验证

[编辑 | 编辑源代码]

对于Mojang账户,要用下面的API进行身份验证。身份验证都使用了https://authserver.mojang.com这个服务器。

验证并获取访问令牌

[编辑 | 编辑源代码]

验证的请求次数很严格,在几秒内仅能请求3次。

负载
  • NBT复合标签/JSON对象 根标签
    • NBT复合标签/JSON对象agent:游戏信息。
      • 字符串name:游戏名称。固定值Minecraft
      • 整型version:版本。固定值1。
    • 字符串username:账户名称,是一个电子邮件地址。对于未迁移的账户,可以是玩家名称。
    • 字符串password:账户密码。
    • 字符串clientToken:客户端令牌,可选参数。所有的请求都要用统一的客户端令牌。启动器应该在第一次运行时生成一个令牌,并且需要在以后的请求中使用它。如果请求中不提供客户端令牌,那么服务器会随机生成一个令牌返回给客户端,客户端应该保存这个令牌并用于之后的请求,但是这样做会让客户端之前获得的访问令牌失效。
    • 布尔型requestUser:响应是否包含user对象,可选参数,默认为false
POST请求

/authenticate

响应
  • NBT复合标签/JSON对象 根标签
    • NBT复合标签/JSON对象user:账户信息,只有当请求中requestUsertrue时才存在。
      • 字符串username:账户名称,是一个电子邮件地址。对于未迁移到Mojang账户的账户是玩家名称。
      • NBT列表/JSON数组properties:账户属性。
        • NBT复合标签/JSON对象:一项属性。
          • 字符串name:属性名称,目前只有preferredLanguageregistrationCountry
          • 字符串value:属性的值。当字符串namepreferredLanguage时为语言;当字符串nameregistrationCountry时为注册时的国家信息。
      • 字符串id:账户的远程ID,是一个16进制的字符串。
    • 字符串clientToken:客户端令牌。
    • 字符串accessToken访问令牌
    • NBT列表/JSON数组availableProfiles:可用的玩家配置信息。
      • NBT复合标签/JSON对象:一项配置信息。
        • 字符串name:玩家名称。
        • 字符串id:玩家的UUID。
    • NBT复合标签/JSON对象selectedProfile:现在正在使用的玩家配置信息。
      • 字符串name:玩家名称。
      • 字符串id:玩家的UUID。
错误信息
HTTP状态码 错误(error) 错误具体信息(errorMessage) 错误说明
403 ForbiddenOperationException Invalid credentials. Account migrated, use email as username. 账户已经迁移。
Invalid credentials. Invalid username or password. 账户名或密码错误。
Invalid credentials. 尝试登录次数过于频繁。
Forbidden 账户名或者密码不符合要求。
410 ResourceException Gone (410) - The requested resource is no longer available at the server and no forwarding address is known 账户已经迁移到Mircosoft账户。
GoneException

刷新访问令牌

[编辑 | 编辑源代码]
负载
  • NBT复合标签/JSON对象 根标签
    • 字符串accessToken:访问令牌,在请求之后这个令牌将会失效。
    • 字符串clientToken:客户端令牌,要与验证时的令牌一致。
    • NBT复合标签/JSON对象selectedProfile:现在正在使用的玩家配置信息。
      • 字符串id:玩家的UUID。
      • 字符串name:玩家名称。
    • 布尔型requestUser:响应是否包含NBT复合标签/JSON对象user,可选参数,默认为false
POST请求

/refresh

响应
  • NBT复合标签/JSON对象 根标签
    • 字符串accessToken:新的有效的访问令牌。
    • 字符串clientToken:客户端令牌。
    • NBT复合标签/JSON对象selectedProfile:现在正在使用的玩家配置信息。
      • 字符串id:玩家的UUID。
      • 字符串name:玩家名称。
    • NBT复合标签/JSON对象user:账户信息,只有当请求中布尔型requestUsertrue时才存在。
      • 字符串username:账户名称,是一个电子邮件地址。对于旧的Minecraft账户是玩家名称。
      • 字符串id:账户的远程ID,是一个16进制的字符串。
      • NBT列表/JSON数组properties:账户属性。
        • 字符串name:属性名称,目前只有preferredLanguageregistrationCountry
        • 字符串value:属性的值。当字符串namepreferredLanguage时为语言;当字符串nameregistrationCountry时为注册时的国家信息。
错误信息
HTTP状态码 错误(error) 错误具体信息(errorMessage) 错误说明
403 ForbiddenOperationException Invalid token. 无效的访问令牌。
Token does not exist. 客户端令牌和当时请求此访问令牌的客户端令牌不一致。

检查访问令牌有效性

[编辑 | 编辑源代码]
负载
  • NBT复合标签/JSON对象 根标签
    • 字符串accessToken:要查询的访问令牌。
    • 字符串clientToken:客户端令牌,可选参数。如果提供了客户端令牌,那么它要和验证时的令牌一致。
POST请求

/validate

响应

如果令牌还有效那么服务器会返回HTTP状态码204。

错误信息
HTTP状态码 错误(error) 错误具体信息(errorMessage) 错误说明
403 ForbiddenOperationException Invalid token. 无效的访问令牌。
Token does not exist. 客户端令牌和当时请求此访问令牌的客户端令牌不一致。

登出账户

[编辑 | 编辑源代码]
负载
  • NBT复合标签/JSON对象 根标签
    • 字符串username:账户名称。
    • 字符串password:账户密码。
POST请求

/signout

响应

如果登出成功服务器将返回一个空的负载。

使访问令牌无效

[编辑 | 编辑源代码]
负载
  • NBT复合标签/JSON对象 根标签
    • 字符串accessToken:访问令牌,在请求之后这个令牌将会失效。
    • 字符串clientToken:客户端令牌,要与验证时的令牌一致。
POST请求

/invaildate

响应

如果使令牌成功无效化服务器将返回一个空的负载。

错误信息
HTTP状态码 错误(error) 错误具体信息(errorMessage) 错误说明
403 ForbiddenOperationException Invalid token. 无效的访问令牌。
Token does not exist. 客户端令牌和当时请求此访问令牌的客户端令牌不一致。

Microsoft身份验证

[编辑 | 编辑源代码]

该过程包含多个步骤并且需要不同的令牌,但最终会获取到一个标准的Minecraft令牌。目前所有的账户均已启用这一新的验证系统。

在使用Microsoft验证之前,必须要先通过创建Microsoft Azure应用程序来获得OAuth 2.0客户端ID(无需获取密钥);之后根据这篇支持文档,还需填写此表单以申请API访问权限,否则使用api.minecraftservices.com域名下的任意API时都只会返回403。之后,就可以获取Microsoft令牌。

请注意:在获取令牌时,tenant参数必须consumersscope参数中必须包含XboxLive.signin,否则无法进行获取Xbox Live令牌等操作。

使用Microsoft令牌获取Xbox Live令牌

[编辑 | 编辑源代码]
负载
  • NBT复合标签/JSON对象 根标签
    • NBT复合标签/JSON对象Properties:验证属性。
      • 字符串AuthMethod:登录方法。固定值RPS
      • 字符串SiteName:网站名称。固定值user.auth.xboxlive.com
      • 字符串RpsTicket:登录使用的票据。值为d=<Microsoft访问令牌>
    • 字符串RelyingParty:依赖的平台。固定值http://auth.xboxlive.com
    • 字符串TokenType:访问令牌的类型。固定值JWT
POST请求

https://user.auth.xboxlive.com/user/authenticate

要求SSL实现支持SSL重协商。

响应
  • NBT复合标签/JSON对象 根标签
    • 字符串IssueInstant:获取Xbox Live令牌的时间。
    • 字符串NotAfter:Xbox Live令牌过期时间。
    • 字符串Token:Xbox Live访问令牌。
    • NBT复合标签/JSON对象DisplayClaims:未知。
      • NBT列表/JSON数组xui:未知。
        • NBT复合标签/JSON对象
          • 字符串uhs:用户的哈希码。

使用Xbox Live令牌获取XSTS令牌

[编辑 | 编辑源代码]
负载
  • NBT复合标签/JSON对象 根标签
    • NBT复合标签/JSON对象Properties:验证属性。
      • 字符串SandboxId:沙盒ID。固定值RETAIL
      • NBT列表/JSON数组UserTokens:用户的Xbox Live令牌。
        • 字符串:用户的Xbox Live令牌,在上一步获取。
    • 字符串RelyingParty:依赖的平台。固定值rp://api.minecraftservices.com/
    • 字符串TokenType:访问令牌的类型。固定值JWT
POST请求

https://xsts.auth.xboxlive.com/xsts/authorize

要求SSL实现支持SSL重协商。

响应
  • NBT复合标签/JSON对象 根标签
    • 字符串IssueInstant:获取XSTS令牌的时间。
    • 字符串NotAfter:XSTS令牌过期时间。
    • 字符串Token:XSTS访问令牌。
    • NBT复合标签/JSON对象DisplayClaims:未知。
      • NBT列表/JSON数组xui:未知。
        • NBT复合标签/JSON对象
          • 字符串uhs:用户的哈希码。
错误信息

如果没有成功获取XSTS令牌,服务器返回HTTP状态码401。

通过XSTS令牌获取Minecraft访问令牌

[编辑 | 编辑源代码]
负载
  • NBT复合标签/JSON对象 根标签
    • 字符串identityToken:身份令牌。值为XBL3.0 x=<用户哈希码>;<XSTS访问令牌>
POST请求

https://api.minecraftservices.com/authentication/login_with_xbox

响应
  • NBT复合标签/JSON对象 根标签
    • 字符串username:一个UUID,但不是账户的UUID。
    • NBT列表/JSON数组roles:未知,为空。
    • 字符串access_token:Minecraft访问令牌。
    • 字符串token_type:令牌类型。固定值Bearer
    • 字符串expires_in:有效时间,以秒为单位。

验证账户是否拥有Minecraft

[编辑 | 编辑源代码]
请求头

Authorization要求为Bearer <有效的Minecraft访问令牌>

GET请求

https://api.minecraftservices.com/entitlements/mcstore

响应

如果账户拥有Minecraft,服务器将会返回下面的负载:

  • NBT复合标签/JSON对象 根标签
    • NBT列表/JSON数组items:数据和签名列表。
      • 字符串name:数据名称,product_minecraftgame_minecraft
      • 字符串signature:数据的JWT签名。
    • 字符串signature:JWT签名。
    • 字符串keyID:未知。

如果账户不拥有Minecraft或者是XGP用户,服务器将返回空负载。

玩家配置操作

[编辑 | 编辑源代码]

操作玩家配置的API基本都在https://api.minecraftservices.com服务器下,并且都要求请求头包含Authorization,且值为Bearer <有效的Minecraft访问令牌>。如果请求头不包含访问令牌信息或者访问令牌无效,服务器将返回HTTP状态码401。

获取配置信息

[编辑 | 编辑源代码]
GET请求

/minecraft/profile

响应
  • NBT复合标签/JSON对象 根标签
    • 字符串id:玩家的UUID。
    • 字符串name:玩家名称。
    • NBT列表/JSON数组skins:玩家拥有的所有皮肤信息。
      • NBT复合标签/JSON对象:一个皮肤。
        • 字符串id:皮肤的UUID。
        • 字符串state:皮肤的使用状态。
        • 字符串url:皮肤的URL。
        • 字符串variant:皮肤类型。如果是Steve模型的皮肤这一项是CLASSIC,如果是Alex模型的皮肤这一项是SLIM
    • NBT列表/JSON数组capes:玩家拥有的所有披风信息。
      • NBT复合标签/JSON对象:一个披风。
        • 字符串id:披风的UUID。
        • 字符串state:披风的使用状态。
        • 字符串url:披风的URL。
        • 字符串alias:披风的别名。

获取玩家属性

[编辑 | 编辑源代码]
GET请求

/player/attributes

响应
  • NBT复合标签/JSON对象 根标签
    • NBT复合标签/JSON对象privileges:玩家的能力。
      • NBT复合标签/JSON对象onlineChat:玩家接受聊天信息的能力。
        • 布尔型enable:为真时玩家可以接受聊天信息,为假时不能。
      • NBT复合标签/JSON对象multiplayerServer:玩家加入多人服务器的能力。
        • 布尔型enable:为真时玩家可以加入多人服务器,为假时不能。
      • NBT复合标签/JSON对象multiplayerRealms:玩家加入Realms的能力。
        • 布尔型enable:为真时玩家可以加入Realms,为假时不能。
      • NBT复合标签/JSON对象telemetry:玩家发送遥测数据的能力。
        • 布尔型enable:为真时玩家可以发送遥测数据。
      • NBT复合标签/JSON对象optionalTelemetry:玩家发送可选遥测数据的能力。
        • 布尔型enable:为真时玩家可以发送可选遥测数据。
    • NBT复合标签/JSON对象profanityFilterPreferences:玩家Realms聊天过滤选项。
      • 布尔型profanityFilterOn:是否开启Realms聊天过滤。
    • NBT复合标签/JSON对象banStatus:玩家封禁状态。
      • NBT复合标签/JSON对象bannedScopes:玩家封禁的范围。
        • NBT复合标签/JSON对象:玩家的封禁范围对象。如果玩家未被封禁,则不存在这些对象。目前只有MULTIPLAYER项。
          • 字符串banId:封禁的UUID。
          • 字符串expires:封禁到期时间。如果玩家被永久封禁,这一项不存在。
          • 字符串reason:封禁原因。
          • 字符串reasonMessage:封禁消息。

启用/禁用Realms聊天过滤

[编辑 | 编辑源代码]
负载
  • NBT复合标签/JSON对象 根标签
    • NBT复合标签/JSON对象profanityFilterPreferences:玩家Realms聊天过滤选项。
      • 布尔型profanityFilterOn:是否开启Realms聊天过滤。
POST请求

/player/attributes

响应

与获取玩家属性的响应相同。

获取屏蔽玩家列表

[编辑 | 编辑源代码]
GET请求

/privacy/blocklist

响应
  • NBT复合标签/JSON对象 根标签
    • NBT列表/JSON数组blockedProfiles:被屏蔽的玩家列表。这些玩家的聊天信息和Realms邀请将不可见。
      • 字符串:被屏蔽玩家的UUID。

获得签名密钥对

[编辑 | 编辑源代码]
POST请求

/player/certificates

响应
  • NBT复合标签/JSON对象 根标签
    • NBT复合标签/JSON对象keyPair:签名使用的密钥对。
      • 字符串privateKey:私钥。以-----BEGIN RSA PRIVATE KEY-----开头并以-----END RSA PRIVATE KEY-----结束。
      • 字符串publicKey:公钥。以-----BEGIN RSA PUBLIC KEY-----开头并以-----END RSA PUBLIC KEY-----结束。
    • 字符串publicKeySignature:在刚加入签名时使用的公钥签名。目前最新版本已经不再使用此签名,而是V2版本的签名。
    • 字符串publicKeySignatureV2:公钥签名。
    • 字符串expiresAt:密钥对到期时间。
    • 字符串refreshedAfter:密钥对刷新时间。

获取玩家名称信息

[编辑 | 编辑源代码]
GET请求

/minecraft/profile/namechange

响应
  • NBT复合标签/JSON对象 根标签
    • 字符串changedAt:最近一次的名称修改时间。
    • 字符串createdAt:玩家配置创建的时间。
    • 布尔型nameChangeAllowed:是否允许修改名称。

检查礼品卡是否有效

[编辑 | 编辑源代码]
GET请求

/productvoucher/giftcode

响应

如果礼品卡有效,服务器会返回HTTP状态码200或者204。如果礼品卡无效,服务器将会返回HTTP状态码404。

检查名称可用性

[编辑 | 编辑源代码]
GET请求

/minecraft/profile/name/<要检查的名称>/available

响应
  • NBT复合标签/JSON对象 根标签
    • 字符串status:名称的状态。如果是DUPLICATE代表名称已被占用,如果是AVAILABLE代表名称可用,如果是NOT_ALLOWED代表名称不符合要求。

修改名称

[编辑 | 编辑源代码]
输入

修改的名称。

PUT请求

/minecraft/profile/name/<修改的名称>

响应
  • NBT复合标签/JSON对象 根标签
    • 字符串id:玩家的UUID。
    • 字符串name:修改之后的玩家名称。
    • NBT列表/JSON数组skins:玩家拥有的所有皮肤信息。
      • NBT复合标签/JSON对象:一个皮肤。
        • 字符串id:皮肤的UUID。
        • 字符串state:皮肤的使用状态。
        • 字符串url:皮肤的URL。
        • 字符串variant:皮肤类型。如果是Steve模型的皮肤这一项是CLASSIC,如果是Alex模型的皮肤这一项是SLIM
    • NBT列表/JSON数组capes:玩家拥有的所有披风信息。
      • NBT复合标签/JSON对象:一个披风。
        • 字符串id:披风的UUID。
        • 字符串state:披风的使用状态。
        • 字符串url:披风的URL。
        • 字符串alias:披风的别名。
错误信息
HTTP状态码 错误(error) 错误具体信息(errorMessage) 错误说明
400 CONSTRAINT_VIOLATION changeProfileName.profileName: Invalid profile name 名称不符合要求(大于16个字符或含有非数字、字母和下划线的字符)。
403 (无) Could not change name for profile 不可以修改名称。如果detail.statusDUPLICATE说明此名称已被占用。
429 - - 发送了太多次改名请求。

更换皮肤

[编辑 | 编辑源代码]
负载
  • NBT复合标签/JSON对象 根标签
    • 字符串variant:皮肤模型。如果是Steve模型要使用classic,如果是Alex模型要使用slim
    • 字符串url:皮肤的URL。
POST请求

/minecraft/profile/skins

响应

如果更换成功,服务器将返回空负载。

上传皮肤

[编辑 | 编辑源代码]
负载

负载由两部分组成。

  • variant:皮肤模型。如果是Steve模型要使用classic,如果是Alex模型要使用slim
  • file:图片数据。在上传之后会将玩家的皮肤设置为新上传的这个皮肤。
POST请求

/minecraft/profile/skins

举例
curl -X POST -H "Authorization: Bearer <access token>" -F variant=classic -F file="@steeevee.png;type=image/png" https://api.minecraftservices.com/minecraft/profile/skins
响应

如果上传成功,服务器将返回空负载。

重置皮肤

[编辑 | 编辑源代码]
输入

玩家的UUID。

DELETE请求

/minecraft/profile/skins/active

响应

如果操作成功,服务器将返回HTTP状态码200。

隐藏披风

[编辑 | 编辑源代码]
DELETE请求

/minecraft/profile/capes/active

响应

如果操作成功,服务器将返回空负载。

显示披风

[编辑 | 编辑源代码]
负载
  • NBT复合标签/JSON对象 根标签
    • 字符串capeId:要显示的披风的UUID。
PUT请求

/minecraft/profile/capes/active

响应
  • NBT复合标签/JSON对象 根标签
    • 字符串id:玩家的UUID。
    • 字符串name:玩家名称。
    • NBT列表/JSON数组skins:玩家拥有的所有皮肤信息。
      • NBT复合标签/JSON对象:一个皮肤。
        • 字符串id:皮肤的UUID。
        • 字符串state:皮肤的使用状态。
        • 字符串url:皮肤的URL。
        • 字符串variant:皮肤类型。如果是Steve模型的皮肤这一项是CLASSIC,如果是Alex模型的皮肤这一项是SLIM
    • NBT列表/JSON数组capes:玩家拥有的所有披风信息。
      • NBT复合标签/JSON对象:一个披风。
        • 字符串id:披风的UUID。
        • 字符串state:披风的使用状态。
        • 字符串url:披风的URL。
        • 字符串alias:披风的别名。
错误信息
HTTP状态码 错误(error) 错误具体信息(errorMessage) 错误说明
400 (无) profile does not own cape 玩家没有指定的披风。

账户迁移操作

[编辑 | 编辑源代码]

和玩家配置操作的要求一样,请求头要包含Authorization,且值为Bearer <有效的Minecraft访问令牌>。如果请求头不包含访问令牌信息或者访问令牌无效,服务器将返回HTTP状态码401。

验证安全的登录位置

[编辑 | 编辑源代码]
GET请求

https://api.mojang.com/user/security/location

响应

如果是一个安全的位置,服务器将返回HTTP状态码204。

错误信息
HTTP状态码 错误(error) 错误具体信息(errorMessage) 错误说明
403 ForbiddenOperationException Current IP is not secured 当前IP不安全。

获取安全验证问题

[编辑 | 编辑源代码]
GET请求

https://api.mojang.com/user/security/challenges

响应
  • NBT列表/JSON数组 根标签,内部有3个安全验证问题对象。
    • NBT复合标签/JSON对象answer:答案信息。
      • 整型id:答案的ID。发送安全验证问题答案的时候需要附带此ID。
    • NBT复合标签/JSON对象question:问题信息。
      • 整型id:问题的ID。
      • 字符串question:问题的描述。问题ID和问题描述一一对应。

发送安全验证问题答案

[编辑 | 编辑源代码]
负载
  • NBT列表/JSON数组 根标签,内部有3个安全验证问题答案对象。
    • 整型id:答案的ID,与获取问题中的ID一致。
    • 字符串answer:问题的答案。
POST请求

https://api.mojang.com/user/security/challenges

响应

如果安全问题答案全部正确,服务器将返回HTTP状态码204。

错误信息
HTTP状态码 错误(error) 错误具体信息(errorMessage) 错误说明
403 ForbiddenOperationException At least one answer was incorrect 答案不完全正确。

获取账户迁移状态

[编辑 | 编辑源代码]
GET请求

https://api.minecraftservices.com/rollout/v1/msamigration

响应
  • NBT复合标签/JSON对象 根标签
    • 字符串feature:查询的功能。固定值msamigration
    • 布尔型rollout:是否可以进行账户迁移。

获得账户迁移的一次性密码

[编辑 | 编辑源代码]
POST请求

https://api.minecraftservices.com/twofactorauth/migration/otp

响应

如果账户可以进行迁移,服务器会返回HTTP状态码201并返回下面的JSON对象:

  • NBT复合标签/JSON对象 根标签
    • 字符串otpId:用于账户迁移的一次性ID,稍后用于验证发到账户电子邮箱的一次性密码。

验证账户迁移的一次性密码

[编辑 | 编辑源代码]
输入

在获取一次性密码时的一次性ID。

负载
  • NBT复合标签/JSON对象 根标签
    • 字符串otp:发送到账户电子邮箱的一次性密码。
POST请求

https://api.minecraftservices.com/twofactorauth/migration/otp/<otpId>/verify

响应

如果验证成功,服务器将返回HTTP状态码204。

提交账户迁移数据

[编辑 | 编辑源代码]
负载
  • NBT复合标签/JSON对象 根标签
    • 字符串sessionEmail:账户迁移的目标电子邮箱。
POST请求

https://api.minecraftservices.com/migration/token

响应

如果成功,服务器返回HTTP状态码200。

服务器操作

[编辑 | 编辑源代码]

获取屏蔽服务器信息

[编辑 | 编辑源代码]
GET请求

https://sessionserver.mojang.com/blockedservers

响应

服务器将返回一个文本,每一行都是被屏蔽的服务器的哈希码。

客户端登录验证

[编辑 | 编辑源代码]
负载
  • NBT复合标签/JSON对象 根标签
    • 字符串accessToken:有效的Minecraft访问令牌。
    • 字符串selectedProfile:不带有连字符的玩家UUID。
    • 字符串serverId:服务器的ID。

其中服务器的ID由下方算法计算而成:

public static String generateServerId(String baseServerId,   // 服务器的基础ID,通常为空字符串""
                                      PublicKey publicKey,   // 服务器的RSA公钥
                                      SecretKey secretKey    // 服务器与客户端之间使用的对称加密AES密钥
                                     ) throws Exception { 
    MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");
    messageDigest.update(baseServerId.getBytes("ISO_8859_1"));
    messageDigest.update(secretKey.getEncoded());
    messageDigest.update(publicKey.getEncoded());
    byte[] digestData = messageDigest.digest();
    return new BigInteger(digestData).toString(16);
}
POST请求

https://sessionserver.mojang.com/session/minecraft/join

响应

如果验证成功,服务器返回HTTP状态码204。

服务器登录验证

[编辑 | 编辑源代码]
输入

不区分大小写的玩家名称、由上方算法得出的服务器ID和客户端IP(可选)。

GET请求

https://sessionserver.mojang.com/session/minecraft/hasJoined?username=<玩家名称>&serverId=<服务器ID>&ip=<客户端IP>

响应

如果验证成功,服务器将返回和上方获取玩家的皮肤和披风一样的负载。

2014年4月14日Mojang API发布。
2020年11月获取玩家UUID的API不再支持at参数。
2021年10月8日查询Mojang API状态的API被移除。在此之前,此API为https://status.mojang.com/check
2022年5月8日获取销量统计数据的API被移除。在此之前,此API为https://api.mojang.com/orders/statistics
2022年9月13日查询玩家历史名称的API被移除。在此之前,此API为https://api.mojang.com/user/profiles/<UUID>/names
此条目在知识共享 署名-相同方式共享 3.0协议下授权使用。

本条目导入、摘录或翻译自wiki.vg中的页面。本Wiki的常规协议不适用于此页面。
本页面的衍生作品必须使用相同或兼容的协议进行授权。