Статьи

Начало работы с API Instagram: конечные точки мультимедиа

Конечный продукт
Что вы будете создавать

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

Вы можете скачать код для каждого эпизода, используя ссылку на репозиторий GitHub на боковой панели. Возможно, вас также заинтересует моя серия из двух статей Tuts + « Поиск свидетелей потенциальных преступлений с помощью API социальных сетей» .

Код для этих руководств написан на PHP с использованием Yii Framework. Вы можете узнать больше о Yii в разделе Введение в Yii Framework (Tuts +) и в Программирование с помощью серии Yii2 (Tuts +) . Вы также можете легко адаптировать сегменты кода для своего собственного PHP-приложения.

Я участвую в обсуждениях. Если у вас есть вопрос или предложение по теме, пожалуйста, оставьте комментарий ниже. Вы также можете связаться со мной в Twitter @reifman или написать мне напрямую.

Давайте начнем с регистрации в качестве разработчика в Instagram.

Чтобы начать, посетите страницу API Instagram для разработчиков и нажмите Зарегистрировать приложение :

Instagram Привет Разработчики

Вам нужно зарегистрировать аккаунт разработчика:

Регистрация разработчика в Instagram

Затем вы можете зарегистрировать новое приложение, чтобы получить свой идентификатор клиента:

Instagram Регистрация нового клиента

На панели управления клиентами вы увидите свой идентификатор клиента и секрет клиента , поэтому запишите их:

Instagram Управление клиентами

Что касается API веб-служб, API Instagram является надежным и, по моему опыту, работает очень хорошо. Instagram предлагает несколько конечных точек API:

Обзор документации API Instagram и конечные точки

Для этого урока мы сосредоточимся на конечных точках Media:

Конечные точки СМИ API Instagram

С помощью конечных точек мультимедиа вы можете получить информацию о фото или видео из Instagram, сославшись на его идентификатор или шорткод по URL-адресу, например, 0EyZ53Ja9X по адресу https://instagram.com/p/0EyZ53Ja9X . Он также предоставляет возможности геоархии для поиска средств массовой информации, опубликованных в определенное время и в определенном месте, как мы это делали в разделе «Поиск свидетелей потенциальных преступлений с помощью API социальных сетей» . И, наконец, он позволяет вам получать популярные посты в Instagram.

Чтобы помочь вам начать работу и отлаживать, в Instagram есть консоль API от Apigee :

Консоль API Instagram от Apigee

Вы можете попробовать запросы к конечным точкам Media, используя консоль API. Очевидно, вы можете увидеть, насколько это полезно для работы со СМИ из популярного сервиса мобильной фотографии.

Давайте перейдем к установке нашего примера кода и настройке его для работы с клиентским приложением Instagram.

В этой серии я собираюсь продолжить использовать кодовую базу «Свидетели» из раздела «Поиск свидетелей потенциальных преступлений с помощью API социальных сетей» . Вы можете клонировать репозиторий GitHub, расположенный на боковой панели, чтобы запустить наш пример кода.

1
2
cd ~/Sites/eyew
https://github.com/link-in-sidebar/eyew.git

Вам нужно будет настроить локальную конфигурацию Apache. Я использую MAMP, так что это выглядит примерно так:

1
2
cd /Applications/MAMP/htdocs
ln -s ~/Sites/eyew/web /Applications/MAMP/htdocs/eyew

Вам нужно создать базу данных локально. Я использую PHPMyAdmin для создания одного графически:

Создайте свою базу данных очевидцев

Затем я создаю файл инициализации в /var/secure/eyew.ini со своими учетными данными базы данных, идентификаторами и ключами Instagram. Я описал этот процесс недавно в другом уроке Tuts +: Защита ваших ключей от GitHub .

Мой INI-файл выглядит так:

1
2
3
4
5
6
mysql_host=»localhost»
mysql_db=»eyew»
mysql_un=»xxxxxxxxx»
mysql_pwd=»xxxxxxxxxxxx»
instagram_client_id = «4xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7»
instagram_client_secret = «1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4»

Обновите ваш Composer и его библиотеки поставщиков:

1
2
sudo composer self-update
sudo composer update

Затем инициализируйте нашу базу данных. Первая миграция устанавливает пользовательские таблицы для нашего расширения Ymer2-User от разработчика Dmeroff , а вторая создает наши таблицы для конкретных приложений:

1
2
./yii migrate/up —migrationPath=@vendor/dektrium/yii2-user/migrations
./yii migrate/up

Опять же, вы можете узнать больше о настройке приложения Yii Framework из серии « Программирование с Yii2 для Tuts +».

Вот схема MySQL для нашей таблицы изображений Instagram — мы называем ее таблицей Грамма. Мы будем использовать его для хранения результатов геоисследований.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
class m150308_184606_create_gram_table extends Migration
{
    public function up()
    {
          $tableOptions = null;
          if ($this->db->driverName === ‘mysql’) {
              $tableOptions = ‘CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB’;
          }
 
          $this->createTable(‘{{%gram}}’, [
              ‘id’ => Schema::TYPE_PK,
              ‘moment_id’ => Schema::TYPE_INTEGER .
              ‘username’ => Schema::TYPE_STRING .
              ‘link’ => Schema::TYPE_STRING .
              ‘image_url’ => Schema::TYPE_STRING .
              ‘text’ => Schema::TYPE_TEXT .
              ‘created_time’ => Schema::TYPE_INTEGER .
              ‘created_at’ => Schema::TYPE_INTEGER .
              ‘updated_at’ => Schema::TYPE_INTEGER .
          ], $tableOptions);
      $this->addForeignKey(‘fk_gram_moment’, ‘{{%gram}}’, ‘moment_id’, ‘{{%moment}}’, ‘id’, ‘CASCADE’, ‘CASCADE’);
    }

Я переименовал образец приложения «Instapi», сокращение от Instagram API.

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

Домашняя страница примера кода API Instagram

Для реализации поиска по медиа в нашем приложении Instapi я использую PHP-пакет от Гален Гровера .

Во-первых, давайте реализуем поиск по media/popular . Мы запросим API и отобразим результаты в виде таблицы.

Я создал действие под названием Popular в GramController.php:

1
2
3
4
5
6
7
8
public function actionPopular()
   {
     $gram = new Gram();
     $media = $gram->searchPopular();
     return $this->render(‘popular’, [
         ‘media’ => $media,
     ]);
   }

Он вызывает searchPopular() в модели Gram.php:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
<?php
 
namespace app\models;
 
use Yii;
use yii\db\ActiveRecord;
use Instagram;
public function searchPopular() {
       $instagram = new Instagram\Instagram;
       $instagram->setClientID( \Yii::$app->params[‘instagram’][‘client_id’] );
       $media = $instagram->getPopularMedia();
       return $media;
     }

В /views/gram/popular.php мы настраиваем структуру таблицы HTML:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
 
use yii\helpers\Html;
 
/* @var $this yii\web\View */
/* @var $searchModel app\models\InstagramSearch */
/* @var $dataProvider yii\data\ActiveDataProvider */
 
$this->title = ‘Instagrams’;
$this->params[‘breadcrumbs’][] = $this->title;
?>
<div class=»instagram-index»>
  <table class=»table»>
      <thead>
      <tr class=»small-header»>
        <td>Image ID</td>
        <td>User</td>
         <td >Thumbnail</td>
         <td >Caption</td>
         <td >Created at</td>
    </tr>
     </thead>
<?php
  foreach ($media as $m) {
    echo $this->render(‘_item’, [
        ‘m’ => $m,
    ]);
  }
?>
</table>
 
</div>

и _item.php частичное представление _item.php для отображения отдельных результатов мультимедиа:

01
02
03
04
05
06
07
08
09
10
11
<tr>
  <td><a href=»/eyew/gram/lookup/?id=<?= $m->id ?>»><?= $m->id ?></a></td>
  <td><a href=»https://instagram.com/<?= $m->user->username ?>»><?= $m->user->username ?></a></td>
  <td><a href=»<?= $m->link ?>»><img src=»<?= $m->images->thumbnail->url ?>»></a></td>
  <td>
    <?php
    echo (isset($m->caption->text)?$m->caption->text:»);
    ?>
  </td>
  <td><?= $m->created_time ?></td>
</tr>

Вот результаты популярных запросов в Instagram. Идите вперед и обновите страницу в вашем приложении. Интересно посмотреть, что будет дальше.

Таблица популярных результатов Instagram Media

Я связал идентификатор медиа Instagram в первом столбце с действием контроллера, которое вызывает конечную точку медиа, которая дает нам больше информации:

1
2
3
4
5
6
public function actionLookup($id)
   {
     $gram = new Gram();
     $media = $gram->lookup($id);
     print_r($media);
   }

Вот функция поиска в модели Instagram:

1
2
3
4
5
6
public function lookup($id) {
       $instagram = new Instagram\Instagram;
       $instagram->setClientID( \Yii::$app->params[‘instagram’][‘client_id’] );
       $media = $instagram->getMedia( $id );
       return $media;
     }

Вот скриншот данных, сбрасываемых на экран:

Instagram API Медиа-информация сбрасывается на экран

Очевидно, что вы можете использовать и хранить эту информацию по своему усмотрению.

Теперь давайте поищем изображения из определенного времени и места. Для этого примера я рассмотрю наш пример очевидца.

Наша кодовая база позволяет вам определять момент как место и время. Он состоит из понятного дескриптора, местоположения (широта и долгота), времени начала и продолжительности (в минутах). В качестве моего первого примера я ищу пользователей Instagram, которые присутствовали на съемках видео Маклмора вечером в среду, 24 июля 2013 года, в ориентире Сиэтла Dick’s Drive In .

Используя Google Maps, я могу получить широту и долготу GPS для Дика. Это 47,6195 -122,321.

Дикс Драйв в Бродвее Сиэтл GPS в Google Maps

Из статьи я узнал, что производство закрыли в 1 час ночи. Я собираюсь выбрать время начала 10 вечера и продолжительность 3 часа.

Создать момент

Instagram принимает время начала по Гринвичу, поэтому я жестко запрограммировал восьмичасовую корректировку изменения времени из своего часового пояса (PST). Возможно, вам придется изменить это в коде.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public function actionCreate()
   {
       $model = new Moment();
        if ($model->load(Yii::$app->request->post())) {
           // convert date time to timestamp
           $model->start_at = strtotime($model->start_at);
           // adjust for GMT
           $model->start_at+=(3600*8);
           // validate the form against model rules
           if ($model->validate()) {
               // all inputs are valid
               $model->save();
               return $this->redirect([‘view’, ‘id’ => $model->id]);
           } else {
             return $this->render(‘create’, [
                 ‘model’ => $model,
             ]);
           }
       } else {
           return $this->render(‘create’, [
               ‘model’ => $model,
           ]);
       }
   }

Для поиска в Instagram просто нажмите на значок камеры ниже:

Сетка индекса моментов

Фактический поиск довольно прост: $instagram->searchMedia( $this->latitude, $this->longitude,$params );

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
 
namespace app\models;
 
use Yii;
use yii\db\ActiveRecord;
use app\models\Gram;
use Instagram;
 
 
public function searchInstagram() {
       $instagram = new Instagram\Instagram;
       $instagram->setClientID( \Yii::$app->params[‘instagram’][‘client_id’] );
       $end_at = $this->start_at + ($this->duration*60);
       $params = array(‘min_timestamp’=>$this->start_at,’max_timestamp’=>$end_at,’distance’=>$this->distance,’count’=>50);
       $media = $instagram->searchMedia( $this->latitude, $this->longitude,$params );
 
       foreach ($media as $m) {
         if (isset($m->caption->text)) {
          $caption = $m->caption->text;
         } else {
           $caption =»;
         }
        $i = new Gram();
       }
     }

Результаты сохраняются в таблице Gram, которую мы затем можем просмотреть:

01
02
03
04
05
06
07
08
09
10
11
12
public function add($moment_id,$username,$link,$created_time,$image_url,$text) {
     if (!Gram::find()->where([‘moment_id’ => $moment_id])->andWhere([‘link’=>$link])->andWhere([‘created_time’=>$created_time])->exists()) {
       $i = new Gram();
       $i->moment_id = $moment_id;
       $i->username = $username;
       $i->link = $link;
       $i->created_time = $created_time;
       $i->image_url = $image_url;
       $i->text = $text;
       $i->save();
     }
   }

Вот первая страница результатов моего поиска. Вы можете видеть, как толпы и лимузин Маклмора подъезжают.

Результаты поиска Macklemore

Затем на третьей странице пользователь Instagram по имени Джошуа Льюис делает снимок Маклмора, выходящего из «Кадиллака»:

Больше результатов поиска Macklemore

Вот Маклмор :

Маклмор прибывает в Instagram

Этот пример ясно демонстрирует всю мощь API поиска в Instagram. Всего за несколько минут мы нашли множество очевидцев события лета 2013 года.

Надеюсь, вам понравилось изучение API Instagram. В следующем эпизоде ​​мы рассмотрим аутентификацию OAuth, чтобы мы могли запрашивать области службы Instagram, требующие авторизации пользователя.

А пока, пожалуйста, не стесняйтесь оставлять свои вопросы и комментарии ниже. Вы также можете связаться со мной в Twitter @reifman или написать мне напрямую. Вы также можете просмотреть мою страницу инструктора Tuts +, чтобы увидеть другие уроки, которые я написал.

Изображение для предварительного просмотра изменяется из результата, который появился в нашем поиске API.