Instagram — типичный YOBA-сервис, с не слишком удобным мобильным интерфейсом, и полностью кастрированным веб-клиентом. Строго говоря, функция поиска интересных людей в нём отсутствует полностью — попробуем сделать её сами!

Удивительно, но несмотря на это у инстаграма есть API — его и будем использовать. Функций в нём не очень много, однако они покрывают многие потребности.

Для начала — зачем вообще мне это понадобилось.  Моя девушка, флорист, ведёт на инстаграме аккаунт с фотографиями букетов и хочет найти близких по духу людей, чтобы посмотреть их работы и взаимно подписаться. Штатных средств поиска людей по тегу в инстаграме нет, да и если честно, API напрямую тоже не полностью решает эту задачу. Будем искать по тегу #bouquet.

Получение API-ключа

Самое первое, что нам понадобится — получить API ключ. Можно использовать и тот, который написан в примерах — но он ограничен в правах. Получить полный ключ очень просто:  в «управлении программами» регистрируем новую программу, указываем в полях любые данные, и заходим на URL (вместо CLIENT-ID пишем значение поля client-id в данных программы, а вместо REDIRECT-URI — тот адрес, который указали в качестве сайта программы)

https://api.instagram.com/oauth/authorize/?client_id=CLIENT-ID&redirect_uri=REDIRECT-URI&response_type=code

Нас редиректит на адрес http://your-redirect-uri?code=CODE, из которого мы и узнаём API ключ.

Сразу поговорим о выходе «в люди». Чтобы работать с аккаунтом юзера, вам понадобится точно так же получать API-ключ на этого человека — и это очень легко делается, распишем по пунктам.

Форма «логина» в ваш сервис будет редиректом на указанный выше URL. В качестве REDIRECT-URI укажите адрес вашего сайта, а CLIENT-ID — это идентификатор вашего приложения. Если юзер не авторизован на инстаграме, ему будет предложено это сделать, а после авторизации — согласиться с разрешениями, требуемыми вашим приложением. После подтверждения произойдёт редирект на ваш сайт, и из запроса вы сможете получить API-ключ. Получив этот ключ, вы можете, к примеру, предложить юзеру указать дополнительную информацию — E-mail (как делает Statigram) или ещё что-то. Чтобы при этом однозначно идентифицировать юзера, можете использовать первую часть API-ключа — в ней указан его id. При желании можно передать дополнительные параметры в REDIRECT-URI, и они вернутся к вам.

Все команды API содержат параметр API-ключа (который я буду пропускать в описаниях), и возвращают объект JSON, в котором содержится ответ, а также адрес для получения следующей порции данных.

Информация о теге

Для начала, определим, сколько вообще есть фотографий по интересующему нас тегу. Для этого служит команда https://api.instagram.com/v1/tags/tag_name, которая отдаёт только одно полезное свойство — количество фотографий по этому тегу. Команда https://api.instagram.com/v1/tags/bouquet/?access_token=xxx сообщает, что по этому тегу содержится всего около 500 тысяч фотографий, а это немного по сравнению, например, с тегом #nofilter, который даёт в 100 раз большее число, и в 1000 раз меньше чем по самому популярному тегу #love. Это даёт нам возможность за разумное время собрать вообще все фотографии по нашему тегу.

Поиск фотографий по тегу

Самый простой способ — запрос https://api.instagram.com/v1/tags/bouquet/media/recent, который сообщает несколько последних фотографий по этому тегу в массиве data, а также адрес следующей страницы с данными. Количеством фотографий в ответе можно управлять с помощью параметра count который, правда, не может быть больше 30. Также есть проблема, что параметр count — лишь «рекомендация», и зачастую API отдаёт меньшее количество записей, чем было запрошено.

Здесь нужно отметить лицензионное соглашение API Instagram, которое не позволяет отображать более 30 фотографий на одной странице, а также требует не мучать их множеством запросов. Проигнорируем все эти требования.

Вся нужная информация хранится в массиве data. Каждый элемент этого массива — это один пост, там содержится массив тегов, комментарии, массив лайков (и id лайкнувших юзеров), id автора и id поста.

Сохранение всех фотографий по тегу

Так, чтобы сохранить вообще все посты по тегу, необходимо рекурсивно сохранять информацию по запросу, и заходить на адрес «pagination.next_url». Небольшая проблема заключается в том, что подобный обход продлится примерно 10 часов, так что можно сделать чашку кофе :)Из-за этого мы получим наложения на страницах запросов — каждый следующий запрос происходит спустя некоторое время после предыдущего, и если будет запощена новая фотография — результат этого запроса будет иметь одну-две фотографии из старого запроса. Эту проблему решим стандартным способом удаления дубликатов — сохранением массива в хеш по id поста, и обратным превращением в массив.

 

После этого мы будем иметь массив постов и id их авторов. Отлично, можно построить гистограмму и найти самых плодовитых авторов по тегу #bouquet — а именно их мы и искали!

Что делать дальше?

Окей, получили юзеров — что делать дальше? Используем обычные методы SMM для инстаграма — лайкаем фотографии, фолловим и комментируем.

Я экспериментировал с такой методикой — всем найденным фотографиям проставляем лайки. К сожалению, выхлоп от этого невелик — на 3 тысячи поставленных лайков приходит только 3 ответных лайка, и всего один фоллоу. 1000:1 — слишком маленький КПД процесса, однако можно использовать комментарии — они дают гораздо больше ответов и фолловеров. Пока я не пробовал масскомментинг, как только попробую — напишу.

Обязательно нужно помнить, что подобное использование API — нарушение лицензионного соглашения, делайте это на свой страх и риск.