• Как авторизоваться в Instagram через mgp25/Instagram-API?

    DimaLondon
    @DimaLondon
    Это происходит потому, что Instagram не доверяет вашему IP, с которого вы пытаетесь делать автопубликации. Обычно, когда эта ерунда, как на скриншоте, вылазит у вас в приложении или в web-версии, при автопубликации Инста отдает ошибку "Challenge required" (посмотрите логи).

    Для того, чтобы победить это, необходимо получить SMS от инсты и отправить ее с сервера в качестве подтверждения, что ваш робот - это не робот.

    Я сделал вот так:

    1) Т.к. в библиотеке mgp25/Instagram-API метод _setUser() приватный, вы не можете обратиться к нему извне. Поэтому делаем "прокладку": в классе Instagram() в файле Instagram-API\src\Instagram.php в самом начале класса добавьте публичный метод:
    public function changeUser( $username, $password )
    {
        $this->_setUser($username, $password);
    }


    2) Создайте отдельный файл (или метод в вашем контроллере, если используете ООП), который будет обрабатывать авторизацию. Он должен содержать следующий код:

    # код из SMS (возможно, вы иначе принимаете GET)
    $code = isset($_GET['code']) ? $_GET['code'] : false;
    
    # данные от аккаунта Instagram
    $username    = '******';
    $password    = '******';
    
    # папка с файлами данных авторизации робота (путь от корня сайта)
    $user_path      = app_path('Core/Classes/Instagram-API/sessions/'.$username);
    
    # временный файл с данными от Инсты
    $user_tmp_file  = $user_path.'/'.$username.'-custom-response.dat';
    
    
    # если код еще не отправлялся - его надо отправить
    if (empty($code))
    {
        
        # для начала ВАЖНО удалить старые файлы от предыдущих авторизаций
        if (file_exists($user_path.'/'.$username.'-settings.dat')) {
            unlink($user_path.'/'.$username.'-settings.dat');
        }
        
        if (file_exists($user_path.'/'.$username.'-cookies.dat')) {
            unlink($user_path.'/'.$username.'-cookies.dat');
        }
        
        
        \InstagramAPI\Instagram::$allowDangerousWebUsageAtMyOwnRisk = true;
        $ig = new \InstagramAPI\Instagram(false, false);
        
        
        # затем ВАЖНО произвести попытку авторизации без старых данных авторизации (которые только что удалили)
        try {
            $instagram_login = $ig->login($username, $password);
            
        } catch (\Exception $e) {
            
            # Если IG вернул ошибку "Challenge required"
            if ( ($check = mb_strpos( mb_strtolower($e->getMessage()), 'challenge required') ) !== false) {
                
                # отправляем SMS
                $custom_response = $ig->request(mb_substr(
                    $e->getResponse()->
                    getChallenge()->
                    getApiPath()
                , 1))->
                setNeedsAuth(false)->
                addPost("choice", 0)->
                getDecodedResponse();
                
                # сохраняем временные данные, которые пришли от Инсты при отправке SMS (тут нам важен "nonce_code")
                @mkdir($user_path, 0777);
                file_put_contents($user_tmp_file, json_encode($custom_response), LOCK_EX);
                
                var_dump($custom_response);
            }
        }
        
    # иначе, если вы уже отправили код и передали его в GET, то отправляем Инсте ответ:
    } else {
        
        if (file_exists($user_tmp_file)) {
            $tmp_data = json_decode(file_get_contents($user_tmp_file), true);
            
            
            \InstagramAPI\Instagram::$allowDangerousWebUsageAtMyOwnRisk = true;
            $ig = new \InstagramAPI\Instagram(false, false);
            
            try {
                # изменяем данные аккаунта нашим методом changeUser()
                $ig->changeUser($username, $password);
                
                # и шлем инсте ответ с кодом из SMS
                $custom_response = $ig->request("challenge/".$tmp_data['user_id']."/".$tmp_data['nonce_code']."/")->setNeedsAuth(false)->addPost("security_code", $code)->getDecodedResponse();
                        
                var_dump($custom_response);
                
            } catch (Exception $e) {
                exit("Error ".$e->getMessage());
            }
            
        }
    }


    Работает это так: к примеру, этот ваш код работает по адресу /ig_auth
    1) Вы дёргаете этот адрес, ваш сервер дёргает Инсту и она отправляет вам SMS с кодом подтверждения на номер, который привязан к вашему аккаунту.
    2) Получаете SMS с кодом и дёргаете адрес /ig_auth?code=SMS_КОД (или как там у вас построена маршрутизация). При этом код отправляется обратно в Инсту. Та переносит ваш IP в список доверенных.
    Profit.

    Еще совет: не юзайте прокси. Инста их ОЧЕНЬ не любит и распознаёт на раз-два. Это грозит санкциями, вплоть до вечной блокировки аккаунта.
    Ответ написан
    1 комментарий