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

"""
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