UID 187755 性别 保密 经验 EP 铁粒 粒 回帖 0 主题 精华 在线时间 小时 注册时间 2021-12-4 最后登录 1970-1-1
本帖最后由 剩哲伪旺 于 2023-12-28 09:33 编辑
大家好,这里是剩哲伪旺。众所周知,游戏资讯是个很神奇的板块,在里面云集了许多的英文高手与翻译专家。
那么,在里面的人到底是怎么在第一时间获取到最新的新闻资讯的呢?其中有一个途径是“Twitter”,还有一个途径就是minecraft.net官网了。然后还有最后一个途径,那就是小可机器人。但是想必也有挺多人没听说过小可机器人的。
在Twitter里,我们倒是没有任何一点的API供我们调用,因此我们只能获取到最新的官网放送的API了!
那么这些API的地址是什么呢?
我们来看看这一副图:
这个是官网的图片,截取自【2023.12.26-17:10】
那么官网是怎么获取到新闻的呢?当然是有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. 复制代码
我们很容易看见,官网上获取到的API里面其实是有一个pageSize这么一个参数的。那么这个参数具体有什么用处呢?我们通过这个参数,可以很轻松的达到【换页】效果。这个pageSize其实是该json的新闻列表里能容纳最大的新闻数量,我们需要搭配另外一个参数offset偏移来达到换页效果。具体如何偏移其实在curseforge、modrinth等的API文档里有介绍。比如我offset设置为3,pageSize设置为50,那么官网新闻就是第【2~52】的新闻。如果offset设为50,pageSize设为50,那么官网新闻就是第【50~100】个新闻。
在上述信息,我们仅仅只是获取了官网的title,也就是说这只能作为一个提醒专用。如果我们需要直接获取java、bedrock、legends、dungeons的新闻资讯,我们只需要解析它的body方法即可。如果我们需要获取启动器新闻资讯,我们可以选择获取它的readMoreLink代码块。
如果我们需要直接获取官网的新闻的话,我们可以获取它的article_url,随后在前面加个www.minecraft.net 即可直接进入官网新闻了。
部分Java版、基岩版、地下城、传奇新闻资讯可能不在官网里面,需要进入feedback官网,因此如果各位获取到了最新的新闻之后,可以立刻进入feedback官网获取更新日志。当然也可以直接获取body来进行翻译。
当然啦,各位既然已经有了每个新闻API,自然可以自己手动敲代码获取最新的新闻了。其实完全没必要来看我的代码的,各位可以自行尝试噢!
评分
查看全部评分