TransWikia.com

Is there a way to get the latest server jar through a URL that doesn't change?

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?

12 Answers

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.

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

https://github.com/cptskyhawk/LinuxMinecraftTools

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:

  • download the manifest versions file
  • extract the url of the latest manifest
  • download the latest manifest
  • extract the url of the server jar
  • download the server.jar to minecraft_server.$version.jar
  • symbolically link 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:

  • avoid dependancies
  • keep it simple

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)
  1. Gets the newest version from mojang manifest
  2. Gets the version data from that request
  3. Gets the server download url from that request
  4. Writes to file called "minecraft_server.jar"

Answered by Foster on December 29, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP