game_servers

Master Server Query Protocol

This module implements the legacy Steam master server protocol.

https://developer.valvesoftware.com/wiki/Master_Server_Query_Protocol

Nowadays games query servers through Steam. See steam.client.builtins.gameservers

Filters

Note

Multiple filters can be joined to together (Eg. \appid\730\white\1\empty\1)

Filter code What it does
\nor\[x] A special filter, specifies that servers matching any of the following [x] conditions should not be returned
\nand\[x] A special filter, specifies that servers matching all of the following [x] conditions should not be returned
\dedicated\1 Servers running dedicated
\secure\1 Servers using anti-cheat technology (VAC, but potentially others as well)
\gamedir\[mod] Servers running the specified modification (ex. cstrike)
\map\[map] Servers running the specified map (ex. cs_italy)
\linux\1 Servers running on a Linux platform
\password\0 Servers that are not password protected
\empty\1 Servers that are not empty
\full\1 Servers that are not full
\proxy\1 Servers that are spectator proxies
\appid\[appid] Servers that are running game [appid]
\napp\[appid] Servers that are NOT running game [appid] (This was introduced to block Left 4 Dead games from the Steam Server Browser)
\noplayers\1 Servers that are empty
\white\1 Servers that are whitelisted
\gametype\[tag,…] Servers with all of the given tag(s) in sv_tags
\gamedata\[tag,…] Servers with all of the given tag(s) in their ‘hidden’ tags (L4D2)
\gamedataor\[tag,…] Servers with any of the given tag(s) in their ‘hidden’ tags (L4D2)
\name_match\[hostname] Servers with their hostname matching [hostname] (can use * as a wildcard)
\version_match\[version] Servers running version [version] (can use * as a wildcard)
\collapse_addr_hash\1 Return only one server for each unique IP address matched
\gameaddr\[ip] Return only servers on the specified IP address (port supported and optional)

Examples

Query HL Master

>>> for server_addr in gs.query_master(r'\appid\730\white\1', max_servers=3):
...     print(server_addr)
...
('146.66.152.197', 27073)
('146.66.153.124', 27057)
('146.66.152.56', 27053)

Team Fortress 2 (Source)

>>> from steam import game_servers as gs
>>> server_addr = next(gs.query_master(r'\appid\40\empty\1\secure\1'))  # single TF2 Server
>>> gs.a2s_ping(server_addr)
68.60899925231934
>>> gs.a2s_info(server_addr)
{'_ping': 74.61714744567871,
 '_type': 'source',
 'app_id': 40,
 'bots': 0,
 'environment': 'l',
 'folder': u'dmc',
 'game': u'DMC\t\t\t\t\t\t\t\t1',
 'map': u'crossfire',
 'max_players': 32,
 'name': u'\t\t\u2605\t\t All Guns party \u2605\t \tCrossfire 24/7\t\t',
 'players': 21,
 'protocol': 48,
 'server_type': 'd',
 'vac': 1,
 'visibility': 0}
>>> gs.a2s_players(server_addr)
[{'duration': 192.3097381591797, 'index': 0, 'name': '(2)Player', 'score': 4},
 {'duration': 131.6618194580078, 'index': 1, 'name': 'BOLT', 'score': 2},
 {'duration': 16.548809051513672, 'index': 2, 'name': 'Alpha', 'score': 0},
 {'duration': 1083.1539306640625, 'index': 3, 'name': 'Player', 'score': 29},
 {'duration': 446.7716064453125, 'index': 4, 'name': '(1)Player', 'score': 11},
 {'duration': 790.9588012695312, 'index': 5, 'name': 'ИВАНГАЙ', 'score': 11}]
>>> gs.a2s_rules(server_addr)
{'amx_client_languages': 1,
 'amx_nextmap': 'crossfire',
 'amx_timeleft': '00:00',
 'amxmodx_version': '1.8.2',
 ....

Ricohet (GoldSrc)

>>> from steam import game_servers as gs
>>> server_addr = next(gs.query_master(r'\appid\60'))  # get a single ip from hl2 master
>>> gs.a2s_info(server_addr, force_goldsrc=True)       # only accept goldsrc response
{'_ping': 26.59320831298828,
 '_type': 'goldsrc',
 'address': '127.0.0.1:27050',
 'bots': 0,
 'ddl': 0,
 'download_link': '',
 'environment': 'w',
 'folder': 'ricochet',
 'game': 'Ricochet',
 'link': '',
 'map': 'rc_deathmatch2',
 'max_players': 32,
 'mod': 1,
 'name': 'Anitalink.com Ricochet',
 'players': 1,
 'protocol': 47,
 'server_type': 'd',
 'size': 0,
 'type': 1,
 'vac': 1,
 'version': 1,
 'visibility': 0}

API

steam.game_servers.query_master(filter_text='\\nappid\\500', max_servers=20, region=<MSRegion.World: 255>, master=('hl2master.steampowered.com', 27011), timeout=2)

Generator that returns (IP,port) pairs of servers

Warning

Valve’s master servers seem to be heavily rate limited. Queries that return a large numbers IPs will timeout before returning everything. There is no way to resume the query. Use SteamClient to access game servers in a reliable way.

Note

When specifying filter_text use raw strings otherwise python won’t treat backslashes as literal characters (e.g. query(r'\appid\730\white\1'))

Parameters:
  • filter_text (str) – filter for servers
  • region (MSRegion) – (optional) region code
  • master ((str, int)) – (optional) master server to query
Raises:

RuntimeError, socket.timeout

Returns:

a generator yielding (ip, port) pairs

Return type:

generator

steam.game_servers.a2s_info(server_addr, timeout=2, force_goldsrc=False)

Get information from a server

Note

All GoldSrc games have been updated to reply in Source format. GoldSrc format is essentially DEPRECATED. By default the function will prefer to return Source format, and will automatically fallback to GoldSrc if available.

Parameters:
  • server_addr (tuple) – (ip, port) for the server
  • force_goldsrc (bool) – (optional) only accept GoldSrc response format
  • timeout (float) – (optional) timeout in seconds
Raises:

RuntimeError, socket.timeout

Returns:

a dict with information or None on timeout

Return type:

dict

steam.game_servers.a2s_players(server_addr, timeout=2, challenge=0)

Get list of players and their info

Parameters:
  • server_addr (tuple) – (ip, port) for the server
  • timeout (float) – (optional) timeout in seconds
  • challenge (int) – (optional) challenge number
Raises:

RuntimeError, socket.timeout

Returns:

a list of players

Return type:

list

steam.game_servers.a2s_rules(server_addr, timeout=2, challenge=0)

Get rules from server

Parameters:
  • server_addr (tuple) – (ip, port) for the server
  • timeout (float) – (optional) timeout in seconds
  • challenge (int) – (optional) challenge number
Raises:

RuntimeError, socket.timeout

Returns:

a list of rules

Return type:

list

steam.game_servers.a2s_ping(server_addr, timeout=2)

Ping a server

Warning

This method for pinging is considered deprecated and may not work on certian servers. Use a2s_info() instead.

Parameters:
  • server_addr (tuple) – (ip, port) for the server
  • timeout (float) – (optional) timeout in seconds
Raises:

RuntimeError, socket.timeout

Returns:

ping response in milliseconds or None for timeout

Return type:

float