{
  "id": 14288218,
  "title": "Sending a NuVotifier vote with nothing but the Python standard library",
  "url": "https://urgent.news/2026/10/13/sending-a-nuvotifier-vote-with-nothing-but-the-python-standard-library",
  "topic": "tech",
  "section": "Tech",
  "published": "2026-10-13T20:34:30.000Z",
  "source": {
    "name": "Dev.to",
    "slug": "dev-to",
    "url": "https://dev.to/bestmcserverlist/sending-a-nuvotifier-vote-with-nothing-but-the-python-standard-library-931"
  },
  "original_language": "en",
  "account": "Minecraft server lists reward players for voting by sending a small message to the game server. The protocol behind this is Votifier, today mostly in its fork NuVotifier. To test if your Votifier is reachable and your token is correct, a tiny test client was written using only Python's standard library.\n\nWhen opening a TCP connection to the Votifier port (default 8192), the server speaks first with the greeting \"VOTIFIER 2\" followed by a challenge, which ties the vote to this connection to prevent replay attacks. The test client reads this greeting and prepares the signed message. This message is a JSON object containing the service name, username, IP address, timestamp, and challenge, serialized and then signed with HMAC-SHA256 using the server's token.\n\nThe message is framed with two big-endian 16-bit integers: the magic number 0x733A and the length of the message. This packet is sent to the server. The server responds with a JSON line indicating either \"ok\" or \"error\" with a specific cause and error message. The error message is crucial for a test tool to show, as it helps identify common setup mistakes, such as using the wrong token.",
  "summary": "Minecraft server lists reward players for voting: the list sends a small message to the game server, and a plugin like VotingPlugin hands out the reward. The protocol behind this is Votifier , today mostly in its fork NuVotifier . If you run a server, the most common question is \"is my Votifier actually reachable, and is my token right?\". So we wrote a tiny test client, and it turned out to be a…",
  "key_points": [],
  "editors_take": null,
  "illustration": null,
  "coverage": {
    "outlets": 1,
    "also_reported_by": []
  },
  "ai_generated": true,
  "disclaimer": "Summaries, key points and the editor’s take are written by software from other outlets’ reporting and may contain errors — always check the linked original."
}