Как стать автором
Обновить

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

Время на прочтение6 мин
Количество просмотров8.9K
Всем привет. Мы занимаемся разработкой проекта 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

Публикации

Истории

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

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань