Last active 1486541279

A script to log into Steam and list game servers

Revision 451ddb0bbaaa1c5a58c5df307648a0304665bac5

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