pythonhacktoberfeststeamauthenticationauthenticatorsteam-authenticatorsteam-clientsteam-guard-codessteam-websteamworksvalvewebapi
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
3.1 KiB
91 lines
3.1 KiB
"""
|
|
Web related features
|
|
"""
|
|
from steam import webapi
|
|
from steam.core.msg import MsgProto
|
|
from steam.enums.emsg import EMsg
|
|
from steam.core.crypto import generate_session_key, symmetric_encrypt
|
|
from steam.utils.web import make_requests_session, generate_session_id
|
|
|
|
|
|
class Web(object):
|
|
_web_session = None
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super(Web, self).__init__(*args, **kwargs)
|
|
|
|
self.on(self.EVENT_DISCONNECTED, self.__handle_disconnect)
|
|
|
|
def __handle_disconnect(self):
|
|
self._web_session = None
|
|
|
|
def get_web_session_cookies(self):
|
|
"""Get web authentication cookies via WebAPI's ``AuthenticateUser``
|
|
|
|
.. note::
|
|
The cookies are valid only while :class:`.SteamClient` instance is logged on.
|
|
|
|
:return: dict with authentication cookies
|
|
:rtype: :class:`dict`, :class:`None`
|
|
"""
|
|
if not self.logged_on: return None
|
|
|
|
resp = self.send_job_and_wait(MsgProto(EMsg.ClientRequestWebAPIAuthenticateUserNonce), timeout=7)
|
|
|
|
if resp is None: return None
|
|
|
|
skey, ekey = generate_session_key()
|
|
|
|
data = {
|
|
'steamid': self.steam_id,
|
|
'sessionkey': ekey,
|
|
'encrypted_loginkey': symmetric_encrypt(resp.webapi_authenticate_user_nonce.encode('ascii'), skey),
|
|
}
|
|
|
|
try:
|
|
resp = webapi.post('ISteamUserAuth', 'AuthenticateUser', 1, params=data)
|
|
except Exception as exp:
|
|
self._LOG.debug("get_web_session_cookies error: %s" % str(exp))
|
|
return None
|
|
|
|
return {
|
|
'steamLogin': resp['authenticateuser']['token'],
|
|
'steamLoginSecure': resp['authenticateuser']['tokensecure'],
|
|
}
|
|
|
|
def get_web_session(self, language='english'):
|
|
"""Get a :class:`requests.Session` that is ready for use
|
|
|
|
See :meth:`get_web_session_cookies`
|
|
|
|
.. note::
|
|
Auth cookies will only be send to ``(help|store).steampowered.com`` and ``steamcommunity.com`` domains
|
|
|
|
.. note::
|
|
The session is valid only while :class:`.SteamClient` instance is logged on.
|
|
|
|
:param language: localization language for steam pages
|
|
:type language: :class:`str`
|
|
:return: authenticated Session ready for use
|
|
:rtype: :class:`requests.Session`, :class:`None`
|
|
"""
|
|
if self._web_session:
|
|
return self._web_session
|
|
|
|
cookies = self.get_web_session_cookies()
|
|
if cookies is None:
|
|
return None
|
|
|
|
self._web_session = session = make_requests_session()
|
|
session_id = generate_session_id()
|
|
|
|
for domain in ['store.steampowered.com', 'help.steampowered.com', 'steamcommunity.com']:
|
|
for name, val in cookies.items():
|
|
secure = (name == 'steamLoginSecure')
|
|
session.cookies.set(name, val, domain=domain, secure=secure)
|
|
|
|
session.cookies.set('Steam_Language', language, domain=domain)
|
|
session.cookies.set('birthtime', '-3333', domain=domain)
|
|
session.cookies.set('sessionid', session_id, domain=domain)
|
|
|
|
return session
|
|
|