@Akorolev

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

Добрый день.
Возникла проблема с авторизацией при публикации в Instagram.
12M89WFlGk6WmJ.jpg
Отладка отображает следующую ошибку: «Posting failed. User not logged in. Please call login () and then try again.».
Используя SSH socks5, я организовал прокси-сервер с сервером, с которого отправляются запросы Instagram, вошел в систему через веб-версию и подтвердил там, что я вошел, но в следующий раз ошибка появится снова.

Подскажите пожалуйста, как решить эту проблему.
Большое спасибо.
  • Вопрос задан
  • 919 просмотров
Пригласить эксперта
Ответы на вопрос 2
SilenceOfWinter
@SilenceOfWinter
та еще зажигалка...
если речь об OAuth, то очевидно что браузер должен использовать ту же проксю что и php код
Ответ написан
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.

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

Войдите, чтобы написать ответ

Похожие вопросы