def handle_challenge_result(self, challenge: Dict): """ Handle challenge result Parameters ---------- challenge: Dict Dict Returns ------- bool A boolean value """ messages = [] if "challenge" in challenge: """ Иногда в JSON есть вложенность, вместо {challege_object} приходит {"challenge": {challenge_object}} Sometimes there is nesting in JSON, instead of {challege_object} comes {"challenge": {challenge_object}} """ challenge = challenge["challenge"] challenge_type = challenge.get("challengeType") if challenge_type == "SelectContactPointRecoveryForm": """ Помогите нам удостовериться, что вы владеете этим аккаунтом Чтобы защитить свой аккаунт, запросите помощь со входом. {'message': '', 'challenge': {'challengeType': 'SelectContactPointRecoveryForm', 'errors': ['Select a valid choice. 1 is not one of the available choices.'], 'experiments': {}, 'extraData': {'__typename': 'GraphChallengePage', 'content': [{'__typename': 'GraphChallengePageHeader', 'description': None, 'title': 'Help Us Confirm You Own This Account'}, {'__typename': 'GraphChallengePageText', 'alignment': 'center', 'html': None, 'text': 'To secure your account, you need to request help logging in.'}, {'__typename': 'GraphChallengePageForm', 'call_to_action': 'Get Help Logging In', 'display': 'inline', 'fields': None, 'href': 'https://help.instagram.com/358911864194456'}]}, 'fields': {'choice': 'None'}, 'navigation': {'forward': '/challenge/8530598273/PlWAX2OMVk/', 'replay': '/challenge/replay/8530598273/PlWAX2OMVk/', 'dismiss': 'instagram://checkpoint/dismiss'}, 'privacyPolicyUrl': '/about/legal/privacy/', 'type': 'CHALLENGE'}, 'status': 'fail'} """ if "extraData" in challenge: messages += extract_messages(challenge) if "errors" in challenge: for error in challenge["errors"]: messages.append(error) raise SelectContactPointRecoveryForm(" ".join(messages), challenge=challenge) elif challenge_type == "RecaptchaChallengeForm": """ Example: {'message': '', 'challenge': { 'challengeType': 'RecaptchaChallengeForm', 'errors': ['Неправильная Captcha. Попробуйте еще раз.'], 'experiments': {}, 'extraData': None, 'fields': {'g-recaptcha-response': 'None', 'disable_num_days_remaining': -60, 'sitekey': '6LebnxwUAAAAAGm3yH06pfqQtcMH0AYDwlsXnh-u'}, 'navigation': {'forward': '/challenge/32708972491/CE6QdsYZyB/', 'replay': '/challenge/replay/32708972491/CE6QdsYZyB/', 'dismiss': 'instagram://checkpoint/dismiss'}, 'privacyPolicyUrl': '/about/legal/privacy/', 'type': 'CHALLENGE'}, 'status': 'fail'} """ raise RecaptchaChallengeForm(". ".join(challenge.get("errors", []))) elif challenge_type in ("VerifyEmailCodeForm", "VerifySMSCodeForm"): # Success. Next step return challenge elif challenge_type == "SubmitPhoneNumberForm": raise SubmitPhoneNumberForm(challenge=challenge) elif challenge_type: # Unknown challenge_type messages.append(challenge_type) if "errors" in challenge: messages.append("\n".join(challenge["errors"])) messages.append("(Please manual login)") raise ChallengeError(" ".join(messages)) elif challenge.get("type") == "CHALLENGE_REDIRECTION": """ Example: {'location': 'instagram://checkpoint/dismiss', 'status': 'ok', 'type': 'CHALLENGE_REDIRECTION'} """ raise ChallengeRedirection() return challenge
def challenge_resolve_simple(self, challenge_url: str) -> bool: """ Old type (through private api) challenge resolver Помогите нам удостовериться, что вы владеете этим аккаунтом Parameters ---------- challenge_url : str Challenge URL Returns ------- bool A boolean value """ step_name = self.last_json.get("step_name", "") if step_name == "delta_login_review": # IT WAS ME (by GEO) self._send_private_request(challenge_url, {"choice": "0"}) return True elif step_name in ("verify_email", "select_verify_method"): if step_name == "select_verify_method": """ {'step_name': 'select_verify_method', 'step_data': {'choice': '0', 'fb_access_token': 'None', 'big_blue_token': 'None', 'google_oauth_token': 'true', 'vetted_device': 'None', 'phone_number': '+7 *** ***-**-09', 'email': 'x****g@y*****.com'}, <------------- choice 'nonce_code': 'DrW8V4m5Ec', 'user_id': 12060121299, 'status': 'ok'} """ steps = self.last_json["step_data"].keys() challenge_url = challenge_url[1:] if "email" in steps: self._send_private_request( challenge_url, {"choice": ChallengeChoice.EMAIL}) elif "phone_number" in steps: self._send_private_request(challenge_url, {"choice": ChallengeChoice.SMS}) else: raise ChallengeError( f'ChallengeResolve: Choice "email" or "phone_number" (sms) not available to this account {self.last_json}' ) wait_seconds = 5 for attempt in range(24): code = self.challenge_code_handler(self.username, ChallengeChoice.EMAIL) if code: break time.sleep(wait_seconds) print( f'Code entered "{code}" for {self.username} ({attempt} attempts by {wait_seconds} seconds)' ) self._send_private_request(challenge_url, {"security_code": code}) # assert 'logged_in_user' in client.last_json assert self.last_json.get("action", "") == "close" assert self.last_json.get("status", "") == "ok" return True elif step_name == "": assert self.last_json.get("action", "") == "close" assert self.last_json.get("status", "") == "ok" return True elif step_name == "change_password": # Example: {'step_name': 'change_password', # 'step_data': {'new_password1': 'None', 'new_password2': 'None'}, # 'flow_render_type': 3, # 'bloks_action': 'com.instagram.challenge.navigation.take_challenge', # 'cni': 18226879502000588, # 'challenge_context': '{"step_name": "change_password", "cni": 18226879502000588, "is_stateless": false, "challenge_type_enum": "PASSWORD_RESET"}', # 'challenge_type_enum_str': 'PASSWORD_RESET', # 'status': 'ok'} wait_seconds = 5 for attempt in range(24): pwd = self.change_password_handler(self.username) if pwd: break time.sleep(wait_seconds) print( f'Password entered "{pwd}" for {self.username} ({attempt} attempts by {wait_seconds} seconds)' ) return self.bloks_change_password( pwd, self.last_json['challenge_context']) elif step_name == "selfie_captcha": raise ChallengeSelfieCaptcha(self.last_json) else: raise ChallengeUnknownStep( f'ChallengeResolve: Unknown step_name "{step_name}" for "{self.username}" in challenge resolver: {self.last_json}' ) return True
def challenge_resolve_simple(self, challenge_url: str) -> bool: """ Old type (through private api) challenge resolver Помогите нам удостовериться, что вы владеете этим аккаунтом Parameters ---------- challenge_url : str Challenge URL Returns ------- bool A boolean value """ step_name = self.last_json.get("step_name", "") if step_name == "delta_login_review": # IT WAS ME (by GEO) self._send_private_request(challenge_url, {"choice": "0"}) return True elif step_name in ("verify_email", "select_verify_method"): if step_name == "select_verify_method": """ {'step_name': 'select_verify_method', 'step_data': {'choice': '0', 'fb_access_token': 'None', 'big_blue_token': 'None', 'google_oauth_token': 'true', 'vetted_device': 'None', 'phone_number': '+7 *** ***-**-09', 'email': 'x****g@y*****.com'}, <------------- choice 'nonce_code': 'DrW8V4m5Ec', 'user_id': 12060121299, 'status': 'ok'} """ steps = self.last_json["step_data"].keys() if "email" in steps: self._send_private_request(challenge_url, {"choice": CHOICE_EMAIL}) elif "phone_number" in steps: self._send_private_request(challenge_url, {"choice": CHOICE_SMS}) else: raise ChallengeError( 'ChallengeResolve: Choice "email" or "phone_number" (sms) not available to this account %s' % self.last_json) wait_seconds = 5 for attempt in range(24): code = self.challenge_code_handler(self.username, CHOICE_EMAIL) if code: break time.sleep(wait_seconds) print('Enter code "%s" for %s (%d attempts by %d seconds)' % (code, self.username, attempt, wait_seconds)) self._send_private_request(challenge_url, {"security_code": code}) # assert 'logged_in_user' in client.last_json assert self.last_json.get("action", "") == "close" assert self.last_json.get("status", "") == "ok" return True elif step_name == "": assert self.last_json.get("action", "") == "close" assert self.last_json.get("status", "") == "ok" return True else: raise Exception( 'ChallengeResolve: Unknown step_name "%s" for "%s" in challenge resolver: %s' % (step_name, self.username, self.last_json)) return True