Как стать автором
Поиск
Написать публикацию
Обновить

Получение пользователей Instagram по городам

Время на прочтение6 мин
Количество просмотров9.1K
Всем привет. Мы занимаемся разработкой проекта InstaRocket, который помогает автоматизировать работу вашего аккаунта в Инстаграмм (массфоловинг, масслайкинг, комментирование, отписка).

Начиная создание проекта, мы хотели сделать очень простой в настройках сервис. Там добавили свой инстаграм-аккаунт, указали в каком городе действовать и все=) С простым добавлением аккаунта сложностей не было, а вот с добавление города, совсем другая история, о которой я и расскажу здесь.
image


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

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

image

image

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

Для осуществления нашего плана, нам неоходимо:
1. Выбрать город
2. Узнать его центральные координаты
3. Узнать его крайние кординаты (размеры)
4. Вызвать https://api.instagram.com/v1/locations/search по координатам
5. Пройтись по локациям и забрать всех пользователей

Пункт 1. Для получения списка всех стран и городов я использовал открытое VK API.

Пункт 2. Для получения координат города использовал Gooogle API. К моей радости, гугл выдавал не только центральные координаты города, но и крайние (прямоугольник). Это нам нужно для сканирования каждого участка города, так как Инстаграм API выдает данные только в диапазоне 500 метров. В противном случае нам бы пришлось вычислять крайние координаты города самостоятельно (использую данные, что 1 минута широты это 1.851 км, а 1 минуты долготы, это 1.092 км из знаний по географии). Тогда нам нужно было бы только знать центральные координаты города и его радиус в километрах). Но за нас это посчитано гуглом и мы идем дальше.

image

Делаем запрос 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 минуту (широты, долготы). То есть идем перебором, от координат с юго-запада, на северо-восток, так как сам инстаграм выдает локации только по 500 метров, максимум 750.

image

Для вызова данного метода апи, нам необходим токен с разрешением pubic_content. Его можно получить, если вы создали и подтвердили клиента в Инстаграмм. Я этого не делал, и пошел другим путем. Просто создал приложение.


Обратите внимание на настройки. Поля сделайте такими же.

image

А для получения токена использовал сайт InstagramToken.

image
И так, токен получен. Делаем вызов Instagram API c данными полученные из гугла и наш полученный токен.

   "location" : {
               "lat" : 50.4501,
               "lng" : 30.5234
            }

api.instagram.com/v1/locations/search?lat=50.4501&lng=30.5234&access_token=ACCESS-TOKEN

Получаем:

{
"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
}

Теперь берм любой Id, наприме 558008714386619 и вызываем метод сайта (не api)

https://www.instagram.com/explore/locations/558008714386619

Здесь мы получим посты этой локации

image

Для того, чтобы получить эти же посты в формате json. нам необходимо довавить к строке запроса ?__a=1 и получаем https://www.instagram.com/explore/locations/558008714386619/?__a=1

image

Та да! Мы получили, что хотели! И так проходимся по всем координатам, локациям, и вытаскиваем посты и их создателей.

PS: Вызов Instagram API ограничен 30 запросами в час (sandbox). Для того, чтобы обойти этот запрет, создайте много клиентов, и пригласите туда до 10 тестовых пользователей в каждый. Так вы можете получить 10, 20, 100 токенов. И соответственно 100 * 30 = 3000 запросов в час. 3000 запросов это * 20 = 60 000 локаций в час.
Теги:
Хабы:
Всего голосов 22: ↑9 и ↓13-4
Комментарии12

Публикации

Ближайшие события