Выборка целевой аудитории по городам в Instagram: как это работает
Мы продолжаем рассказывать о работой над проектом InstaRocket, который помогает автоматизировать работу вашего аккаунта в Instagram (массфоловинг, масслайкинг, комментирование, подписка/отписка). Сегодня речь пойдет о таком параметре, как выбор города.
Как мы знаем, Instagram не дает возможность поиска пользователей по городам. Такого нет ни в мобильном приложении, ни на сайте и даже в API Instagram).
А сделать мы должны следующее. Дать возможность пользователю выбирать страну и город, по которым InstaRocket будет лайкать, подписываться, комментировать посты.
И так, что же нам дает Instagram. Поиск по локации. Не по городу, а лишь по локации (метка, которую создали пользователи).
План
Для осуществления нашего плана, нам необходимо:
1. Выбрать город
2. Узнать его центральные координаты
3. Узнать его крайние координаты (размеры)
4. Вызвать https://api.instagram.com/v1/locations/search по координатам
5. Пройтись по локациям и забрать всех пользователей
Приступаем к осуществлению плана
1. Для получения списка всех стран и городов я использовал открытое VK API.
2. Для получения координат города использовал Gooogle API. К моей радости, Google выдавал не только центральные координаты города, но и крайние (прямоугольник). Это нам нужно для сканирования каждого участка города, так как Инстаграм API выдает данные только в диапазоне 500 метров. В противном случае нам бы пришлось вычислять крайние координаты города самостоятельно (использую данные, что 1 минута широты это 1.851 км, а 1 минуты долготы, это 1.092 км из знаний по географии). Тогда нам нужно было бы только знать центральные координаты города и его радиус в километрах). Но за нас это посчитано гуглом и мы идем дальше.
Делаем запрос https://maps.googleapis.com/maps/api/geocode/json?address=Kyiv&key={token} и получаем
{ "results" : [ { "address_components" : [ { "long_name" : "Kiev", "short_name" : "Kiev", "types" : [ "locality", "political" ] }, { "long_name" : "Kyiv City", "short_name" : "Kyiv City", "types" : [ "administrative_area_level_2", "political" ] }, { "long_name" : "Ukraine", "short_name" : "UA", "types" : [ "country", "political" ] } ], "formatted_address" : "Kiev, Ukraine", "geometry" : { "bounds" : { "northeast" : { "lat" : 50.590798, "lng" : 30.825941 }, "southwest" : { "lat" : 50.213273, "lng" : 30.2394401 } }, "location" : { "lat" : 50.4501, "lng" : 30.5234 }, "location_type" : "APPROXIMATE", "viewport" : { "northeast" : { "lat" : 50.590798, "lng" : 30.825941 }, "southwest" : { "lat" : 50.213273, "lng" : 30.2394401 } } }, "place_id" : "ChIJBUVa4U7P1EAR_kYBF9IxSXY", "types" : [ "locality", "political" ] } ], "status" : "OK" }
Мы получили центральные координаты location и границы bounds (northeast, southwest).
Теперь используя эти данные, мы делаем запрос через Instagram API, где мы подставляем полученные координаты используя шаг в 1 минуту (широты, долготы). То есть идем перебором, от координат с юго-запада, на северо-восток, так как сам Instagram выдает локации только по 500 метров, максимум 750.
Для вызова данного метода API, нам необходим токен с разрешением pubic_content. Его можно получить, если вы создали и подтвердили клиента в Instagram. Я этого не делал, и пошел другим путем. Просто создал приложение
Обратите внимание на настройки. Поля сделайте такими же.
А для получения токена использовал сайт InstagramToken.
Если с первого раза получение токена не получилось, попытайтесь снова. И так, токен получен. Делаем вызов Instagram API c данными полученные из Google и наш полученный токен.
"location" : { "lat" : 50.4501, "lng" : 30.5234 }
https://api.instagram.com/v1/locations/search?lat=...
Получаем:
{ "data": [ { "id": "1306173892829806", "name": "КМДА", "latitude": 50.45, "longitude": 30.5233 }, { "id": "256713358069834", "name": "РічПорт", "latitude": 50.45, "longitude": 30.5233 }, { "id": "212898659", "name": "Kyiv, Ukraine", "latitude": 50.45, "longitude": 30.5233 }, { "id": "314058888", "name": "Majdan Nesaleschnosti - Майдан Незалежності", "latitude": 50.450867715234, "longitude": 30.522571971669 }, { "id": "213130700", "name": "Maidan Nezalezhnosti", "latitude": 50.45025, "longitude": 30.523888888889 }, { "id": "1024728484", "name": "Новоконстантиновская 1а", "latitude": 50.45, "longitude": 30.5233 }, { "id": "1743159665991390", "name": "Китаевская Пустынь", "latitude": 50.45, "longitude": 30.5233 }, { "id": "1016048608", "name": "Segway-Ukraine.com.ua", "latitude": 50.45, "longitude": 30.5233 }, { "id": "314940785", "name": "Украина Вознесенск", "latitude": 50.45, "longitude": 30.523333 }, { "id": "287123992", "name": "Харьковское Шоссе", "latitude": 50.4219988675, "longitude": 30.65024651 }, { "id": "174800369700733", "name": "Інститут Журналістики КНУ Ім.тараса Шевченка", "latitude": 50.45, "longitude": 30.5233 }, { "id": "558008714386619", "name": "Київ, Хрещатик", "latitude": 50.448204040527, "longitude": 30.522249221802 }, { "id": "204034720096508", "name": "Свято-Троицкий Китаевский Монастырь", "latitude": 50.45, "longitude": 30.5233 }, { "id": "739258147", "name": "Оазис", "latitude": 50.45, "longitude": 30.5233 }, { "id": "969326616532082", "name": "Queen Fitness Club", "latitude": 50.45, "longitude": 30.5233 }, { "id": "1205613646216647", "name": "Оболонская Набережная киев", "latitude": 50.507633647411, "longitude": 30.512814705418 }, { "id": "1929322543966368", "name": "Київ Михайлівський Собор", "latitude": 50.45, "longitude": 30.5233 }, { "id": "235432733514719", "name": "Украина Киев", "latitude": 50.4488, "longitude": 30.52267 }, { "id": "1552263428413882", "name": "Київ , Готель Дніпро", "latitude": 50.45, "longitude": 30.5233 }, { "id": "1537041273239858", "name": "TYME", "latitude": 50.45, "longitude": 30.5233 } ], "meta": { "code": 200 } }
И так, у нас есть локации города и их Id.
{ "id": "558008714386619", "name": "Київ, Хрещатик", "latitude": 50.448204040527, "longitude": 30.522249221802 },<span id="pastemarkerend"> </span>
Теперь берм любой Id, наприме 558008714386619 и вызываем метод сайта (не api)
https://www.instagram.com/explore/locations/558008714386619
Здесь мы получим посты этой локации
Для того, чтобы получить эти же посты в формате json. нам необходимо добавить к строке запроса ?__a=1 и получаем https://www.instagram.com/explore/locations/558008714386619/?__a=1
Та да! Мы получили, что хотели! И так проходимся по всем координатам, локациям, и вытаскиваем посты и их создателей.
PS: Вызов Instagram API ограничен 30 запросами в час (sandbox). Для того, чтобы обойти этот запрет, создайте много клиентов, и пригласите туда до 10 тестовых пользователей в каждый. Так вы можете получить 10, 20, 100 токенов. И соответственно 100 * 30 = 3000 запросов в час. 3000 запросов это * 20 = 60 000 локаций в час.