5

我有一个 Java 应用程序,它需要能够为 Minecraft-Bedrock 版获取用户输入的玩家代号,并将其转换为给定帐户的 XUID,以便我可以将其存储起来以供以后加入白名单和参考之用。

我一直在浏览 Microsoft REST API 文档,寻找一种可以让我这样做的方法,但我能找到的最接近的是:

https://docs.microsoft.com/en-us/gaming/xbox-live/xbox-live-rest/uri/profilev2/uri-usersbatchprofilesettingspost

它仍然需要 XUID 作为输入而不是提供它作为输出。

有什么方法可以将玩家代号的给定字符串输入转换为关联帐户的 XUID,或者如果 Java 应用程序不存在此类帐户,则为 null?

4

1 回答 1

4

我已经用纯粹的、自包含的bash+curl+sed.

它受到来自Team OpenXboxXbox-Webapi模块的剽窃/压缩的极大启发您可能应该只使用它来代替*. 他们的 API 非常好,涵盖了如此多的奥秘,以至于微软……根本无法记录;如果它的核心功能依赖于 Microsoft 的 Xbox Live API,那么值得强烈考虑将您的项目切换到 Python 仅用于这个库。xbox.webapi.authentication.manager

简而言之,要使用此 API,您似乎必须:

  1. 在 Azure 中注册应用程序

    • 如果您的应用程序可以绑定到localhost:8080将要授权该应用程序的用户的系统上,或者您有他们的合作(特别是:他们能够code从浏览器中的 URL 将参数粘贴到程序中),你可以跳过这一步,使用client_id=0000000048093EE3,完全省略client_secret。(在这种情况下,甚至不需要 Azure 帐户。)
  2. 任何** Xbox Live 用户通过 OAuth2 向您的应用程序提供范围Xboxlive.signin和范围Xboxlive.offline_access

  3. 使用此授权和 Bearer 令牌从https://user.auth.xboxlive.com/user/authenticate

  4. 使用该令牌对自己进行身份验证https://xsts.auth.xboxlive.com/xsts/authorize以获得“ XToken

  5. 使用该令牌对https://profile.xboxlive.com您感兴趣的实际端点进行身份验证,例如/users/gt({gamertag})/profile/settings(其中包含 XUID,作为十进制字符串,在属性中"id"

(**显然,如果您要访问特权端点,例如查看私人信息或修改用户帐户设置的端点,您将对您需要谁的授权以及您必须请求的范围有额外的要求;但是,对于gamertag-to-XUID 查找的一般情况,任何用户只需登录即可。)


*为此,它会是这样的:

from asyncio import run as arun
from sys import argv
from os import path, environ
import subprocess
from aiohttp import ClientSession
from xbox.webapi.api.client import XboxLiveClient
from xbox.webapi.authentication.manager import AuthenticationManager
from xbox.webapi.authentication.models import OAuth2TokenResponse

async def gamertags_to_xuids(gamertags, client_id=environ["client_id"], client_secret=environ["client_secret"], token_jar=path.join(environ["HOME"], ".local", "share", "xbox", "tokens.json")):
  assert len(gamertags) >= 1
  global session
  auth_mgr = AuthenticationManager(session, client_id, client_secret, "")
  await freshen_tokens(auth_mgr, token_jar)
  xbl_client = XboxLiveClient(auth_mgr)

  ids = []
  for gamertag in gamertags:
    profile = await xbl_client.profile.get_profile_by_gamertag(gamertag)
    ids.append(int(profile.profile_users[0].id))
  xuids = [f"{id:016X}" for id in ids]

  return xuids

async def freshen_tokens(auth_mgr, token_jar):
  with open(token_jar, "r+") as f:
    auth_mgr.oauth = OAuth2TokenResponse.parse_raw(f.read())
    await auth_mgr.refresh_tokens()
    f.seek(0)
    f.truncate()
    f.write(auth_mgr.oauth.json())

async def amain(args):
  global session
  subprocess.run(["xbox-authenticate"], check=True)#TODO: avoid this system call
  async with ClientSession() as session:
    return await gamertags_to_xuids(args)

def main(args=argv[1:]):
  return arun(amain(args))

if __name__ == '__main__':
  for xuid in main():
    print(xuid)
于 2021-01-12T22:48:35.927 回答