instaloader / instaloader

Download pictures (or videos) along with their captions and other metadata from Instagram.
https://instaloader.github.io/
MIT License
8.51k stars 1.15k forks source link

Login error: JSON decode fail, 400 - Bad Request #615

Closed ghost closed 4 years ago

ghost commented 4 years ago

Describe the bug Bad request using --login

To Reproduce instaloader --login=usernamehere

Error messages and tracebacks Fatal error: Login error: JSON decode fail, 400 - Bad Request.

Instaloader version 4.4.1

Additional context I have checked the code and it seems to be using the web request and the password there is somehow encrypted, the post data is not the password itself.

I have the mobile api in case you need it!

daprofessa19 commented 4 years ago

Yes, I'm also having this issue.

caioburin commented 4 years ago

Same here. First time using, though.

TomoyaFujita2016 commented 4 years ago

Same here.

hawks-vision commented 4 years ago

For me it was working fine till yesterday but now its not even tried uninstalling simplejson mpdule in python but it didnt help

Whovian9369 commented 4 years ago

Yep, can confirm - Had this sometimes starting with Version 4.4.but am getting this seemingly 100% of the time here on 4.4.1.

seisdr commented 4 years ago

Yes same here

Fukken-Saved commented 4 years ago

Ohhh! Not again!

TomoyaFujita2016 commented 4 years ago

I felt that the response from instagram is a little bit slower than usual in console.

13C0der70 commented 4 years ago

Login error: JSON decode fail, 400 - Bad Request.

twitter-79 commented 4 years ago

I analyzed what happens within a normal login procedure on instagram.com using chrome console. Instagram is loading encryptionUtils.js, encrypts the password, and sends it as enc_password in FormData. It is possible to use Instaloader when using the enc_password instead of the normal password as used before. I hope this information can help the developer to find a solution to the issue.

colemannoah commented 4 years ago

Just started using this today, also getting this bug - is it out of the usual?

Fukken-Saved commented 4 years ago

Yes, very. I've been running it a bit more than a year, and a few times I've missed stories, but that was because I forgot to run it. Guess I get to do an overlapping highlights scan of everything once it works again. You can't get everything, even if you're me.

u174458 commented 4 years ago

I started to having this issue since yesterday (05-14-2020):

user@user-mycomputer:~/ig$ instaloader --version 4.4.1

user@user-mycomputer:~/ig$ instaloader profile xxxxxxxx --fast-update --login myigusername Session file does not exist yet - Logging in. Enter Instagram password for myigusername: Traceback (most recent call last): File "/home/user/.local/bin/instaloader", line 8, in sys.exit(main()) File "/home/user/.local/lib/python3.6/site-packages/instaloader/main.py", line 435, in main storyitem_filter_str=args.storyitem_filter) File "/home/user/.local/lib/python3.6/site-packages/instaloader/main.py", line 104, in _main instaloader.interactive_login(username) File "/home/user/.local/lib/python3.6/site-packages/instaloader/instaloader.py", line 1222, in interactive_login self.login(username, password) File "/home/user/.local/lib/python3.6/site-packages/instaloader/instaloader.py", line 462, in login self.context.login(user, passwd) File "/home/user/.local/lib/python3.6/site-packages/instaloader/instaloadercontext.py", line 221, in login resp_json = login.json() File "/home/user/.local/lib/python3.6/site-packages/requests/models.py", line 898, in json return complexjson.loads(self.text, **kwargs) File "/usr/lib/python3/dist-packages/simplejson/init.py", line 518, in loads return _default_decoder.decode(s) File "/usr/lib/python3/dist-packages/simplejson/decoder.py", line 370, in decode obj, end = self.raw_decode(s) File "/usr/lib/python3/dist-packages/simplejson/decoder.py", line 400, in raw_decode return self.scan_once(s, idx=_w(s, idx).end()) simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

7emretelli commented 4 years ago

there is a problem about instagram because i coded a script without instaloader and it gets same "bad request"

i put session post data my enc_password and it turned: {'authenticated': False, 'user': True, 'status': 'ok'}

that means when posting enc_password with username and password it works but cant logged in. There is an another problem too

pgrimaud commented 4 years ago

Same here 😢 https://github.com/pgrimaud/instagram-user-feed/issues/65

13C0der70 commented 4 years ago

import datetime import base64 import numpy from Crypto import Random from Crypto.Cipher import AES from nacl.public import PrivateKey, PublicKey, SealedBox

def encryptPassword(app_id, key_id, public_key, password, time):

def parsePkey(key):  # function n(t) {
    n = []  # const n = [];
    for o in range(0, len(key), 2):  # for (let o = 0; o < t.length; o += 2)
        n.append(int(key[o:o + 2], 16))  # n.push(parseInt(t.slice(o, o + 2), 16));
    return n  # return new Uint8Array(n)

def js_set(list1, arr, pos):
    list1[pos:pos + len(arr)] = arr

o = 100
u = o + len(password)

if 64 != len(public_key):
    print("Invalid Public Key")

public_key = parsePkey(public_key)
y = numpy.frombuffer(bytearray(u), dtype=numpy.uint8)
f = 0
y[f] = 1
f += 1
y[f] = int(key_id)  # Sets 2nd byte to key_id
f += 1  # Parsed public_key and Array y match with Javascript at this point

key = Random.get_random_bytes(32)  # = subtle.generateKey 256 bits
iv = Random.get_random_bytes(12)
tag_length = 16
aes = AES.new(key, AES.MODE_GCM, mac_len=tag_length, nonce=iv)
cipher_text, cipher_tag = aes.encrypt_and_digest(bytearray(password, 'utf-8'))
cipher_text = cipher_text + cipher_tag
public_key_seal = PublicKey(bytes(public_key))

tmp_sealed = SealedBox(public_key_seal)
sealed = numpy.frombuffer(tmp_sealed.encrypt(bytes(key)), dtype=numpy.uint8)
y[f] = len(sealed)  # y[f] = 255 & sealed.length
y[f + 1] = 0  # y[f + 1] = sealed.length >> 8 & 255
f += 2
js_set(y, sealed, f)  # y.set(sealed, f)
f += 32
f += 48

s = numpy.frombuffer(cipher_text, dtype=numpy.uint8) # const s = new Uint8Array(ciphertext)
c = s[-16:]  # const c = s.slice(-16)
h = s[0:-16]  # const h = s.slice(0, -16)
js_set(y, c, f)  # y.set(c, f)
f += 16
js_set(y, h, f)  # y.set(h, f)

enc_pass = str(base64.b64encode(y).decode('utf-8')) # let t = btoa(y)

return '#PWD_INSTAGRAM_BROWSER' + ':' + app_id + ':' + time + ':' + enc_pass

def main(): APP_ID = '6' KEY_ID = '89' PUBLIC_KEY = '2e5b022acd391257cec16e261ea9e1c9a4f1680a364e94748f7a9a9905e94c13' PASSWORD = 'password' time = str(int((datetime.datetime.now().timestamp() * 1000)))

enc_password = encryptPassword(APP_ID, KEY_ID, PUBLIC_KEY, PASSWORD, time)
print(enc_password)
7emretelli commented 4 years ago

import datetime import base64 import numpy from Crypto import Random from Crypto.Cipher import AES from nacl.public import PrivateKey, PublicKey, SealedBox

def encryptPassword(app_id, key_id, public_key, password, time):

def parsePkey(key):  # function n(t) {
    n = []  # const n = [];
    for o in range(0, len(key), 2):  # for (let o = 0; o < t.length; o += 2)
        n.append(int(key[o:o + 2], 16))  # n.push(parseInt(t.slice(o, o + 2), 16));
    return n  # return new Uint8Array(n)

def js_set(list1, arr, pos):
    list1[pos:pos + len(arr)] = arr

o = 100
u = o + len(password)

if 64 != len(public_key):
    print("Invalid Public Key")

public_key = parsePkey(public_key)
y = numpy.frombuffer(bytearray(u), dtype=numpy.uint8)
f = 0
y[f] = 1
f += 1
y[f] = int(key_id)  # Sets 2nd byte to key_id
f += 1  # Parsed public_key and Array y match with Javascript at this point

key = Random.get_random_bytes(32)  # = subtle.generateKey 256 bits
iv = Random.get_random_bytes(12)
tag_length = 16
aes = AES.new(key, AES.MODE_GCM, mac_len=tag_length, nonce=iv)
cipher_text, cipher_tag = aes.encrypt_and_digest(bytearray(password, 'utf-8'))
cipher_text = cipher_text + cipher_tag
public_key_seal = PublicKey(bytes(public_key))

tmp_sealed = SealedBox(public_key_seal)
sealed = numpy.frombuffer(tmp_sealed.encrypt(bytes(key)), dtype=numpy.uint8)
y[f] = len(sealed)  # y[f] = 255 & sealed.length
y[f + 1] = 0  # y[f + 1] = sealed.length >> 8 & 255
f += 2
js_set(y, sealed, f)  # y.set(sealed, f)
f += 32
f += 48

s = numpy.frombuffer(cipher_text, dtype=numpy.uint8) # const s = new Uint8Array(ciphertext)
c = s[-16:]  # const c = s.slice(-16)
h = s[0:-16]  # const h = s.slice(0, -16)
js_set(y, c, f)  # y.set(c, f)
f += 16
js_set(y, h, f)  # y.set(h, f)

enc_pass = str(base64.b64encode(y).decode('utf-8')) # let t = btoa(y)

return '#PWD_INSTAGRAM_BROWSER' + ':' + app_id + ':' + time + ':' + enc_pass

def main(): APP_ID = '6' KEY_ID = '89' PUBLIC_KEY = '2e5b022acd391257cec16e261ea9e1c9a4f1680a364e94748f7a9a9905e94c13' PASSWORD = 'password' time = str(int((datetime.datetime.now().timestamp() * 1000)))

enc_password = encryptPassword(APP_ID, KEY_ID, PUBLIC_KEY, PASSWORD, time)
print(enc_password)

Hello, thanks for reply. I will try this. Is it worked on you?

hawks-vision commented 4 years ago

I'm not sure about the coding part yet but is it possible to incorporate the login flow from instabot because its still working fine

Fukken-Saved commented 4 years ago

Instabot is warning people not to use any scripts, for fear of getting banned. The main problem with that is: Without bots, Instagram isn't worth using. I only want the videos. That would have been slow enough on the web site, but having to see the pictures too makes the whole site a waste of my time. I can just expand my Youtube operations or make a script for Likee, Tik Tok or something.

Infinitay commented 4 years ago

Having the same issue when attempting to login

stark3998 commented 4 years ago

import datetime import base64 import numpy from Crypto import Random from Crypto.Cipher import AES from nacl.public import PrivateKey, PublicKey, SealedBox def encryptPassword(app_id, key_id, public_key, password, time):

def parsePkey(key):  # function n(t) {
    n = []  # const n = [];
    for o in range(0, len(key), 2):  # for (let o = 0; o < t.length; o += 2)
        n.append(int(key[o:o + 2], 16))  # n.push(parseInt(t.slice(o, o + 2), 16));
    return n  # return new Uint8Array(n)

def js_set(list1, arr, pos):
    list1[pos:pos + len(arr)] = arr

o = 100
u = o + len(password)

if 64 != len(public_key):
    print("Invalid Public Key")

public_key = parsePkey(public_key)
y = numpy.frombuffer(bytearray(u), dtype=numpy.uint8)
f = 0
y[f] = 1
f += 1
y[f] = int(key_id)  # Sets 2nd byte to key_id
f += 1  # Parsed public_key and Array y match with Javascript at this point

key = Random.get_random_bytes(32)  # = subtle.generateKey 256 bits
iv = Random.get_random_bytes(12)
tag_length = 16
aes = AES.new(key, AES.MODE_GCM, mac_len=tag_length, nonce=iv)
cipher_text, cipher_tag = aes.encrypt_and_digest(bytearray(password, 'utf-8'))
cipher_text = cipher_text + cipher_tag
public_key_seal = PublicKey(bytes(public_key))

tmp_sealed = SealedBox(public_key_seal)
sealed = numpy.frombuffer(tmp_sealed.encrypt(bytes(key)), dtype=numpy.uint8)
y[f] = len(sealed)  # y[f] = 255 & sealed.length
y[f + 1] = 0  # y[f + 1] = sealed.length >> 8 & 255
f += 2
js_set(y, sealed, f)  # y.set(sealed, f)
f += 32
f += 48

s = numpy.frombuffer(cipher_text, dtype=numpy.uint8) # const s = new Uint8Array(ciphertext)
c = s[-16:]  # const c = s.slice(-16)
h = s[0:-16]  # const h = s.slice(0, -16)
js_set(y, c, f)  # y.set(c, f)
f += 16
js_set(y, h, f)  # y.set(h, f)

enc_pass = str(base64.b64encode(y).decode('utf-8')) # let t = btoa(y)

return '#PWD_INSTAGRAM_BROWSER' + ':' + app_id + ':' + time + ':' + enc_pass

def main(): APP_ID = '6' KEY_ID = '89' PUBLIC_KEY = '2e5b022acd391257cec16e261ea9e1c9a4f1680a364e94748f7a9a9905e94c13' PASSWORD = 'password' time = str(int((datetime.datetime.now().timestamp() * 1000)))

enc_password = encryptPassword(APP_ID, KEY_ID, PUBLIC_KEY, PASSWORD, time)
print(enc_password)

Hello, thanks for reply. I will try this. Is it worked on you?

I tried using this, It didnt work for me.

aandergr commented 4 years ago

There have been changes regarding the login on Instagram's side and Instaloader's login functionality is currently broken. As long as there does not exist any solution, we can only present the following advice:

The snippet posted in this issue to allegedly fix the login error does not seem to work. As always, we are very open to discuss ideas in Pull Requests.

jqdoumen commented 4 years ago

How do you run a snippet in Firefox?

duckyb commented 4 years ago

@jqdoumen that is a python snippet, save it to your computer and run python script.py

If you are on windows just replace the path inside the script with the path to your profile. For me it was: "C:\\Users\\user\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\profile-name\\cookies.sqlite" (you have to escape every backslash with a second backslash)

u174458 commented 4 years ago

Not working for me:

python3 ig_session.py Traceback (most recent call last): File "ig_session.py", line 12, in .execute("SELECT name, value FROM moz_cookies " sqlite3.OperationalError: no such column: baseDomain

akatreyt commented 4 years ago

Not working for me:

python3 ig_session.py Traceback (most recent call last): File "ig_session.py", line 12, in .execute("SELECT name, value FROM moz_cookies " sqlite3.OperationalError: no such column: baseDomain

I think the sql is "SELECT name, value FROM moz_cookies WHERE host='.instagram.com"

Fukken-Saved commented 4 years ago

Nice to be back in business again. I had to use python3 rather than python, turn Firefox off Private Browsing mode and set the script to use *.default-esr since I'm on Debian. Any stories anyone missed you'll just have to run a highlights scan to cover since it hasn't worked...but if you're a long term user, you figured out that a long time ago anyway.

hawks-vision commented 4 years ago

i always get "sqlite3.OperationalError: database is locked" error i tried both host and basedomain options and i know that they have nothing to do with this error but can anyone help me on this error

Fukken-Saved commented 4 years ago

hawks, turn off firefox.

hawks-vision commented 4 years ago

Thanks Fukken. i got through it but caught up in the exception Cookie import failed. Are you logged in successfully in Firefox? any idea on this one

Update: got through it.my problem is that in the snippet the host is given as instagram.com whereas my cookies.sqlite had it as .instagram.com

roboshim commented 4 years ago

Always keep your sessionfile. I have never seen a sessionfile expire. If you have your sessionfile, no login is required, and thus, no login can fail.

Would it be possible to create session file e.g. in homedir instead of in /tmp by default? I know there is a option but it would be better to use some persistent location by default. /tmp is deleted on boot in Debian and Termux (and probably other distros). A few times I was already stressed about to login again but no such big problem for me, at least I can refresh my password :-) But for such case it would be great if the session file can stay between reboots. I have done login on FF 76.0.1 now exported the cookies to instaloader session file using the python code and the session file works now. I have created the session file in my homedir and set -f SESSIONFILE options for every instaloader run. As akatreyt writes, for FF 76.0.1 there is no baseDomain column in sqlite cookies file, there is host field instead so correct execute is, thank you akatreyt

execute("SELECT name, value FROM moz_cookies WHERE host='.instagram.com'")

there is apostrophe and then quotes at the end before parenthesis - akatreyt has only quotes - just forgotten apostrophe for host='...'.

seisdr commented 4 years ago

Is this fixed yet?

Infinitay commented 4 years ago

Is this fixed yet?

No but there is a workaround, take the time to read the issue pls https://github.com/instaloader/instaloader/issues/615#issuecomment-629699078

seisdr commented 4 years ago

What if we create session manually

7emretelli commented 4 years ago

@seisdr it works

roboshim commented 4 years ago

@seisdr I can confirm, Login in FF 76.0.1, using the python code from Troubleshooting - Login Error page (replace baseDomain='instagram.com' with host='.instagram.com' for "newer" FF e.g. 76.0.1 if you get no such column: baseDomain error) generate instaloader session file, then use option -f SESSIONFILE together with -l USERNAME reports logged in as USERNAME without password asking. The keep this session file and you can access IG forever :+1:

jqdoumen commented 4 years ago

@duckyb Thanks ! Seems that the script doesn't know where to find instaloader:

Traceback (most recent call last): File "instafix.py", line 5, in from instaloader import ConnectionException, Instaloader ModuleNotFoundError: No module named 'instaloader'

instaloader installed with "pip3 install instaloader"

I'm on a Mac, so already adapted the location of the cookies file ...

Fukken-Saved commented 4 years ago

I said before you need to use python3. I ran into that same problem. python3 instafix.py

doctorcolossus commented 4 years ago

Would it be possible to create session file e.g. in homedir instead of in /tmp by default?... I have done login on FF 76.0.1 now exported the cookies to instaloader session file using the python code and the session file works now. I have created the session file in my homedir and set -f SESSIONFILE options for every instaloader run.

You can define an alias to always add the -f argument in your .bashrc or wherever you like to do it: alias instaloader='instaloader -f ~/{name_of_your_session_file}

roboshim commented 4 years ago

Would it be possible to create session file e.g. in homedir instead of in /tmp by default?...

You can define an alias to always add the -f argument in your .bashrc or wherever you like to do it: alias instaloader='instaloader -f ~/{name_of_your_session_file}

Yes, I know, I can define alias or function or even wrapper shell script. But this has to be done on all hosts. In fact, I have updated my "wrapper" and added this option as default. I could do it earlier, but I was too lazy and it wasn't for me crucial to enter the password after reboot. But now it's important to keep the session file. Users maybe would prefer, if this would be as default and this issue would probably never be created :smile: But take my question as proposal.

doctorcolossus commented 4 years ago

Yeah, I agree that that would be a nice option.

Sickelmo83 commented 4 years ago

I followed the same steps described here: Troubleshooting - Login Error i got successfully the sessionfile with the fix from here

@seisdr I can confirm, Login in FF 76.0.1, using the python code from Troubleshooting - Login Error page (replace baseDomain='instagram.com' with host='.instagram.com' for "newer" FF e.g. 76.0.1 if you get no such column: baseDomain error) generate instaloader session file, then use option -f SESSIONFILE together with -l USERNAME reports logged in as USERNAME without password asking. The keep this session file and you can access IG forever

BUT... it still fails. Instaloader loads the sessionfile but asks for the password, entered the password with the same result: Fatal Error: Login error: JSON decode fail, 400 - Bad Request.

I used my laptop to get the sessionfile from FF and transfered the sessionfile to my NAS (file permissions are ok), that shouldn't matter, right? Since i got the sessionfile successfully extracted and no other dependencies are on the sessionfile

Tom1287 commented 4 years ago

I followed the same steps described here: Troubleshooting - Login Error i got successfully the sessionfile with the fix from here

@seisdr I can confirm, Login in FF 76.0.1, using the python code from Troubleshooting - Login Error page (replace baseDomain='instagram.com' with host='.instagram.com' for "newer" FF e.g. 76.0.1 if you get no such column: baseDomain error) generate instaloader session file, then use option -f SESSIONFILE together with -l USERNAME reports logged in as USERNAME without password asking. The keep this session file and you can access IG forever

BUT... it still fails. Instaloader loads the sessionfile but asks for the password, entered the password with the same result: Fatal Error: Login error: JSON decode fail, 400 - Bad Request.

I used my laptop to get the sessionfile from FF and transfered the sessionfile to my NAS (file permissions are ok), that shouldn't matter, right? Since i got the sessionfile successfully extracted and no other dependencies are on the sessionfile

If you log out from Instagram in Firefox the created sessionfile is invalid. You have to create a profile in Firefox and stay logged in.

roboshim commented 4 years ago

I followed the same steps described here: Troubleshooting - Login Error i got successfully the sessionfile with the fix from here BUT... it still fails. Instaloader loads the sessionfile but asks for the password, entered the password with the same result: Fatal Error: Login error: JSON decode fail, 400 - Bad Request.

@Sickelmo83 Check following:

I have copied the cookies.sqlite from firefox to /tmp and then run the python script with the file in /tmp.

I used my laptop to get the sessionfile from FF and transfered the sessionfile to my NAS (file permissions are ok), that shouldn't matter, right? Since i got the sessionfile successfully extracted and no other dependencies are on the sessionfile

I have used notebook to generate the session file and copied to android phone with termux and it works. So there has to be one incorrect step.

jpd-b commented 4 years ago

I don't suppose there exists a workaround for those of us using the windows standalone client?

Vampi-o commented 4 years ago

BUT... it still fails. Instaloader loads the sessionfile but asks for the password, entered the password with the same result: Fatal Error: Login error: JSON decode fail, 400 - Bad Request.

I used my laptop to get the sessionfile from FF and transfered the sessionfile to my NAS (file permissions are ok), that shouldn't matter, right? Since i got the sessionfile successfully extracted and no other dependencies are on the sessionfile

Do you load the created session ?

L.load_session_from_file(USER)

Tom1380 commented 4 years ago

I'm having this problem too.

roboshim commented 4 years ago

@tom1380 have you tried the workaround mentioned in this comment by aandergr? it works really

@muertq IMHO the workaround should work for all platforms, have you tried workaround mentioned in this comment by aandergr? for windows you have to update profile path - this comment show example . for newer FF then ESR, you have to update execute command as described in this comment (here is missing apostrophe behind instagram.com) or this comment . did it work? are you able to update script to you needs?

roboshim commented 4 years ago

to summarize the workaround:

  1. login to instagram using firefox
  2. create python script igsession.py from Troubleshooting - Login Error Page - if you get Server not found error as gnu-like, the code is
    
    from glob import glob
    from os.path import expanduser
    from sqlite3 import connect

from instaloader import ConnectionException, Instaloader

FIREFOXCOOKIEFILE = "C:\Users\user\AppData\Roaming\Mozilla\Firefox\Profiles\profile-name\cookies.sqlite"

FIREFOXCOOKIEFILE = "/exact/location/of/cookies.sqlite"

FIREFOXCOOKIEFILE = glob(expanduser("~/.mozilla/firefox/*.default/cookies.sqlite"))[0]

instaloader = Instaloader(max_connection_attempts=1) instaloader.context._session.cookies.update(connect(FIREFOXCOOKIEFILE).execute("SELECT name, value FROM moz_cookies WHERE baseDomain='instagram.com'"))

try: username = instaloader.test_login() if not username: raise ConnectionException() except ConnectionException: raise SystemExit("Cookie import failed. Are you logged in successfully in Firefox?")

instaloader.context.username = username instaloader.save_session_to_file()


3. if you are not on Linux or you don't use standard Firefox profile location, update `FIREFOXCOOKIEFILE` (I have copied the cookies.sqlite from FF profile to /tmp, so I have used `FIREFOXCOOKIEFILE = '/tmp/cookies.sqlite'`)
4. if you use newer FF then ESR (e.g. 76.0.1) or if you get in step 6 the error `no such column: baseDomain`, update the SQL in `execute` command. The old FF use **baseDomain**, but newer FF use **host**, so it should look like `instaloader.context._session.cookies.update(connect(FIREFOXCOOKIEFILE).execute("SELECT name, value FROM moz_cookies WHERE host='.instagram.com'"))`
5. if you don't have instaloader on this host, install instaloader here first
6. run script `python3 igsession.py` - it should report `Saved session to /tmp/.instaloader-LOCALUSERNAME/session-IGUSERNAME`
7. if you are running instaloader on other host, copy the session file to the target host, where do you want to use instaloader. You can copy this file to the /tmp/... location (see description for option -f from `instaloader --help` for correct location) or you can copy this file to homedir or other persistent location to use this session file forever(?)
8. run `instaloader -l IGUSERNAME -f SESSIONFILE ....` and instaloader should report
`Loaded session from SESSIONFILE.`
`Logged in as IGUSERNAME.`

If you get any error, please copy the error.

I hope it will help you to stay logged in to IG :smiley: 
gnu-like commented 4 years ago

@roboshim I use linux & Firefox 76 ,would you please explain how could I make instaloader's session file wanna download story & post