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
удачи :)