Frequently Asked Questions

Why doesn’t BedrockServer have an async lookup() method?

With Java servers, to find the server, we sometimes end up performing an SRV DNS lookup. This means making a request to your DNS server and waiting for an answer, making that lookup a blocking operation (during which other things can be done).

Note

An SRV record allows the server to have an address like: hypixel.net, that points to a some specified IP/Host and port, depending on this record.

That way, even if the server is hosted on a non-standard port (other than 25565, say 8855), you won’t need to use myserver.com:8855, since the port number will simply be stored in the SRV record, so people can still connect simply with myserver.com.

On top of that, it also allows to specify a different IP/Host, which means you don’t need to use the same server to run both the website, and the minecraft server. Instead, the SRV record can simply point to a different IP/Host address (like mc.hypixel.net, or 209.222.114.112).

However with Bedrock servers, no such lookups are required (Bedrock doesn’t support SRV records), and so there is no blocking I/O operation being made, that would justify having an async version.

In fact, all that the bedrock lookup does is parsing the host:port address, and obtaining the host and port parts out of it (with some error handling, and support for default ports).

Incorrect encoding

In Query protocol, Minecraft uses ISO 8859-1 for encoding all text (like MOTD, server name, etc.). This can cause problems with non-latin characters. To fix such error, you can re-encode text into UTF-8.

>>> query = JavaServer.lookup("my-server-ip.com").query()
>>> query.motd.to_minecraft()
'Ð\x9fÑ\x80ивÑ\x96Ñ\x82!'
>>> query.motd.to_minecraft().encode("iso-8859-1").decode("utf-8")
'Привіт!'

query.motd here can be anything, that contains incorrect encoding.

How to get server image?

On Bedrock, only official servers have a server image. There is no way to get or set an icon to a custom server. For Java servers, you can use status.icon attribute. It will return Base64 encoded PNG image. If you wish to save this image into a file, this is how:

import base64
from mcstatus import JavaServer

server = JavaServer.lookup("hypixel.net")
status = server.status()

decoded_icon = base64.b64decode(status.icon.removeprefix("data:image/png;base64,"))
with open("server-icon.png", "wb") as f:
    f.write(decoded_icon)

Note

Most modern browsers support simply pasting the raw Base64 image into the URL bar, which will open it as an image preview, allowing you to take a quick look at it without having to use file saving from Python.

See How to display Base64 image and Base64 Images: Support table.