1
0
mirror of https://github.com/instaloader/instaloader.git synced 2024-08-18 04:39:39 +02:00

Let --sessionfile default to a more persistent path (#659)

The presence of a sessionfile avoids the usage of the failure-prone login
mechanism.  This commit addresses a suggestion in #615 to store the sessionfile
in a persistent path rather than a path within a temporary directory if no
--sessionfile parameter is given.

The default path is now:

  $XDG_CONFIG_HOME/instaloader/session-USERNAME or
    ~/.config/instaloader/session-USERNAME on Unix,

  %LOCALAPPDATA%\Instaloader\session-USERNAME on Windows.

If no file exists in the new path, Instaloader tries loading from the path
where the sessionfile was stored before this commit, hence it automatically
migrates to the new sessionfile path.
This commit is contained in:
Alexander Graf 2020-06-06 10:49:41 +02:00 committed by GitHub
parent 1c13d5a30b
commit ed499cb49c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 26 additions and 10 deletions

View File

@ -51,7 +51,7 @@ invoke it with
instaloader --login=your_username profile [profile ...] instaloader --login=your_username profile [profile ...]
When logging in, Instaloader **stores the session cookies** in a file in your When logging in, Instaloader **stores the session cookies** in a file in your
temporary directory, which will be reused later the next time :option:`--login` home directory, which will be reused later the next time :option:`--login`
is given. So you can download private profiles **non-interactively** when you is given. So you can download private profiles **non-interactively** when you
already have a valid session cookie file. already have a valid session cookie file.
@ -291,17 +291,18 @@ Instaloader as Cronjob
Instaloader is suitable for running as a cronjob to periodically update your Instaloader is suitable for running as a cronjob to periodically update your
personal Instagram archive. The :option:`--quiet` option disables user personal Instagram archive. The :option:`--quiet` option disables user
interactions and logging of non-error messages. To non-interactively use interactions and logging of non-error messages. To non-interactively use
Instaloader logged-in, create a session file, e.g. in your home directory:: Instaloader logged-in, create a session file::
instaloader --login=your_username --sessionfile=~/.instaloader-session instaloader --login=your_username
Then use the same parameters in your cronjob to load the session and download Then use the same parameter in your cronjob to load the session and download
the given targets:: the given targets::
instaloader --login=your_username --sessionfile=~/.instaloader-session --quiet <target> [...] instaloader --login=your_username --quiet <target> [...]
Without :option:`--sessionfile` option, Instaloader saves the session file in Instaloader saves the session file to
a path within your temporary directory. ``~/.config/instaloader/session-YOUR-USERNAME``. See
:option:`--sessionfile` option for how to override this path.
Programming Instaloader Programming Instaloader
^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^

View File

@ -193,9 +193,8 @@ Instaloader to login.
.. option:: --sessionfile SESSIONFILE, -f SESSIONFILE .. option:: --sessionfile SESSIONFILE, -f SESSIONFILE
Path for loading and storing session key file. Defaults to a path within Path for loading and storing session key file. Defaults to
your temporary directory, encoding your local username and your Instagram ``~/.config/instaloader/session-YOUR-USERNAME``.
profile name.
.. option:: --password YOUR-PASSWORD, -p YOUR-PASSWORD .. option:: --password YOUR-PASSWORD, -p YOUR-PASSWORD

View File

@ -27,6 +27,20 @@ from .structures import (Hashtag, Highlight, JsonExportable, Post, PostLocation,
def get_default_session_filename(username: str) -> str: def get_default_session_filename(username: str) -> str:
"""Returns default session filename for given username.""" """Returns default session filename for given username."""
sessionfilename = "session-{}".format(username)
if platform.system() == "Windows":
# on Windows, use %LOCALAPPDATA%\Instaloader\session-USERNAME
localappdata = os.getenv("LOCALAPPDATA")
if localappdata is not None:
return os.path.join(localappdata, "Instaloader", sessionfilename)
# legacy fallback - store in temp dir if %LOCALAPPDATA% is not set
return os.path.join(tempfile.gettempdir(), ".instaloader-" + getpass.getuser(), sessionfilename)
# on Unix, use ~/.config/instaloader/session-USERNAME
return os.path.join(os.getenv("XDG_CONFIG_HOME", os.path.expanduser("~/.config")), "instaloader", sessionfilename)
def get_legacy_session_filename(username: str) -> str:
"""Returns legacy (until v4.4.3) default session filename for given username."""
dirname = tempfile.gettempdir() + "/" + ".instaloader-" + getpass.getuser() dirname = tempfile.gettempdir() + "/" + ".instaloader-" + getpass.getuser()
filename = dirname + "/" + "session-" + username filename = dirname + "/" + "session-" + username
return filename.lower() return filename.lower()
@ -441,6 +455,8 @@ class Instaloader:
""" """
if filename is None: if filename is None:
filename = get_default_session_filename(username) filename = get_default_session_filename(username)
if not os.path.exists(filename):
filename = get_legacy_session_filename(username)
with open(filename, 'rb') as sessionfile: with open(filename, 'rb') as sessionfile:
self.context.load_session_from_file(username, sessionfile) self.context.load_session_from_file(username, sessionfile)
self.context.log("Loaded session from %s." % filename) self.context.log("Loaded session from %s." % filename)