
Это вторая часть серии по API Instagram. В этом уроке я расскажу вам, как использовать конечные точки в Instagram , которые позволяют вам искать популярные изображения из определенного времени и места.
Вы можете скачать код для каждого эпизода, используя ссылку на репозиторий GitHub на боковой панели. Возможно, вас также заинтересует моя серия из двух статей Tuts + « Поиск свидетелей потенциальных преступлений с помощью API социальных сетей» .
Код для этих руководств написан на PHP с использованием Yii Framework. Вы можете узнать больше о Yii в разделе Введение в Yii Framework (Tuts +) и в Программирование с помощью серии Yii2 (Tuts +) . Вы также можете легко адаптировать сегменты кода для своего собственного PHP-приложения.
Я участвую в обсуждениях. Если у вас есть вопрос или предложение по теме, пожалуйста, оставьте комментарий ниже. Вы также можете связаться со мной в Twitter @reifman или написать мне напрямую.
Давайте начнем с регистрации в качестве разработчика в Instagram.
Начиная
Чтобы начать, посетите страницу API Instagram для разработчиков и нажмите Зарегистрировать приложение :

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

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

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

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

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

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

Выполнение поиска в СМИ
Для реализации поиска по медиа в нашем приложении 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 в первом столбце с действием контроллера, которое вызывает конечную точку медиа, которая дает нам больше информации:
|
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, которые присутствовали на съемках видео Маклмора вечером в среду, 24 июля 2013 года, в ориентире Сиэтла Dick’s Drive In .
Используя Google Maps, я могу получить широту и долготу GPS для Дика. Это 47,6195 -122,321.

Из статьи я узнал, что производство закрыли в 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();
}
}
|
Вот первая страница результатов моего поиска. Вы можете видеть, как толпы и лимузин Маклмора подъезжают.

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

Вот Маклмор :

Этот пример ясно демонстрирует всю мощь API поиска в Instagram. Всего за несколько минут мы нашли множество очевидцев события лета 2013 года.
Что дальше?
Надеюсь, вам понравилось изучение API Instagram. В следующем эпизоде мы рассмотрим аутентификацию OAuth, чтобы мы могли запрашивать области службы Instagram, требующие авторизации пользователя.
А пока, пожалуйста, не стесняйтесь оставлять свои вопросы и комментарии ниже. Вы также можете связаться со мной в Twitter @reifman или написать мне напрямую. Вы также можете просмотреть мою страницу инструктора Tuts +, чтобы увидеть другие уроки, которые я написал.
Ссылки по теме
- API Instagram
- Блог разработчиков Instagram
- Поиск потенциальных свидетелей преступлений с помощью API социальных сетей
- Yii2 Developer Exchange
Изображение для предварительного просмотра изменяется из результата, который появился в нашем поиске API.