mirror of
https://github.com/instaloader/instaloader.git
synced 2024-08-16 11:49:39 +02:00
Allows to open the firefox cookie database even though Firefox is holding a lock. Fixes the "Cookie import failed: database is locked" message when using the script while Firefox was running. This has been reported in #877.
54 lines
2.0 KiB
Python
54 lines
2.0 KiB
Python
from argparse import ArgumentParser
|
|
from glob import glob
|
|
from os.path import expanduser
|
|
from platform import system
|
|
from sqlite3 import OperationalError, connect
|
|
|
|
try:
|
|
from instaloader import ConnectionException, Instaloader
|
|
except ModuleNotFoundError:
|
|
raise SystemExit("Instaloader not found.\n pip install [--user] instaloader")
|
|
|
|
|
|
def get_cookiefile():
|
|
default_cookiefile = {
|
|
"Windows": "~/AppData/Roaming/Mozilla/Firefox/Profiles/*/cookies.sqlite",
|
|
"Darwin": "~/Library/Application Support/Firefox/Profiles/*/cookies.sqlite",
|
|
}.get(system(), "~/.mozilla/firefox/*/cookies.sqlite")
|
|
cookiefiles = glob(expanduser(default_cookiefile))
|
|
if not cookiefiles:
|
|
raise SystemExit("No Firefox cookies.sqlite file found. Use -c COOKIEFILE.")
|
|
return cookiefiles[0]
|
|
|
|
|
|
def import_session(cookiefile, sessionfile):
|
|
print("Using cookies from {}.".format(cookiefile))
|
|
conn = connect(f"file:{cookiefile}?immutable=1", uri=True)
|
|
try:
|
|
cookie_data = conn.execute(
|
|
"SELECT name, value FROM moz_cookies WHERE baseDomain='instagram.com'"
|
|
)
|
|
except OperationalError:
|
|
cookie_data = conn.execute(
|
|
"SELECT name, value FROM moz_cookies WHERE host LIKE '%instagram.com'"
|
|
)
|
|
instaloader = Instaloader(max_connection_attempts=1)
|
|
instaloader.context._session.cookies.update(cookie_data)
|
|
username = instaloader.test_login()
|
|
if not username:
|
|
raise SystemExit("Not logged in. Are you logged in successfully in Firefox?")
|
|
print("Imported session cookie for {}.".format(username))
|
|
instaloader.context.username = username
|
|
instaloader.save_session_to_file(sessionfile)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
p = ArgumentParser()
|
|
p.add_argument("-c", "--cookiefile")
|
|
p.add_argument("-f", "--sessionfile")
|
|
args = p.parse_args()
|
|
try:
|
|
import_session(args.cookiefile or get_cookiefile(), args.sessionfile)
|
|
except (ConnectionException, OperationalError) as e:
|
|
raise SystemExit("Cookie import failed: {}".format(e))
|