剩哲伪旺
本帖最后由 剩哲伪旺 于 2023-9-16 19:34 编辑

大家好,这里是剩哲伪旺。众所周知,幻翼块讯是个很神奇的板块,在里面云集了许多的英文高手与翻译专家。
那么,在里面的人到底是怎么在第一时间获取到最新的新闻资讯的呢?其中有一个途径是“Twitter”,还有一个途径就是minecraft.net官网了。
在Twitter里,我们倒是没有任何一点的API供我们调用,因此我们只能获取到最新的官网放送的API了!

那么这些API的地址是什么呢?

我们来看看这一副图:










这个是官网的图片,截取自【2023.9.16-18:48】
那么官网是怎么获取到新闻的呢?当然是有API的!我们直接来看API吧:
官网获取新闻API

这个API是官网的新闻API。点击后会传到一个网络JSON文件。

我们会发现,在里面似乎缺失了某些个版本更新新闻,比如说Pre2。

但是我们会发现,在官方启动器里面的新闻是完整的,为什么会这样呢?










通过某些Debug与我找人宣传的技术,我们可以得到启动器获取某些新闻的API是这样的:
Java版新闻资讯

基岩版新闻资讯

地下城新闻资讯

传奇新闻资讯

进入几个新闻资讯,可以被传到一个JSON文件,里面存放的就是每个新闻的具体API,甚至连网站的HTML代码都给你了。

然后嘛,还有一个地方,就是启动器最左边有一个【新闻】按钮。就是这里:










这个官网的API是这样的:
启动器新闻资讯


我们可以注意到这个官网API中有一个launchercontent作为网站的头,我们可以看到这个是专属于启动器能够获取到的。而上面的官网API与它的JSON结构则完全不一样。

既然如此,我们应该如何获取到这些新闻资讯呢?
我们可以通过代码实现。用代码的方式,每隔一段时间获取一次官网新闻,随后就可以获取到最新版的新闻了!

下面我将用Delphi的代码为各位实现一次API功能:
在这段代码中,我将会每一句话都为各位写好注释,以便各位能够理解每一行代码的内容。在bbs中的code代码块可能不会自动换行,各位可以自行复制到记事本里进行查看。

begin  //Delphi代码起始语句,在Delphi中,大括号是注释,而begin end充当大括号的功能。
  try //设置一个try-except
    var ju := ''; //先设置一个全局变量。
    if ParamStr(1) = '' then //获取该软件的第一个参数。如果第一个参数为空,则默认获取的是【Java版官方资讯】。
      ju := Concat('https://launchercontent.mojang.com/javaPatchNotes.json') //这里是Java官方版本资讯的网址获取。Concat的意思是字符串拼接。
    else if Paramstr(1) = 'official' then //这里获取到的是第一个参数是否为official,如果是official,则默认获取的是MC官网的资讯。
      ju := 'https://www.minecraft.net/content/minecraft-net/_jcr_content.articles.grid?tileselection=auto&pageSize=1&tagsPath=minecraft:stockholm/minecraft' //MC官网的资讯。
    else if ParamStr(1) = 'news' then //如果是news,则默认获取的是启动器新闻资讯。
      ju := Concat('https://launchercontent.mojang.com/', paramstr(1), '.json') //这里拼接启动器新闻资讯。
    else
      ju := Concat('https://launchercontent.mojang.com/', paramstr(1), 'PatchNotes.json'); //如果以上都不是,则默认填入的是java、bedrock、legends、dungeons四个代码块。我们可以根据这几个来填入java、bedrock、legends、dungeons。
    writeln(Concat('GET ', ju)); //我们可以输出一段话,这段话将输出我们需要Get的网址。
    while true do begin  //随后,我们来一个无限循环。
      var patch := GetWeb(ju);  //我们通过一个获取网络文本的代码,这个代码在你们使用的编程语言一定会有!
      var json := TJSONObject.ParseJSONValue(patch) as TJSONObject; //随后,我们使用JSON解析这个官网,并将其解析成JSON对象。
      if ju.Contains('launchercontent') then begin  //如果你获取的网站中有launchercontent,那就直接
        var entries := json.GetValue('entries') as TJSONArray;  //这里获取到里面的entires代码块,并将其转成JSON列表。
        var title := (entries[0] as TJSONObject).GetValue('title').Value;  我们这里获取到JSON列表中的第0号元素,然后再将其转成JSON对象,随后再获取里面的title代码的值。
        writeln(title);  //随后输出title即可!
      end else begin  //然后我们来个else代码块,这个是专门用来获取官网新闻资讯的API的。
        var artical := json.GetValue('article_grid') as TJSONArray;  //我们获取里面的article_grid。并将其转换成JSON列表。
        var title := ((artical[0] as TJSONObject).GetValue('default_tile') as TJSONObject).GetValue('title').Value;  //随后,我们一直往下解析,随后解析到里面的title代码块。
        writeln(title);  //我们直接输出title即可。
      end;
      try  //这个是获取它的第2个参数的地方。我们在此处将其变成int类型,随后乘以1000,获取秒数。也就是隔多久获取一次官网API。
        TThread.Sleep(strtoint(ParamStr(2)) * 1000);
      except  //如果无法解析成数字,则默认间隔1个小时获取一次新闻。
        TThread.Sleep(3600000);
      end;
    end;
  except
    on E: Exception do  //这里是,如果总的代码块出现错误,则默认输入它的错误信息。
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

复制代码
上述信息,我们仅仅只是获取了官网的title,也就是说这只能作为一个提醒专用。如果我们需要直接获取java、bedrock、legends、dungeons的新闻资讯,我们只需要解析它的body方法即可。如果我们需要获取启动器新闻资讯,我们可以选择获取它的readMoreLink代码块。

如果我们需要直接获取官网的新闻的话,我们可以获取它的article_url,随后在前面加个www.minecraft.net即可直接进入官网新闻了。

部分Java版、基岩版、地下城、传奇新闻资讯可能不在官网里面,需要进入feedback官网,因此如果各位获取到了最新的新闻之后,可以立刻进入feedback官网获取更新日志。当然也可以直接获取body来进行翻译。
当然啦,各位既然已经有了每个新闻API,自然可以自己手动敲代码获取最新的新闻了。其实完全没必要来看我的代码的,各位可以自行尝试噢!

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