From 9b928b46793dfb2d796b5e71a54fa07d14256743 Mon Sep 17 00:00:00 2001 From: Marco Volpato Date: Thu, 23 Jun 2022 20:53:52 +0200 Subject: [PATCH] Add save and load session from dict (#1591) --- instaloader/instaloader.py | 17 +++++++++++++++++ instaloader/instaloadercontext.py | 22 +++++++++++++++------- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/instaloader/instaloader.py b/instaloader/instaloader.py index 950e6ce..718944a 100644 --- a/instaloader/instaloader.py +++ b/instaloader/instaloader.py @@ -586,6 +586,23 @@ class Instaloader: .. versionadded:: 4.4""" self.download_title_pic(hashtag.profile_pic_url, '#' + hashtag.name, 'profile_pic', None) + @_requires_login + def save_session(self) -> dict: + """Saves internally stored :class:`requests.Session` object to :class:`dict`. + + :raises LoginRequiredException: If called without being logged in. + + .. versionadded:: 4.10 + """ + return self.context.save_session() + + def load_session(self, username: str, session_data: dict) -> None: + """Internally stores :class:`requests.Session` object from :class:`dict`. + + .. versionadded:: 4.10 + """ + self.context.load_session(username, session_data) + @_requires_login def save_session_to_file(self, filename: Optional[str] = None) -> None: """Saves internally stored :class:`requests.Session` object. diff --git a/instaloader/instaloadercontext.py b/instaloader/instaloadercontext.py index 5b3238e..d8124e3 100644 --- a/instaloader/instaloadercontext.py +++ b/instaloader/instaloadercontext.py @@ -170,22 +170,30 @@ class InstaloaderContext: session.request = partial(session.request, timeout=self.request_timeout) # type: ignore return session - def save_session_to_file(self, sessionfile): - """Not meant to be used directly, use :meth:`Instaloader.save_session_to_file`.""" - pickle.dump(requests.utils.dict_from_cookiejar(self._session.cookies), sessionfile) + def save_session(self): + """Not meant to be used directly, use :meth:`Instaloader.save_session`.""" + return requests.utils.dict_from_cookiejar(self._session.cookies) - def load_session_from_file(self, username, sessionfile): - """Not meant to be used directly, use :meth:`Instaloader.load_session_from_file`.""" + def load_session(self, username, sessiondata): + """Not meant to be used directly, use :meth:`Instaloader.load_session`.""" session = requests.Session() - session.cookies = requests.utils.cookiejar_from_dict(pickle.load(sessionfile)) + session.cookies = requests.utils.cookiejar_from_dict(sessiondata) session.headers.update(self._default_http_header()) session.headers.update({'X-CSRFToken': session.cookies.get_dict()['csrftoken']}) # Override default timeout behavior. # Need to silence mypy bug for this. See: https://github.com/python/mypy/issues/2427 - session.request = partial(session.request, timeout=self.request_timeout) # type: ignore + session.request = partial(session.request, timeout=self.request_timeout) # type: ignore self._session = session self.username = username + def save_session_to_file(self, sessionfile): + """Not meant to be used directly, use :meth:`Instaloader.save_session_to_file`.""" + pickle.dump(self.save_session(), sessionfile) + + def load_session_from_file(self, username, sessionfile): + """Not meant to be used directly, use :meth:`Instaloader.load_session_from_file`.""" + self.load_session(username, pickle.load(sessionfile)) + def test_login(self) -> Optional[str]: """Not meant to be used directly, use :meth:`Instaloader.test_login`.""" data = self.graphql_query("d6f4427fbe92d846298cf93df0b937d3", {})