前言
最近,S*网易严厉打压了第三方启动器,包括PCL、BakaXL等,随后又想将一名合法运营的腐竹送了进去,按照如此事态继续发展下去,各位MC国际版(Java版)玩家可能就无法继续使用第三方启动器了。所以,今天就来教大家制作一个命令脚本,来应该将来可能到来的最坏结果。
准备工作
- 一台装有 Windows 系统的电脑(Linux没有试过)
- 官方启动器一枚(官起在网易眼里总算合法了吧,没有正版不要紧)
 下载地址:Download options for Minecraft | Minecraft
- 一双勤劳的双手和一个脑袋
制作步骤
- 使用官方启动器打开你想要游玩的版本 
 首先,打开在准备工作中下载好的安装包,运行安装,打开安装好的启动器。- 接着,我们点击上方第二个 - 配置按钮,来到配置游戏版本的页面。
 点击- 加配置,你会来到这样的一个页面。- 这里我以 - 1.8.9为例,其他版本操作都是一致的。- 然后,我们点击 - 显示更多选项按钮,配置一下- JVM启动参数,当然你也可以不更改。- PS. 这里其实只需要更改 - "JVM参数"中- "-Xmx 1G"一项,具体几G看个人电脑配置,这里不多赘述。- 最后点击右下角绿色按钮 - 保存即可。
- 启动刚刚我们配置好的游戏 - PS. 如果你没有正版账号,可以选择右边的 - 开始试玩按钮。- 然后等待启动项下载相关配置文件后启动。 
- 游戏运行后,打开cmd,获取MC的启动命令。 
 如果你是点击- 开始试玩的话,游戏运行后的是这样的
 不够你先别担心,直接- Win+R打开- cmd,输入下面这串命令(正版启动的也是一样操作)。- 1 - wmic process where caption='javaw.exe' get commandline - 或者输入 - 1 - wmic process where caption='java.exe' get commandline - PS. 命令的生成可能因各种因素而异,不过别担心。 - 使用正版账号的同学就可以直接把生成的命令复制出来, - Win+R调用运行,输入- notepad,粘贴刚刚生成的命令,直接可以看下一步。- 使用Demo(即点击 - 开始试玩的同学)需要注意一下。还是和正版账号玩家一样,先复制一下生成的命令,然后- Win+R调用运行,输入- notepad,将,然后拉到脚本最下面,有一个- --demo,我们把它删去。再稍微向前面看一点,有一个- --uuid xxxxxxxxxxxxxxxxxxxxxxxxx这个就是玩家的UUID,就是玩家的通用唯一识别码,这里建议删去。然后再往前看一点,有一个- --username xxxxxx,这个就是游戏中的名字了,你可以随便改。这三处都修改完成以后,就可以进行下一步了。- 这里补充一下使用 - PowerShell获取启动命令的方法(可跳过,- 给深造者看的):- 1 - echo \$(Get-Process -Name javaw).CommandLine - 或者 - 1 - echo \$(Get-Process -Name java).CommandLine - 把 - echo换成- scb,还能一步到位写进剪切版! 即- 1 - scb \$(Get-Process -Name javaw).CommandLine - 或者 - 1 - scb \$(Get-Process -Name java).CommandLine 
- 另存为启动命令 
 把刚刚整理好的启动命令另存为,按- Ctrl+Shift+S,在弹出的另存为窗口中,- 文件类型选择- 所有文件 (*),然后把文件名改成- MCLauncher1.8.9.cmd(或者别的,但后缀名一定要改成- .cmd或者- .bat)。
 至此,我们就完成了启动脚本的制作!- 深入探究- MCJE微软正版登录流程
前言&大体流程
找了一圈看上去此类详细教程不多,虽然实现门槛不高,但仍作此记录。
这是大体流程 https://wiki.vg/Zh:Microsoft_Authentication_Scheme
那么就让我们开始吧
背景:拆解启动参数
| 1 | "<javaw或java路径>" | 
我省去了大部分用于配置JVM的内容。(因为我也没搞懂全部,以后再说吧)
那么剩下的这个net.minecraft.client.main.Main就是主类了,也就是mc客户端的入口
他也有一点参数,我们细细地看其中决定启动者身份的:
username、uuid、accessToken
有了这三个,玩家就能登入服务器了。
username和uuid极易拿到,mojang是有专门api的。比如那个叫WisW人的uuid就可以通过如下方法获取:
https://api.mojang.com/users/profiles/minecraft/WisW
接下来,让我们来看看accessToken的获取流程
AccessToken的获取
微软OAuth授权
第一步,我们须获得微软的访问令牌。
但是微软的文档( https://learn.microsoft.com/zh-cn/azure/active-directory/develop/v2-oauth2-auth-code-flow )似乎更新了,也就是说文档里面压根就没提到 login.live.com 。这是很神奇的一件事情。所以我们如果完全跟着那个文档走,你会发现在Azure的应用里面找不到登陆Xbox的权限(至少是我)。所以接下来的教程完全是参考 wiki.vg 给的那个例子走的。
所幸,格式大抵相同。首先要请求授权代码。先看例子(此处演示的是OAuth 2.0 授权代码流,也是主流启动器所使用的。设备权限授予流我不会)。这些东西直接复制到浏览器地址栏就好。
| 1 | https://login.live.com/oauth20_authorize.srf | 
先讲讲client id。这个id理论上应该你自己申请,但是我找不到门道,所以使用例子里给的那个(它是他人申请的,用途符合我们需要的要求)。它会验证你接下来的两个参数,如果不符合,就报错。
然后是scope这个参数,它的意思是需要用户同意授权的服务,这应该是微软相关的服务规定的,写XboxLive.signin应该也可以,目前没有找到相关的列表。
redirect_url指的是重定向的网址,在验证通过后,浏览器会重定向到这个网址,并且在后面跟上code(也就是一个授权代码,token)和lc(用途未知,可能是用于验证,但目前可忽略)。重定向后的网址就像这样:
| 1 | https://login.live.com/oauth20_desktop.srf?code=xxxxx..... | 
我们保存这个code(这玩意应该叫授权代码)。正如PCL启动器某个版本的做法:它会打开浏览器,让你登陆;随后让你复制一个url(这就是重定向后的url,是包含token的)。而HMCL的做法大抵是走的硬件权限授予流,所以说它会让你输入一个硬件码以识别。
下一步,我们要获得真正的访问令牌。
| 1 | POST https://login.live.com/oauth20_token.srf | 
大括号内的内容就是POST请求的内容了。(注意!!!必须用双引号,以及英文输入法的冒号,还有记得把那个<>里面的内容替换掉)
那么请求头也就是Headers经我测试应该是可有可无,但是最好加上。
成功请求后返回的格式看起来像这样:
| 1 | { | 
expires in告诉了我们这个令牌最多维持一天。
先记录下access token。refresh token是用于重新申请的。重新申请会在本文末尾提到。
恭喜你!完成了第一步!
xbox live授权
接下来,我们要登陆xbox。
接下来的路程有一点困难。这帮子api如果请求错误,那就直接一个400给你,没有原因。所以你得好好地看这些内容。请求如下:
| 1 | POST https://user.auth.xboxlive.com/user/authenticate | 
那么如果它跟你说400,你最好检查一下你的请求。我踩的坑就是把所有的双引号错误地变成了单引号。
如果请求正确,那么返回格式看起来像这样:
| 1 | { | 
可得注意了,”xui”后面跟的是个列表,并且列表里面只有一项,里面是个json。
这里需要记录的东西多一点,我们不仅需要token,还需要那个”uhs”(也就是user hash code)。
xsts授权
好了,接下来依然和xbox打交道:
| 1 | POST https://xsts.auth.xboxlive.com/xsts/authorize | 
正确响应:
| 1 | { | 
同样,记录token。这里的uhs应该和上一步的uhs一样。
Mojang授权
终于和mojang打交道了!
| 1 | POST https://api.minecraftservices.com/authentication/login_with_xbox | 
再次注意:这里的identityToken得把uhs和token合起来!
正确响应:
| 1 | { | 
这个会一天后失效。事情到这里已经完毕了,响应中的access token就是开头启动参数中的那个。接下来我们会通过这个参数获得玩家的uuid、id和皮肤。
获取皮肤
| 1 | GET https://api.minecraftservices.com/minecraft/profile | 
可得注意了,这是GET请求,我们的token放在包头里边。记得Bearer后面有个空格,之后再跟着我们的token。响应留给各位去试吧,里面有id(也就是uuid)和name。
RefreshToken再利用
因为access_token有效期一天,于是我们要用refresh token来重新申请:
| 1 | POST https://login.live.com/oauth20_token.srf | 
响应和上文请求访问令牌返回的一样:
| 1 | { | 
于是你得再走一遍流程。当然,记得把老的refresh_token替换成新的(也就是响应里面的那个)。















