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