aiograpi

🔥 Asynchronous Python library for Instagram Private API 2024

View on GitHub

New password challenge

You can automatically change your password to solve the challenge from Instagram.

Declare change_password_handler which will return a new password.

async def change_password_handler(username):
    # Simple way to generate a random string
    chars = list("abcdefghijklmnopqrstuvwxyz1234567890!&£@#")
    password = "".join(random.sample(chars, 8))
    return password

cl = Client()
cl.change_password_handler = change_password_handler
await cl.login(IG_USERNAME, IG_PASSWORD)

Code verification challenge

You can automatically process the codes sent to you to solve the challenge from Instagram.

You need to declare challenge_code_handler which will return the code received from Instagram via Email or SMS:

from aiograpi.mixins.challenge import ChallengeChoice


async def challenge_code_handler(username, choice):
    if choice == ChallengeChoice.SMS:
        return await get_code_from_sms(username)
    elif choice == ChallengeChoice.EMAIL:
        return await get_code_from_email(username)
    return False

cl = Client()
cl.challenge_code_handler = challenge_code_handler
await cl.login(IG_USERNAME, IG_PASSWORD)

For example, you can get the code through the IMAP of Gmail:

async def get_code_from_email(username):
    mail = imaplib.IMAP4_SSL("imap.gmail.com")
    mail.login(CHALLENGE_EMAIL, CHALLENGE_PASSWORD)
    mail.select("inbox")
    result, data = mail.search(None, "(UNSEEN)")
    assert result == "OK", "Error1 during get_code_from_email: %s" % result
    ids = data.pop().split()
    for num in reversed(ids):
        mail.store(num, "+FLAGS", "\\Seen")  # mark as read
        result, data = mail.fetch(num, "(RFC822)")
        assert result == "OK", "Error2 during get_code_from_email: %s" % result
        msg = email.message_from_string(data[0][1].decode())
        payloads = msg.get_payload()
        if not isinstance(payloads, list):
            payloads = [msg]
        code = None
        for payload in payloads:
            body = payload.get_payload(decode=True).decode()
            if "<div" not in body:
                continue
            match = re.search(">([^>]*?({u})[^<]*?)<".format(u=username), body)
            if not match:
                continue
            print("Match from email:", match.group(1))
            match = re.search(r">(\d{6})<", body)
            if not match:
                print('Skip this email, "code" not found')
                continue
            code = match.group(1)
            if code:
                return code
    return False

All challenges solved in the module challenge.py

Automatic submission code from SMS/Email in examples here