Ejemplo n.º 1
0
def __verifyLogin(bot: InstaBot):
    r = bot.s.get("https://www.instagram.com/")
    bot.csrftoken = re.search('(?<="csrf_token":")\w+', r.text).group(0)
    bot.s.cookies["csrftoken"] = bot.csrftoken
    bot.s.headers.update({"X-CSRFToken": bot.csrftoken})
    finder = r.text.find(bot.user_login)
    if finder != -1:
        bot.user_id = bot.get_user_id_by_username(bot.user_login)
        bot.login_status = True
        bot.logger.info(f"{bot.user_login} login success!\n")
        if bot.session_file is not None:
            bot.logger.info(
                f"Saving cookies to session file {bot.session_file}")
            with open(bot.session_file, "wb") as output:
                bot.s.cookies.__user_name = bot.user_login
                pickle.dump(bot.s.cookies, output, pickle.HIGHEST_PROTOCOL)
        return True
    else:
        bot.login_status = False
        bot.logger.error("Login error! Check your login data!")
        if bot.session_file and os.path.isfile(bot.session_file):
            try:
                os.remove(bot.session_file)
            except:
                bot.logger.info(
                    "Could not delete session file. Please delete manually")

        bot.prog_run = False
        return False
Ejemplo n.º 2
0
def login_with_password(bot: InstaBot, username=None, password=None):
    bot.user_login = username
    successfulLogin = False
    bot.logger.info("Trying to login as {}...".format(username))
    bot.login_post = {
        "username": username,
        "password": password,
    }
    r = bot.s.get(bot.url)
    csrf_token = re.search('(?<="csrf_token":")\w+', r.text).group(0)
    bot.s.headers.update({"X-CSRFToken": csrf_token})
    time.sleep(5 * random.random())
    login = bot.s.post(bot.url_login,
                       data=bot.login_post,
                       allow_redirects=True)
    if login.status_code not in (200, 400):
        # Handling Other Status Codes and making debug easier!!
        bot.logger.debug("Login Request didn't return 200 as status code!")
        bot.logger.debug("Here is more info for debugging or creating an issue"
                         "==============="
                         "Response Status:{login.status_code}"
                         "==============="
                         "Response Content:{login.text}"
                         "==============="
                         "Response Header:{login.headers}"
                         "===============")
        return False
    else:
        bot.logger.debug("Login request succeeded ")

    loginResponse = login.json()
    try:
        bot.csrftoken = login.cookies["csrftoken"]
        bot.s.headers.update({"X-CSRFToken": bot.csrftoken})
    except Exception as exc:
        bot.logger.warning("Something wrong with login")
        bot.logger.debug(login.text)
        bot.logger.exception(exc)
        return False
    if loginResponse.get("errors"):
        bot.logger.error(
            "Something is wrong with Instagram! Please try again later...")
        bot.logger.error(loginResponse["errors"]["error"])
        return False
    elif loginResponse.get("message") == "checkpoint_required":
        try:
            if "instagram.com" in loginResponse["checkpoint_url"]:
                challenge_url = loginResponse["checkpoint_url"]
            else:
                challenge_url = f"https://instagram.com{loginResponse['checkpoint_url']}"
            bot.logger.info(f"Challenge required at {challenge_url}")
            with bot.s as clg:
                clg.headers.update({
                    "Accept":
                    "*/*",
                    "Accept-Language":
                    bot.config.get("accept_language"),
                    "Accept-Encoding":
                    "gzip, deflate, br",
                    "Connection":
                    "keep-alive",
                    "Host":
                    "www.instagram.com",
                    "Origin":
                    "https://www.instagram.com",
                    "User-Agent":
                    bot.user_agent,
                    "X-Instagram-AJAX":
                    "1",
                    "Content-Type":
                    "application/x-www-form-urlencoded",
                    "x-requested-with":
                    "XMLHttpRequest",
                })
                # Get challenge page
                challenge_request_explore = clg.get(challenge_url)

                # Get CSRF Token from challenge page
                challenge_csrf_token = re.search(
                    '(?<="csrf_token":")\w+',
                    challenge_request_explore.text).group(0)
                # Get Rollout Hash from challenge page
                rollout_hash = re.search(
                    '(?<="rollout_hash":")\w+',
                    challenge_request_explore.text).group(0)

                # Ask for option 1 from challenge, which is usually Email or Phone
                challenge_post = {"choice": 1}

                # Update headers for challenge submit page
                clg.headers.update({"X-CSRFToken": challenge_csrf_token})
                clg.headers.update({"Referer": challenge_url})

                # Request instagram to send a code
                challenge_request_code = clg.post(challenge_url,
                                                  data=challenge_post,
                                                  allow_redirects=True)

                # User should receive a code soon, ask for it
                challenge_userinput_code = input(
                    "Challenge Required.\n\nEnter the code sent to your mail/phone: "
                )
                challenge_security_post = {
                    "security_code": int(challenge_userinput_code)
                }

                complete_challenge = clg.post(
                    challenge_url,
                    data=challenge_security_post,
                    allow_redirects=True,
                )
                if complete_challenge.status_code != 200:
                    bot.logger.info("Entered code is wrong, Try again later!")
                    return
                bot.csrftoken = complete_challenge.cookies["csrftoken"]
                bot.s.headers.update({
                    "X-CSRFToken": bot.csrftoken,
                    "X-Instagram-AJAX": "1"
                })
                successfulLogin = complete_challenge.status_code == 200

        except Exception as err:
            bot.logger.debug(f"Login failed, response: \n\n{login.text} {err}")
            return False
    elif loginResponse.get("authenticated") is False:
        bot.logger.error("Login error! Check your login data!")
        return False
    else:
        rollout_hash = re.search('(?<="rollout_hash":")\w+', r.text).group(0)
        bot.s.headers.update({"X-Instagram-AJAX": rollout_hash})
        bot.login_status = True
    bot.s.cookies["csrftoken"] = bot.csrftoken
    bot.s.cookies["ig_vw"] = "1536"
    bot.s.cookies["ig_pr"] = "1.25"
    bot.s.cookies["ig_vh"] = "772"
    bot.s.cookies["ig_or"] = "landscape-primary"
    return __verifyLogin(bot)