Save only cookies instead of whole session object

This commit is contained in:
Alexander Graf 2016-07-25 23:04:48 +02:00
parent 220584c483
commit bd0505098e

View File

@ -1,9 +1,8 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import re, json, datetime, shutil, os, time, random, sys, pickle, getpass import re, json, datetime, shutil, os, time, random, sys, pickle, getpass
from io import BytesIO
from argparse import ArgumentParser from argparse import ArgumentParser
import requests import requests, requests.utils
DEFAULTSESSIONFILE = "/tmp/.instaloadersession" DEFAULTSESSIONFILE = "/tmp/.instaloadersession"
@ -128,22 +127,36 @@ def download_profilepic(name, url, quiet=False):
else: else:
raise DownloaderException("file \'" + url + "\' could not be downloaded") raise DownloaderException("file \'" + url + "\' could not be downloaded")
def save_object(obj, filename, quiet=False): def save_session(session, filename, quiet=False):
if filename is None: if filename is None:
filename = DEFAULTSESSIONFILE filename = DEFAULTSESSIONFILE
with open(filename, 'wb') as file: with open(filename, 'wb') as sessionfile:
log("Saved session to %s." % filename, quiet=quiet)
os.chmod(filename, 0o600) os.chmod(filename, 0o600)
shutil.copyfileobj(BytesIO(pickle.dumps(obj, -1)), file) pickle.dump(requests.utils.dict_from_cookiejar(session.cookies), sessionfile)
log("Saved session to %s." % filename, quiet=quiet)
def load_object(filename, quiet=False): def load_session(filename, quiet=False):
if filename is None: if filename is None:
filename = DEFAULTSESSIONFILE filename = DEFAULTSESSIONFILE
if os.path.isfile(filename): if os.path.isfile(filename):
with open(filename, 'rb') as sessionfile: with open(filename, 'rb') as sessionfile:
obj = pickle.load(sessionfile) user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 ' \
'(KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36'
header = { 'Accept-Encoding' : 'gzip, deflate', \
'Accept-Language' : 'en-US,en;q=0.8', \
'Connection' : 'keep-alive', \
'Content-Length' : '0', \
'Host' : 'www.instagram.com', \
'Origin' : 'https://www.instagram.com', \
'Referer' : 'https://www.instagram.com/', \
'User-Agent' : user_agent, \
'X-Instagram-AJAX' : '1', \
'X-Requested-With' : 'XMLHttpRequest'}
session = requests.Session()
session.cookies = requests.utils.cookiejar_from_dict(pickle.load(sessionfile))
session.headers.update(header)
log("Loaded session from %s." % filename, quiet=quiet) log("Loaded session from %s." % filename, quiet=quiet)
return obj return session
def test_login(user, session): def test_login(user, session):
if user is None or session is None: if user is None or session is None:
@ -266,7 +279,7 @@ def download_profiles(targets, username=None, password=None, sessionfile=None,
# Login, if desired # Login, if desired
session = None session = None
if username is not None: if username is not None:
session = load_object(sessionfile, quiet=quiet) session = load_session(sessionfile, quiet=quiet)
if not test_login(username, session): if not test_login(username, session):
session = get_logged_in_session(username, password, quiet) session = get_logged_in_session(username, password, quiet)
log("Logged in as %s." % username, quiet=quiet) log("Logged in as %s." % username, quiet=quiet)
@ -285,7 +298,7 @@ def download_profiles(targets, username=None, password=None, sessionfile=None,
", ".join(failedtargets), file=sys.stderr) ", ".join(failedtargets), file=sys.stderr)
# Save session if it is useful # Save session if it is useful
if username is not None: if username is not None:
save_object(session, sessionfile, quiet=quiet) save_session(session, sessionfile, quiet=quiet)
def main(): def main():
parser = ArgumentParser(description='Simple downloader to fetch all Instagram pics and '\ parser = ArgumentParser(description='Simple downloader to fetch all Instagram pics and '\