instagrapi.exceptions.UnknownError Код подтверждения

Я новичок в использовании instagrapi и хочу понять, есть ли способ автоматизировать процесс ввода кода подтверждения.

      from instagrapi import Client

cl = Client()
cl.login(ACCOUNT_USERNAME, ACCOUNT_PASSWORD)

user_id = cl.user_id_from_username("adw0rd")
medias = cl.user_medias(user_id, 20)

Каждый раз, когда я запускаю код, требуется код подтверждения, отправленный на мою электронную почту. Это неприемлемо для приложения, которое я хочу сделать.

1 ответ

вам не следует пытаться входить в систему каждый раз, это не человеческое поведение и подозрительно говорить об аренде - всегда пытайтесь войти в систему, используя сохраненную информацию о сеансе. вот пример из документации API; для первого входа:

      from instagrapi import Client

cl = Client()
cl.login(USERNAME, PASSWORD)
cl.dump_settings("session.json")

и при следующем входе в систему:

      from instagrapi import Client

cl = Client()
cl.load_settings("session.json")
cl.login (USERNAME, PASSWORD) # this doesn't actually login using username/password but uses the session
cl.get_timeline_feed() # check session

Таким образом, вы можете запретить Instagram каждый раз запрашивать код подтверждения. подробнее об этом и передовых методах:https://subzeroid.github.io/instagrapi/usage-guide/best-practices.html .

Теперь, когда дело доходит до извлечения проверочного кода, вы можете просто перехватить исключение «ChallengeRequired» и обработать его, используя библиотеки электронной почты и imaplib, например:

      def get_code_from_email(username):

            mail = imaplib.IMAP4_SSL('outlook.office365.com')
            mail.login(email_user, email_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

этот код внутри обработчика должен помочь. также посмотрите, как реализовать это внутри вашего кода, пожалуйста, обратитесь сюда:https://subzeroid.github.io/instagrapi/usage-guide/challenge_resolver.html

удачи :)

Другие вопросы по тегам