19

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?

  • 5
    Mojang is shifting their infrastructure to allow multiple versions to be easily accessible in the new launcher, so it looks like their URL scheme is changing to support that while leaving the pre-1.6 URLs intact. You might have to parse an update-tracking URL now to find the latest stable release URL. (All just educated guessing until I can get back to my install and look at what the new launcher is doing to pull client updates and see if that translates to server jar URLs.) – SevenSidedDie Jul 8 '13 at 18:30
  • Thanks for the info! I've been doing some poking around on my own, but nothing to show for it yet. I'll let you know if I find anything out. – Seriouslysean Jul 8 '13 at 22:22
30

Full Instructions

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.

Summary


Outdated instructions - for posterity only

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.

3

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:

  • 1
    What's SpiderMonkey required for? – SevenSidedDie Jul 11 '13 at 3:42
  • 1
    jsawk uses SpiderMonkey (js interpreter) - here's more info: github.com/micha/jsawk – Jason Cox Jul 11 '13 at 3:52
  • jsawk looks cool, where can i get this for windows ? – Radon8472 Apr 7 '17 at 8:51
2

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

https://github.com/cptskyhawk/LinuxMinecraftTools

1

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());

        }
    }
  • Unfortunately I'm running my server on a Linux box, but I've decided to approach it with a similar solution. Thanks so much for taking the time to write this up! – Seriouslysean Jul 10 '13 at 2:25
1

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
  • This is the type of script I ended up writing! Thanks for taking the time to add this to my question, it's really useful. – Seriouslysean Aug 20 '13 at 12:02
1

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\":\"\K\d{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.

0

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"
-1

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.