Статьи

Завоевание Instagram с помощью PHP и API Instagram

API Instagram позволяет нам взаимодействовать с такими данными, как информация о пользователе, медиа (фотографии и видео), лайки, комментарии и теги. Например, вы можете искать медиа в определенном месте и фильтровать результаты по времени. API также позволяет нам оставлять комментарии или как конкретные средства массовой информации. На данный момент только загрузка медиа не поддерживается. Вы всегда можете посмотреть документацию по конечным точкам API, если хотите узнать о полной функциональности.

API-вызовы и ограничения

Существует два типа вызовов API, которые вы можете выполнять с помощью Instagram API: Неаутентифицированные и Аутентифицированные. Для неаутентифицированных вызовов API требуется только идентификатор клиента, а для аутентифицированных вызовов API используется OAuth, в частности OAuth 2.0. Если вы не знаете, что такое OAuth, ознакомьтесь со статьей «Введение в OAuth 2», посвященной DigitalOcean .

Прежде чем мы продолжим, важно понять, что у этого API есть ограничения. На момент написания этой статьи вы можете выполнить только 5000 аутентифицированных вызовов на один токен и 5000 неаутентифицированных вызовов API. Это независимо от того, какую конечную точку вы используете, хотя есть определенные конечные точки, каждая из которых имеет свои ограничения. Если хотите узнать больше, вы можете ознакомиться с разделом об ограничениях для конечной точки на странице ограничений .

Регистрация приложения

Само собой разумеется, вам нужно иметь свою собственную учетную запись Instagram для работы с Instagram API. Затем зарегистрируйтесь как разработчик .

instagram developer signup

Далее мы должны зарегистрировать заявку. Мы можем сделать это, перейдя на страницу разработчика Instagram и нажав кнопку «Зарегистрировать приложение». Если вы никогда ранее не создавали приложение, вы будете перенаправлены на страницу регистрации приложения, которая выглядит следующим образом:

register new application

Если вы уже создали приложение ранее, оно приведет вас на страницу управления приложениями, где перечислены все ваши существующие приложения. Оттуда все, что вам нужно сделать, это нажать на кнопку «Зарегистрировать нового клиента», которая приведет вас к той же странице, что и выше.

Как только вы окажетесь на странице регистрации приложения, заполните все поля. URL-адрес веб-сайта — это URL-адрес веб-сайта вашего приложения. URI перенаправления — это URL-адрес, по которому пользователь будет перенаправлен после предоставления доступа к вашему приложению. Это должен быть URL-адрес HTTPS. Если у вас нет HTTPS-сервера, вы можете использовать Apache и Ngrok . Загрузите версию ngrok для вашей операционной системы, распакуйте ее и затем выполните следующую команду в выбранном вами каталоге установки. Замените 80 на порт, на котором работает ваш сервер:

 ngrok http 80 

Для этого нужно назначить URL-адрес HTTP и HTTPS вашему серверу Apache, работающему на localhost. Затем вы можете использовать HTTPS URL для тестирования. Используйте этот URL для полей URL-адреса веб-сайта и URI перенаправления на странице регистрации приложения.

Как только это будет сделано, просто нажмите кнопку «Регистрация», чтобы завершить регистрацию. Если все прошло хорошо, вас встретят с идентификатором клиента и секретом клиента. Мы будем использовать их позже для выполнения запросов к API.

Консоль API

Вы можете использовать консоль API для воспроизведения запросов, которые вы можете сделать с помощью Instagram API. Чтобы использовать консоль API, раскройте меню выбора метода API в левой части консоли. Оттуда вы можете выбрать метод, который вы хотите использовать для вашего запроса. Большинство методов требуют аутентификации, поэтому вам нужно выбрать OAuth 2 в раскрывающемся меню Аутентификация, а затем войти в свою существующую учетную запись Instagram. Обратите внимание, что любые ваши запросы выполняются от вашего имени. Это означает, что любое действие, которое вы делаете, например, добавление фотографии или подписка на пользователя, будет выполняться вашей учетной записью.

API Console

Консоль API довольно понятна. Вы можете выбрать, какой тип HTTP-запроса (GET, POST, DELETE, PUT) вы хотите использовать, введите URL-адрес, на который будет отправлен запрос, и введите необходимые параметры запроса. Вы можете увидеть фактический запрос и ответ, которые были сделаны после нажатия кнопки «Отправить».

Выполнение API-вызовов с помощью PHP

Теперь мы готовы взаимодействовать с API с помощью PHP. Мы можем сделать это с помощью Guzzle , HTTP-клиента для PHP. Установите его с помощью Composer:

 composer require  guzzlehttp / guzzle :~ 5.0 

При желании вы можете установить Slim PHP Framework, если хотите следовать демонстрационному проекту. Обратите внимание, что мы используем версию 5 Guzzle, потому что версия 6 основана на PSR-7 и, таким образом, не имеет многих практических возможностей прошлых итераций.

 composer require  slim / slim 

Если вы хотите использовать Slim, вам нужно установить Twig, а также Slim Views, чтобы вы могли использовать Twig из Slim.

 composer require  twig / twig composer require  slim / views 

Как только это будет сделано, создайте новый файл PHP и добавьте следующий код:

 <? php require   'vendor/autoload.php' ; 

 use   GuzzleHttp \Client ; $client =   new   Client (); 

Затем добавьте идентификатор клиента, секрет клиента и URL-адрес перенаправления вашего приложения Instagram.

 define ( "CLIENT_ID" ,   "YOUR CLIENT ID" ); define ( "CLIENT_SECRET" ,   "YOUR CLIENT SECRET" ); define ( "REDIRECT_URL" ,   "YOUR REDIRECT URL" ); 

Настройте Slim, чтобы использовать Twig для обработки представлений. Также включите отчеты об ошибках и установите каталог для кэширования представлений:

 app =   new  \Slim\Slim ( array ( 
     'view'   =>   new  \Slim\Views\Twig ()   //use twig for handling views 
 )); $view =  $app -> view (); $view -> parserOptions =  array ( 
     'debug'   =>   true ,   //enable error reporting in the view 
     'cache'   =>  dirname ( __FILE__ )   .   '/cache'   //set directory for caching views 
 ); 

Получение токена доступа

Чтобы получить токен доступа, нам сначала нужно создать URL для входа. URL-адрес входа указывает на страницу, которая просит пользователя предоставить разрешение приложению. Базовый URL для входа в систему: https://api.instagram.com/oauth/authorize . И затем нам нужно передать client_id , redirect_uri , scope и response_type качестве параметров запроса.

 https : //api.instagram.com/oauth/authorize?client_id={$client_id}&redirect_uri={$redirect_url}&scope=basic&response_type=code 

Вы уже знаете, что такое client_id и redirect_url , поэтому давайте поговорим о области scope и client_id response_type .

  • scope — здесь вы указываете, что может делать ваше приложение. В настоящее время доступны следующие области действия: basic , comments , relationships и likes . basic предоставляется по умолчанию. Это дает вам доступ на чтение ко всем конечным точкам API. Другие 3, однако, требуют, чтобы ваше приложение было отправлено на проверку, поскольку оно позволяет вашему приложению ставить лайки, комментировать, подписываться или отписываться от конкретного пользователя.

  • response_type — тип ответа, который мы получим, как только пользователь предоставит разрешение приложению. На стороне сервера это должен быть code а на стороне клиента — token . Мы в основном работаем на сервере, поэтому это должен быть code . Это означает, что код авторизации возвращается после предоставления разрешения.

Как только пользователь предоставит разрешение на приложение, он будет перенаправлен на указанный URL-адрес перенаправления. Код авторизации передается вместе с этим URL в качестве параметра запроса. Затем нам нужно сделать POST запрос к конечной точке /oauth/access_token , дополнительно передавая идентификатор клиента, секрет клиента, тип предоставления, URL-адрес перенаправления и код. Тип предоставления — это способ получения токена доступа после того, как пользователь предоставил разрешение вашему приложению. В этом случае мы используем authorization_code . Это код, который передается как параметр запроса в URL перенаправления. Как только запрос сделан, мы конвертируем ответ из JSON в массив, вызывая метод json для ответа. Наконец, мы визуализируем представление.

 $app -> get ( '/login' ,   function   ()   use   ( $app ,  $client )   { $data =  array (); $login_url =   '' ; 

     if ( $app -> request -> get ( 'code' )){ $code =  $app -> request -> get ( 'code' ); $response =  $client -> post ( 'https://api.instagram.com/oauth/access_token' ,  array ( 'body'   =>  array ( 
             'client_id'   =>  CLIENT_ID , 
             'client_secret'   =>  CLIENT_SECRET , 
             'grant_type'   =>   'authorization_code' , 
             'redirect_uri'   =>  REDIRECT_URL , 
             'code'   =>  $code ))); $data =  $response -> json (); 

     } else { $login_url =   "https://api.instagram.com/oauth/authorize?client_id={$client_id}&redirect_uri={$redirect_url}&scope=basic&response_type=code" ; 

     } $app -> render ( 'home.php' ,  array ( 'data'   =>  $data ,   'login_url'   =>  $login_url )); 

 }); 

Представления в Slim хранятся в каталоге templates по умолчанию. Вот содержимое представления home.php .

 {%   if  login_url %} 
 < a href = "{{ login_url }}" > login with  instagram </ a > 
 {%   else   %} 
     <div> 
         < img src = "{{ data.user.profile_picture }}"  alt = "{{ data.user.username }}" > 
     </ div > 
     <ul> 
         <li> username :   {{  data . user . username }}</ li > 
         <li> bio :   {{  data . user . bio }}</ li > 
         <li> website :   {{  data . user . website }}</ li > 
         <li> id :   {{  data . user . id }}</ li > 
         <li> access token :   {{  data . access_token }}</ li > 
     </ ul > 
 {%  endif %} 

Теперь вы можете извлечь токен доступа и сохранить его в безопасном месте. Instagram не упомянул, как долго продлится токен доступа. Вся документация гласит, что срок ее действия истекает в будущем . Поэтому нам нужно обработать событие, когда срок действия токена истекает. Вы можете сделать это, проверив error_type под meta элементом в ответе. Если значение OAuthAccessTokenError , то это означает, что ваш токен доступа истек. Вам нужно будет проверить этот элемент только в том случае, если code в meta элементе имеет значение, отличное от 200. 200 означает ОК, как и код состояния HTTP. 400 означает ошибку.

Теперь мы можем делать аутентифицированные вызовы API. Сначала попробуем найти последние фотографии, сделанные в Ниагарском водопаде, с помощью поиска по тегам. Помните, что в тегах нет пробелов, поэтому мы должны придерживаться camelCase:

 $app -> get ( '/tags/search' ,   function ()   use ( $app ,  $client ,  $access_token )   { $tag =   'niagaraFalls' ; $response =  $client -> get ( "https://api.instagram.com/v1/tags/{$tag}/media/recent?access_token={$access_token}" ); $results =  $response -> json (); $app -> render ( 'images.php' ,  array ( 'results'   =>  $results )); 

 }); 

Представление images.php просто просматривает все возвращаемые результаты и извлекает URL изображения с низким разрешением. Затем мы используем это как источник для тега изображения.

 {%   for  row in  results . data %} 
     < img src = "{{ row.images.low_resolution.url }}" >  
 {%  endfor %} 

По умолчанию Instagram возвращает максимум 20 фотографий на запрос. Однако вы можете указать count качестве одного из параметров запроса, чтобы увеличить или ограничить количество возвращаемых фотографий.

Если вы не уверены, существует ли используемый вами тег, вы можете сначала выполнить поиск по тегу, а затем использовать первый полученный результат:

 $app -> get ( '/tags/search-with-tagvalidation' ,   function ()   use ( $app ,  $client ,  $access_token )   { $query =   'Niagara Falls' ; $response =  $client -> get ( "https://api.instagram.com/v1/tags/search?access_token={$access_token}&q={$query}" ); $result =  $response -> json (); 

     if (! empty ( $result [ 'data' ])){ $tag =  $result [ 'data' ][ 0 ][ 'name' ]; $response =  $client -> get ( "https://api.instagram.com/v1/tags/{$tag}/media/recent?access_token={$access_token}" ); $results =  $response -> json (); $app -> render ( 'images.php' ,  array ( 'results'   =>  $results )); 
     } else { echo 'no results' ; 
     } 

 }); 

Фид пользователей

Доступ к каналу пользователя можно получить, отправив запрос GET конечной точке /users/self/feed :

 $app -> get ( '/user/feed' ,   function ()   use ( $app ,  $client ,  $access_token )   { $response =  $client -> get ( "https://api.instagram.com/v1/users/self/feed?access_token={$access_token}" ); $results =  $response -> json (); 

 }); 

Вот снимок экрана с примером ответа пользователя:

user feed

Поиск пользователей

Давайте попробуем найти пользователей, у которых в качестве имени указано «Ash Ketchum»:

 $app -> get ( '/user/search' ,   function ()   use ( $app ,  $client ,  $access_token )   { $query =   'Ash Ketchum' ; $response =  $client -> get ( "https://api.instagram.com/v1/users/search?q={$query}&access_token={$access_token}" ); $results =  $response -> json (); 

 }); 

Вызов выше возвращает username , id , full_name и full_name пользователя. Хотя не все результаты являются точными совпадениями.

Вот скриншот ответа, который я получил:

user search

Поиск фотографий в определенном месте

Вы также можете искать фотографии или видео, загруженные в определенном месте, с помощью API геокодирования Google. Мы используем API геокодирования Google для преобразования нашего запроса в координаты (широта и долгота), которые требуются API Instagram. Вот пример:

 $app -> get ( '/geo/search' ,   function ()   use ( $app ,  $client ,  $access_token )   { $query =   'banaue rice terraces' ; 

     //make a request to the Google Geocoding API $place_response =  $client -> get ( "http://maps.googleapis.com/maps/api/geocode/json?address={$query}&sensor=false" ); $place_result =  $place_response -> json (); 

     if ( $place_result [ 'status' ]   ==   'OK' ){ 

         //extract the lat and lng values $lat =  $place_result [ 'results' ][ 0 ][ 'geometry' ][ 'location' ][ 'lat' ]; $lng =  $place_result [ 'results' ][ 0 ][ 'geometry' ][ 'location' ][ 'lng' ]; 

         //make a request to the Instagram API using the lat and lng $response =  $client -> get ( "https://api.instagram.com/v1/media/search?access_token={$access_token}&lat={$lat}&lng={$lng}" ); $results =  $response -> json (); 

         if (! empty ( $results [ 'data' ])){ $app -> render ( 'images.php' ,  array ( 'results'   =>  $results )); 

         } else { echo 'no photos found' ; 
         } 

     } else { echo 'place not found' ; 
     } 

 }); 

Обратите внимание, что вы также можете указать distance , min_timestamp и max_timestamp до этой конечной точки для дальнейшей фильтрации результатов. Расстояние по умолчанию составляет 1 км, и вы можете указать до 5 км. min_timestamp и max_timestamp являются временными max_timestamp Unix для ограничения результатов фотографиями, которые были сделаны в течение определенного периода времени. Вы можете использовать Carbon, чтобы легко генерировать временные метки на основе пользовательских данных, таких как «вчера», «5 дней назад», «1 неделя назад».

пагинация

Возможно, вы заметили, что Instagram API уже облегчает нашу жизнь с нумерацией страниц. Если результаты определенного вызова API содержат следующую страницу, вы можете просто использовать значение next_url под элементом pagination на pagination в качестве URL-адреса, который будет использоваться при следующем запросе. Это позволяет легко получить доступ к следующей странице. Однако имейте в виду, что вам нужно сохранить id первого элемента на текущей странице, чтобы вы могли получить доступ к этой странице после перехода на следующую страницу.

PHP клиент

Если вы хотите сделать свою жизнь еще проще при работе с Instagram API, есть библиотека PHP Instagram-PHP-API, которая предоставляет удобные методы. Чтобы установить его, запустите composer require cosenary/instagram .

Как только это будет сделано, вы можете использовать его, добавив следующий код:

 use   MetzWeb \Instagram\Instagram ; $instagram =   new   Instagram ( array ( 
     'apiKey'   =>  CLIENT_ID , 
     'apiSecret'   =>  CLIENT_SECRET , 
     'apiCallback'   =>  REDIRECT_URL )); 

Вот несколько примеров.

Получение URL для входа

 $instagram -> getLoginUrl ( array ( 'basic' ,   'relationships' )); 

Аргумент массива является необязательным. Он содержит области, которые вы хотите использовать.

Получение токена доступа

Практически так же, как мы делали ранее, используя Guzzle, только в этот раз мы вызываем методы, и данные, которые нам нужны, становятся легко доступными.

 $app -> get ( '/login2' ,   function   ()   use   ( $app ,  $instagram )   { $login_url =  $instagram -> getLoginUrl ( array ( 'basic' ,   'likes' )); 

     if (! empty ( $_GET [ 'code' ])){ $code =  $_GET [ 'code' ]; $data =  $instagram -> getOAuthToken ( $code );   //get access token using the authorization code $instagram -> setAccessToken ( $data ); $access_token =  $instagram -> getAccessToken (); 

         //do anything you want with the access token 

     } else { $app -> render ( 'login.php' ,  array ( 'login_url'   =>  $login_url )); 
     } 

 }); 

Получение информации о пользователе

Вы можете получить информацию о пользователе, вызвав метод getUser . $user_id может быть опущен, если вы хотите получить только информацию о пользователе, $user_id в систему.

 $user_data =  $instagram -> getUser ( $user_id ); 

Laravel

Если вы используете Laravel, кто-то также создал Laravel Wrapper, который использует эту библиотеку. Вы можете проверить это здесь .

Вывод

В этом уроке мы узнали, как работать с API Instagram, используя HTTP-клиент Guzzle и клиент Instagram для PHP. Instagram API — это действительно хороший способ взаимодействия с данными пользователей Instagram. С его помощью вы можете создавать действительно интересные приложения.

Вы построили что-нибудь с помощью API? Вы предпочитаете Guzzle или Instagram PHP-библиотеку? Почему? Дайте нам знать об этом в комментариях!