Главное Авторские колонки Вакансии Образование
1 391 0 В избр. Сохранено
Авторизуйтесь
Вход с паролем

Выборка целевой аудитории по городам в Instagram: как это работает

Итак, перед нами стояла цель - создать простого и удобного помощника в поиске своей аудитории в Instagram. Чтобы пользователям нужно было лишь добавить свой инстаграм-аккаунт, указать город и нажать "Play". С простым добавлением аккаунта сложностей не возникло, а вот с добавлением города, совсем другая история, о которой я и расскажу здесь.
Мнение автора может не совпадать с мнением редакции

Мы продолжаем рассказывать о работой над проектом InstaRocket, который помогает автоматизировать работу вашего аккаунта в Instagram (массфоловинг, масслайкинг, комментирование, подписка/отписка). Сегодня речь пойдет о таком параметре, как выбор города.

Как мы знаем, Instagram не дает возможность поиска пользователей по городам. Такого нет ни в мобильном приложении, ни на сайте и даже в API Instagram).

А сделать мы должны следующее. Дать возможность пользователю выбирать страну и город, по которым InstaRocket будет лайкать, подписываться, комментировать посты.

И так, что же нам дает Instagram. Поиск по локации. Не по городу, а лишь по локации (метка, которую создали пользователи).

API

План

Для осуществления нашего плана, нам необходимо:

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 локаций в час.

+1
В избр. Сохранено
Авторизуйтесь
Вход с паролем