Всем привет. Мы занимаемся разработкой проекта InstaRocket, который помогает автоматизировать работу вашего аккаунта в Инстаграмм (массфоловинг, масслайкинг, комментирование, отписка).
Начиная создание проекта, мы хотели сделать очень простой в настройках сервис. Там добавили свой инстаграм-аккаунт, указали в каком городе действовать и все=) С простым добавлением аккаунта сложностей не было, а вот с добавление города, совсем другая история, о которой я и расскажу здесь.
Как мы знаем, Instagram не предоставляет возможности поиска пользователей по городам. Такого нет ни в мобильном приложении, ни на сайте и даже в API Instagram).
А сделать мы должны следующее. Дать возможность пользователю выбирать страну и город, по которым InstaRocket будет лайкать, подписываться, комментировать посты.
И так, что же нам дает 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 км из знаний по географии). Тогда нам нужно было бы только знать центральные координаты города и его радиус в километрах). Но за нас это посчитано гуглом и мы идем дальше.
Делаем запрос maps.googleapis.com/maps/api/geocode/json?address=Kyiv&key={token} и получаем
Мы получили центральные координаты location и границы bounds (northeast, southwest).
Теперь используя эти данные, мы делаем запрос через Instagram API, где мы подставляем полученные координаты используя шаг в 1 минуту (широты, долготы). То есть идем перебором, от координат с юго-запада, на северо-восток, так как сам инстаграм выдает локации только по 500 метров, максимум 750.
Для вызова данного метода апи, нам необходим токен с разрешением pubic_content. Его можно получить, если вы создали и подтвердили клиента в Инстаграмм. Я этого не делал, и пошел другим путем. Просто создал приложение.
Обратите внимание на настройки. Поля сделайте такими же.
А для получения токена использовал сайт InstagramToken.
И так, токен получен. Делаем вызов Instagram API c данными полученные из гугла и наш полученный токен.
api.instagram.com/v1/locations/search?lat=50.4501&lng=30.5234&access_token=ACCESS-TOKEN
Получаем:
И так, у нас есть локации города и их Id.
Теперь берм любой 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 локаций в час.
Начиная создание проекта, мы хотели сделать очень простой в настройках сервис. Там добавили свой инстаграм-аккаунт, указали в каком городе действовать и все=) С простым добавлением аккаунта сложностей не было, а вот с добавление города, совсем другая история, о которой я и расскажу здесь.
Как мы знаем, Instagram не предоставляет возможности поиска пользователей по городам. Такого нет ни в мобильном приложении, ни на сайте и даже в API Instagram).
А сделать мы должны следующее. Дать возможность пользователю выбирать страну и город, по которым InstaRocket будет лайкать, подписываться, комментировать посты.
И так, что же нам дает 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 км из знаний по географии). Тогда нам нужно было бы только знать центральные координаты города и его радиус в километрах). Но за нас это посчитано гуглом и мы идем дальше.
Делаем запрос 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.
Для вызова данного метода апи, нам необходим токен с разрешением pubic_content. Его можно получить, если вы создали и подтвердили клиента в Инстаграмм. Я этого не делал, и пошел другим путем. Просто создал приложение.
Обратите внимание на настройки. Поля сделайте такими же.
А для получения токена использовал сайт InstagramToken.
И так, токен получен. Делаем вызов 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
Здесь мы получим посты этой локации
Для того, чтобы получить эти же посты в формате 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 локаций в час.