Last active 1486541279

A script to log into Steam and list game servers

gameservers.py Raw
1#!/usr/bin/env python
2from __future__ import print_function
3import sys
4
5try:
6 import requests
7 from bs4 import BeautifulSoup as Soup
8 from Crypto.PublicKey import RSA
9 from Crypto.Cipher import PKCS1_v1_5
10 import yaml
11except ImportError:
12 print("Please run \"pip install requests beautifulsoup4 pycrypto pyyaml\"", file=sys.stderr)
13 sys.exit(1)
14
15import time
16import json
17import base64
18import os
19
20H = {"User-Agent": "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)"}
21session = requests.Session()
22session.headers.update(H)
23
24def get_key(username):
25 return session.post("https://steamcommunity.com/login/getrsakey/",
26 data=dict(username=username, donotcache=time.time()*1000) ).json()
27
28def encode_passwd(key_data, passwd):
29 mod = int(key_data["publickey_mod"], 16)
30 exp = int(key_data["publickey_exp"], 16)
31 rsa = RSA.construct((mod, exp))
32 cipher = PKCS1_v1_5.new(rsa)
33 if hasattr(passwd, "encode"):
34 passwd = passwd.encode("utf-8")
35 return base64.b64encode(cipher.encrypt(passwd))
36
37def login(username, password):
38 key = get_key(username)
39 encrypted_password = encode_passwd(key, password)
40 return session.post("https://steamcommunity.com/login/dologin/",
41 data=dict(
42 username=username,
43 password=encrypted_password,
44 emailauth="",
45 loginfriendlyname="",
46 captchagid="-1",
47 captcha_text="",
48 emailsteamid="",
49 rsatimestamp=key["timestamp"],
50 remember_login=True,
51 donotcache=time.time()*1000
52 ) ).json()
53
54def transfer(url, login_data):
55 session.post(url,
56 data=login_data["transfer_parameters"]
57 )
58
59def get_gameservers():
60 """Yields lists containing four items: steam game id, token, date last used and memo"""
61 page = Soup(session.get("https://steamcommunity.com/dev/managegameservers").text, "html.parser")
62 response = []
63 for row in page.findAll("tr")[1:]:
64 response.append([ i.text.replace("\\", "\\\\").replace('"', '\\"') for i in row.findAll("td")[:4] ])
65 return response
66
67if __name__ == "__main__":
68 username = os.environ.get("STEAM_USERNAME")
69 password = os.environ.get("STEAM_PASSWORD")
70 if username and password:
71 if os.path.isfile("/tmp/steam-{}.json".format(username)):
72 with open("/tmp/steam-{}.json".format(username)) as f:
73 session.cookies = requests.utils.cookiejar_from_dict(json.loads(f.read()))
74 else:
75 login_data = login(username, password)
76 for url in login_data["transfer_urls"]:
77 transfer(url, login_data)
78 for gs in get_gameservers():
79 if "(expired)" in gs[1]:
80 gs[1] = gs[1][:32]
81 gs.append(True)
82 else:
83 gs.append(False)
84 print(yaml.safe_dump( {gs[3]: dict(id=gs[0], token=gs[1], date=gs[2], expired=gs[4])}, default_flow_style=False ).strip())
85 with open("/tmp/steam-{}.json".format(username), "w") as f:
86 f.write(json.dumps(requests.utils.dict_from_cookiejar(session.cookies)))
87 else:
88 print("Please specify environment variables STEAM_USERNAME and STEAM_PASSWORD", file=sys.stderr)
requirements.txt Raw
1requests
2beautifulsoup4
3pycrypto
4pyyaml