Я пытаюсь использовать Instagram API, но это действительно непросто.
Согласно документации API, код должен быть извлечен, чтобы получить токен доступа, а затем выполнить запросы к API-интерфейсу Instagram.
Но после нескольких попыток мне это не удалось.
Я уже хорошо настроил настройки в https://www.instagram.com/developer
Я вызываю url api.instagram.com/oauth/authorize/?client_id=[CLIENT_ID]&redirect_uri=[REDIRECT_URI]&response_type=code
с curl
, но у меня нет перенаправления uri
с кодом в ответ.
Не могли бы вы мне помочь ;)!
Я бы порекомендовал вам использовать одну из существующих клиентских библиотек PHP-instagram, таких как https://github.com/cosenary/Instagram-PHP-API
Я сделал это не так давно, вот хорошая ссылка:
https://auth0.com/docs/connections/social/instagram
Дайте мне знать, если это поможет!
Я сделал этот код, надеюсь, у него нет ошибки, но я просто сделал это для usecase, как вы хотели
Вот код, я объясню ниже, как работает этот код.
$authorization_url = "https://api.instagram.com/oauth/authorize/?client_id=".$instagram_client_id."&redirect_uri=".$your_website_redirect_uri."&response_type=code"; $username='ig_username'; $password='ig_password'; $_defaultHeaders = array( 'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0', 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language: en-US,en;q=0.5', 'Accept-Encoding: ', 'Connection: keep-alive', 'Upgrade-Insecure-Requests: 1', 'Cache-Control: max-age=0' ); $ch = curl_init(); $cookie='/application/'.strtoupper(VERSI)."instagram_cookie/instagram.txt"; curl_setopt( $ch, CURLOPT_POST, 0 ); curl_setopt( $ch, CURLOPT_HTTPGET, 1 ); if($this->token!==null){ array_push($this->_defaultHeaders,"Authorization: ".$this->token); } curl_setopt( $ch, CURLOPT_HTTPHEADER, $this->_defaultHeaders); curl_setopt( $ch, CURLOPT_HEADER, true); curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); curl_setopt( $ch, CURLOPT_COOKIEFILE,getcwd().$cookie ); curl_setopt( $ch, CURLOPT_COOKIEJAR, getcwd().$cookie ); curl_setopt($this->curlHandle,CURLOPT_URL,$url); curl_setopt($this->curlHandle,CURLOPT_FOLLOWLOCATION,true); $result = curl_exec($this->curlHandle); $redirect_uri = curl_getinfo($this->curlHandle, CURLINFO_EFFECTIVE_URL); $form = explode('login-form',$result)[1]; $form = explode("action=\"",$form)[1]; // vd('asd',$form); $action = substr($form,0,strpos($form,"\"")); // vd('action',$action); $csrfmiddlewaretoken = explode("csrfmiddlewaretoken\" value=\"",$form); $csrfmiddlewaretoken = substr($csrfmiddlewaretoken[1],0,strpos($csrfmiddlewaretoken[1],"\"")); //finish getting parameter $post_param['csrfmiddlewaretoken']=$csrfmiddlewaretoken; $post_param['username']=$username; $post_param['password']=$password; //format instagram cookie from vaha's answer https://stackoverflow.com/questions/26003063/instagram-login-programatically preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $result, $matches); $cookieFileContent = ''; foreach($matches[1] as $item) { $cookieFileContent .= "$item; "; } $cookieFileContent = rtrim($cookieFileContent, '; '); $cookieFileContent = str_replace('sessionid=; ', '', $cookieFileContent); $cookie=getcwd().'/application/'.strtoupper(VERSI)."instagram_cookie/instagram.txt"; $oldContent = file_get_contents($cookie); $oldContArr = explode("\n", $oldContent); if(count($oldContArr)) { foreach($oldContArr as $k => $line) { if(strstr($line, '# ')) { unset($oldContArr[$k]); } } $newContent = implode("\n", $oldContArr); $newContent = trim($newContent, "\n"); file_put_contents( $cookie, $newContent ); } // end format $useragent = "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0"; $arrSetHeaders = array( 'origin: https://www.instagram.com', 'authority: www.instagram.com', 'upgrade-insecure-requests: 1', 'Host: www.instagram.com', "User-Agent: $useragent", 'content-type: application/x-www-form-urlencoded', 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language: en-US,en;q=0.5', 'Accept-Encoding: deflate, br', "Referer: $redirect_uri", "Cookie: $cookieFileContent", 'Connection: keep-alive', 'cache-control: max-age=0', ); $ch = curl_init(); curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__)."/".$cookie); curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__)."/".$cookie); curl_setopt($ch, CURLOPT_USERAGENT, $useragent); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_HTTPHEADER, $arrSetHeaders); curl_setopt($ch, CURLOPT_URL, $this->base_url.$action); curl_setopt($ch, CURLOPT_REFERER, $redirect_uri); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_param)); sleep(5); $page = curl_exec($ch); preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $page, $matches); $cookies = array(); foreach($matches[1] as $item) { parse_str($item, $cookie1); $cookies = array_merge($cookies, $cookie1); } var_dump($page);
с$authorization_url = "https://api.instagram.com/oauth/authorize/?client_id=".$instagram_client_id."&redirect_uri=".$your_website_redirect_uri."&response_type=code"; $username='ig_username'; $password='ig_password'; $_defaultHeaders = array( 'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0', 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language: en-US,en;q=0.5', 'Accept-Encoding: ', 'Connection: keep-alive', 'Upgrade-Insecure-Requests: 1', 'Cache-Control: max-age=0' ); $ch = curl_init(); $cookie='/application/'.strtoupper(VERSI)."instagram_cookie/instagram.txt"; curl_setopt( $ch, CURLOPT_POST, 0 ); curl_setopt( $ch, CURLOPT_HTTPGET, 1 ); if($this->token!==null){ array_push($this->_defaultHeaders,"Authorization: ".$this->token); } curl_setopt( $ch, CURLOPT_HTTPHEADER, $this->_defaultHeaders); curl_setopt( $ch, CURLOPT_HEADER, true); curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); curl_setopt( $ch, CURLOPT_COOKIEFILE,getcwd().$cookie ); curl_setopt( $ch, CURLOPT_COOKIEJAR, getcwd().$cookie ); curl_setopt($this->curlHandle,CURLOPT_URL,$url); curl_setopt($this->curlHandle,CURLOPT_FOLLOWLOCATION,true); $result = curl_exec($this->curlHandle); $redirect_uri = curl_getinfo($this->curlHandle, CURLINFO_EFFECTIVE_URL); $form = explode('login-form',$result)[1]; $form = explode("action=\"",$form)[1]; // vd('asd',$form); $action = substr($form,0,strpos($form,"\"")); // vd('action',$action); $csrfmiddlewaretoken = explode("csrfmiddlewaretoken\" value=\"",$form); $csrfmiddlewaretoken = substr($csrfmiddlewaretoken[1],0,strpos($csrfmiddlewaretoken[1],"\"")); //finish getting parameter $post_param['csrfmiddlewaretoken']=$csrfmiddlewaretoken; $post_param['username']=$username; $post_param['password']=$password; //format instagram cookie from vaha's answer https://stackoverflow.com/questions/26003063/instagram-login-programatically preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $result, $matches); $cookieFileContent = ''; foreach($matches[1] as $item) { $cookieFileContent .= "$item; "; } $cookieFileContent = rtrim($cookieFileContent, '; '); $cookieFileContent = str_replace('sessionid=; ', '', $cookieFileContent); $cookie=getcwd().'/application/'.strtoupper(VERSI)."instagram_cookie/instagram.txt"; $oldContent = file_get_contents($cookie); $oldContArr = explode("\n", $oldContent); if(count($oldContArr)) { foreach($oldContArr as $k => $line) { if(strstr($line, '# ')) { unset($oldContArr[$k]); } } $newContent = implode("\n", $oldContArr); $newContent = trim($newContent, "\n"); file_put_contents( $cookie, $newContent ); } // end format $useragent = "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0"; $arrSetHeaders = array( 'origin: https://www.instagram.com', 'authority: www.instagram.com', 'upgrade-insecure-requests: 1', 'Host: www.instagram.com', "User-Agent: $useragent", 'content-type: application/x-www-form-urlencoded', 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language: en-US,en;q=0.5', 'Accept-Encoding: deflate, br', "Referer: $redirect_uri", "Cookie: $cookieFileContent", 'Connection: keep-alive', 'cache-control: max-age=0', ); $ch = curl_init(); curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__)."/".$cookie); curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__)."/".$cookie); curl_setopt($ch, CURLOPT_USERAGENT, $useragent); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_HTTPHEADER, $arrSetHeaders); curl_setopt($ch, CURLOPT_URL, $this->base_url.$action); curl_setopt($ch, CURLOPT_REFERER, $redirect_uri); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_param)); sleep(5); $page = curl_exec($ch); preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $page, $matches); $cookies = array(); foreach($matches[1] as $item) { parse_str($item, $cookie1); $cookies = array_merge($cookies, $cookie1); } var_dump($page);
Шаг 1: Сначала нам нужно перейти на страницу входа в систему.
Мы можем получить к нему доступ, используя curl get, с CURLOPT_FOLLOWLOCATION
установленным в true, чтобы мы были перенаправлены на страницу входа в систему, и мы получили доступ к нашему URL-адресу авторизации приложения.
$authorization_url = "https://api.instagram.com/oauth/authorize/?client_id=".$instagram_client_id."&redirect_uri=".$your_website_redirect_uri."&response_type=code"; $username='ig_username';
Это шаг один из этой документации Instagram здесь
Теперь результат первого получить curl у нас есть страница ответа и ее uri страницы, которую мы храним в $ redirect_uri, это должно быть необходимо и помещено в заголовок referer, когда мы делаем http-сообщение для входа.
После получения результата login_page нам нужно отформатировать файл cookie, я знаю это и использую какой-то код из vaha, ответьте здесь на ответ vaha
Шаг 2. После того, как мы получим страницу login_page, мы выберем URL-адрес действия, извлеките csrfmiddlewaretoken
скрытое значение ввода.
После того, как мы его получим, мы сделаем параметр для входа в систему.
Мы должны установить перенаправление uri и не забывать cookiejar и другие настройки заголовков, как указано выше.
После успешной отправки сообщения параметра для входа в систему Instagram вызовет ваш перенаправление uri, например https://www.yourwebsite.com/save_instagram_code
там вы должны использовать или сохранить свой код instagram, чтобы снова получить токен доступа с помощью curl (только объясните, как получить код: D)
Я сделаю это за короткое время, я обновлю код, который я тестировал и работаю, если у меня есть время, не стесняйтесь предлагать редактирование работоспособного кода или лучшее объяснение.