Arqade Asked by Seriouslysean on December 29, 2020
I’m writing a bash script to manage a vanilla server install on my eeePC. Right now I’ve been using http://s3.amazonaws.com/MinecraftDownload/launcher/minecraft_server.jar
to get the minecraft_server jar. It seems to only be getting the 1.5.2 server version instead of the 1.6.2 server version.
Any ideas as to how I can grab the latest stable version through a similar url?
I recently decompiled the launcher for this very reason, to manage automatic updates for my server wrapper with their new naming convention.
I found the file they use to work out what the current version is and the URL to it:
https://launchermeta.mojang.com/mc/game/version_manifest.json
This file includes the following (as of this answer):
"latest": {
"snapshot": "1.9-pre3",
"release": "1.8.9"
},
"versions": [
{
"id": "1.13.1",
"type": "release",
"url": "https://launchermeta.mojang.com/v1/packages/c0f1e6239a16681ffbfa68fc469038643304d5a9/1.13.1.json",
"time": "2018-08-30T09:49:34+00:00",
"releaseTime": "2018-08-22T14:03:42+00:00"
},
...
]
That file also has a "versions" array. Loop through this to find the version you are looking for in the id
field. It is also usually the first entry in this array, so you could address it versions[0]
. Grab the url
value and fetch that file which contains the following useful key:
"downloads": {
"client": {
"sha1": "8de235e5ec3a7fce168056ea395d21cbdec18d7c",
"size": 16088559,
"url": "https://launcher.mojang.com/v1/objects/8de235e5ec3a7fce168056ea395d21cbdec18d7c/client.jar"
},
"server": {
"sha1": "fe123682e9cb30031eae351764f653500b7396c9",
"size": 33832589,
"url": "https://launcher.mojang.com/v1/objects/fe123682e9cb30031eae351764f653500b7396c9/server.jar"
}
},
Therefore, the URL you need is contained in downloads.server.url
.
GET
https://launchermeta.mojang.com/mc/game/version_manifest.jsonGET
versions[0].url
GET
downloads.server.url
Which you can then use to extrapolate the latest version for release and snapshots using this scheme:
https://s3.amazonaws.com/Minecraft.Download/versions/" + Ver + "/minecraft_server." + Ver + ".jar
Using this method you don't need to download the jar/exe file every time, just the json file and then if it's changed, you can grab the appropriate jar.
Correct answer by Richard Benson on December 29, 2020
I have a server setup which updates every night with a webget.exe command earlier on. The change got me to make a program that scrapes the download page after a *server.exe and downloads it as minecraft_server.exe.
I have modified it to take in a param "jar" so it gets *server.jar instead and downloads it as minecraft_server.jar.
The zipped exe is here: http://halsvik.net/downloads/GetLatestMinecraftServer.zip
If you download the program, run it without any params: GetLatestMinecraftServer.exe
If you want the jar server file instead use: GetLatestMinecraftServer.exe jar
Source code is this:
static void Main(string[] args)
{
try
{
var ext = ".exe";
if (args.Length > 0)
{
ext = "." + args[0];
}
var wc = new System.Net.WebClient();
var url = "http://minecraft.net/download";
var data = wc.DownloadData(url);
var page = Encoding.UTF8.GetString(data);
var links = Misc.GetStringsBetween(page, "<a href="", """); //Custom method to get matches
bool match = false;
foreach (var item in links)
{
if (item.ToLower().Contains("server") && item.ToLower().Contains(ext))
{
var filename = "minecraft_server" +ext;
var fn = Path.GetFullPath(filename);
while (File.Exists(filename + ".old")) File.Delete(filename + ".old");
if (File.Exists(fn)) File.Move(fn, fn + ".old");
try
{
var comp = false;
wc.DownloadProgressChanged += (o, e) =>
{
Console.Write("#"); //Indicate something is downloading
};
wc.DownloadFileCompleted += (o, e) =>
{
comp = true;
};
wc.DownloadFileAsync(new Uri(item), filename);
//Wait for download to complete
while (!comp)
{
Console.Write("."); //Indicate time is going
Thread.Sleep(1000);
}
}
catch (Exception ex)
{
Console.WriteLine("Download of " + item + " failed. " +ex.Message);
return;
}
Console.WriteLine("Download OK");
match = true;
break;
}
}
if (!match)
{
Console.WriteLine("Could not find minecraft server on http://minecraft.net/download");
}
}
catch (Exception ex)
{
Console.WriteLine("Something failed. " + ex.ToString());
}
}
Answered by Wolf5 on December 29, 2020
You can use jsawk
to pull the latest jar version number from the Minecraft version JSON:
#!/bin/bash
VER=`curl -s https://launchermeta.mojang.com/mc/game/version_manifest.json | jsawk -n 'out(this.latest.release)'`
wget https://s3.amazonaws.com/Minecraft.Download/versions/$VER/minecraft_server.$VER.jar
Requires:
Answered by Jason Cox on December 29, 2020
here's my horrible sed version.
less correct than Jason's version, above. but fewer dependencies.
#!/bin/bash
wget -qN https://launchermeta.mojang.com/mc/game/version_manifest.json
MCVER=`sed -n -e '/"latest"/,/}/ s/.*"snapshot": "([^"]*)".*/1/p' < version_manifest.json`
wget -N https://s3.amazonaws.com/Minecraft.Download/versions/$MCVER/minecraft_server.$MCVER.jar
Answered by Spongman on December 29, 2020
I'll even throw my hat into the ring! Very similar to up above, with a few extras.
#!/bin/bash
tmpfile=/tmp/minecrafttempfile.tmp
downloadurl="https://minecraft.net/download"
serverurl=""
loc=$([[ -n $1 ]] && echo $1 || echo "/tmp/minecraft_server.jar")
if [[ -a $loc ]]; then
echo "$loc exists -- moving to ${loc}.old"
mv $loc ${loc}.old
fi
echo "Grabbing minecraft download page..."
curl $downloadurl > $tmpfile
echo "Getting download URL for minecraft server..."
serverurl=`egrep -io 'https.*versions/(.*)/minecraft_server.1.jar' $tmpfile`
echo "URL = "$serverurl
echo "Downloading server jar..."
wget -q -O $loc $serverurl
Answered by cptskyhawk on December 29, 2020
Took the brilliant answer from Richard Benson and ran wild. https://github.com/sc-perth/BashScripts/blob/master/minecraft_updater.sh Tested working on my DigitalOcean Ubuntu 16.04 instance. Thanks Richard!
Script will, by default, check to see if you are running the latest version, and let you know. It will also download it if you specify the -d|--download argument. It will also install the update, if you modify the script to fit your environment & enable this feature. It will also do the same thing for any version you specify, after validating the version. Does not work for snapshots, only for releases.
DEPENDENCIES:jq, wget These might need installed, the rest you probably have.
bash, (e)grep, basename, dirname, chown, chmod, tar w/ gzip, find, printf
Answered by Perth on December 29, 2020
For those looking at this, I've also found a way using grep
instead of sed to pull out the version using the following:
grep -oP ""release":"Kd{1,2}.d{1,2}.d{1,2}" version_manifest.json
The file is pulled from the examples above.
https://launchermeta.mojang.com/mc/game/version_manifest.json
Personally I found the using the above grep command a tad bit cleaner.
Answered by Zuntaruk on December 29, 2020
This is my stab at it.
#!/bin/bash
#Clean up old files
rm /minecraft/temp/*
# Get the version_manifest file from Mojang
wget -P /minecraft/temp https://launchermeta.mojang.com/mc/game/version_manifest.json
#Parse the version and version.json files into variables
URL=$(jq -r '.versions[0].url' /minecraft/temp/version_manifest.json)
VER=$(jq -r '.versions[0].id' /minecraft/temp/version_manifest.json)
#Get the version specific json file to parse
wget -P /minecraft/temp "$URL"
#Add .json on the end of the version to use to parse the json file
VER2="$VER.json"
#Parse the version.json file to get server download url
SERVERURL=$(jq -r '.downloads.server.url' /minecraft/temp/$VER2)
#Download the server.jar file
wget -P /minecraft/temp $SERVERURL
#Backup the old minecraft_server.jar file
mv /minecraft/minecraft_server.jar /minecraft/minecraft_server.jar.old
#Move the downloaded server file to the minecraft_server.jar file in minecraft directory
mv /minecraft/temp/server.jar /minecraft/minecraft_server.jar
echo "Minecraft Upgraded to version $VER"
Answered by Louhbo on December 29, 2020
The following bash script uses jq & curl to:
minecraft_server.$version.jar
server.jar
to minecraft_server.$version.jar
Use it in combination with a minecraft start script that uses the server.jar
symbolic link.
#!/usr/bin/env bash
#
set -o errexit
declare -r version_manifest_url="
https://launchermeta.mojang.com/mc/game/version_manifest.json"
declare -r tmp="/tmp/version_manifest.json"
# Find download URL of latest release.
latest_version=$(curl -Ss -o "$tmp" "$version_manifest_url"
&& jq .latest.release -r "$tmp")
latest_manifest_url=$(cat "$tmp" | jq -r ".versions[]
| select(contains({type: "release", id: "$latest_version"}))
| .url")
# Only download latest version if target filename does not exist.
declare -r manifest="/tmp/manifest.$latest_version.json"
curl -Ss -o "$manifest" "$latest_manifest_url"
declare -r jar_url=$(jq -r ".downloads.server.url" "$manifest")
echo "latest version: $latest_version"
echo "manifest url: $latest_manifest_url"
echo "download url: $jar_url"
declare -r jar="minecraft_server.$latest_version.jar"
curl -Ss -o "$jar" "$jar_url"
# Symbolically server.jar link to the latest version.
declare -r symlink="server.jar"
rm -f "$symlink"
ln -s "$jar" "$symlink"
Answered by jones77 on December 29, 2020
My 50ct to this old thread. My objective:
My 3 lines to download the latest snapshot:
#!/bin/bash
MC_VERSION_URLS=$(curl -s https://launchermeta.mojang.com/mc/game/version_manifest.json | python -c 'import json,sys,base64;obj=json.load(sys.stdin); print obj["versions"][0]["url"]')
MC_LATEST_SNAPSHOT=$(curl -s $MC_VERSION_URLS | python -c 'import json,sys,base64;obj=json.load(sys.stdin); print obj["downloads"]["server"]["url"]')
wget $MC_LATEST_SNAPSHOT
Answered by Vincent Le Dû on December 29, 2020
This works for bedrock, modify for Java Ed:
url=$(curl https://www.minecraft.net/en-us/download/server/bedrock/ | grep "linux/bedrock-server-" | egrep -o 'https?://[^" ]+')
echo $url
It will output the url to the latest version.
Answered by Michael Reilly on December 29, 2020
Here is a simple, lightweight way to get it in two lines of python:
from requests import get
open("minecraft_server.jar", "wb").write(get(get(get("https://launchermeta.mojang.com/mc/game/version_manifest.json").json()["versions"][0]["url"]).json()["downloads"]["server"]["url"]).content)
Answered by Foster on December 29, 2020
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP