Pull to refresh

Страны и регионы Вконтакте, полезные запросы Ajax

Исходники для того, чтобы их смотреть… Тем более когда можно


Захотелось на своем сайте прикрутить выбор городов… И посмотрел я в сторону поиска Вконтакте. Выбор стран и городов на правой панели… «Шикарно» — сказал я. Тоже так хочу! И решил ковырнуть сайт слегка на полезный мне географический контент.

И заглянул я в подключаемые JavaScript файлы и как оказалось не зря… В подключаемом файле «vk.com/js/lib/selects.js» я нашел следующий код:

var selector = new Selector(input, 'select_ajax.php?act=a_get_cities&country=' + options.country, options);


Итак я понял, что запрос вида

select_ajax.php?act=a_get_cities&country=

получает города выбранной страны. Поиграв с меню в браузере и посмотрев на состав адресной строки я понял, что в адресе страна передается числовым значением и запрос

vk.com/select_ajax.php?act=a_get_cities&country=1

выдал мне список городов соответствующих выбранной стране — Россия с идентификатором 1, что соответствовало выпадающему списку, но почему-то не всего содержимого как я хотел:

{"cities":[[1,"Москва<\/b>"],[2,"Санкт-Петербург<\/b>"],[10,"Волгоград"],[37,"Владивосток"],[153,"Хабаровск"],[49,"Екатеринбург"],[60,"Казань"],[61,"Калининград"],[72,"Краснодар"],[73,"Красноярск"],[95,"Нижний Новгород"],[99,"Новосибирск"],[104,"Омск"],[110,"Пермь"],[119,"Ростов-на-Дону"],[123,"Самара"],[151,"Уфа"],[158,"Челябинск"]]}


Как видно ответ в формате JSON, что очень удобно при дальнейшем разборе. Возвращается массив cities.

Но мне нужно было больше контента, я хотел все города. Все, что есть!

Интуиция спасет мир!


Волшебным образом я воспользовался нигде не прописанной функцией a_get_countries и ура прописав

vk.com/select_ajax.php?act=a_get_countries

получил все страны одним махом! (Ответ сервера ниже я привел не полностью)

{"countries":[[19,"Австралия"],[20,"Австрия"],[5,"Азербайджан"],[21,"Албания"],[22,"Алжир"],[23,"Американское Самоа"],[24,"Ангилья"],[25,"Ангола"],[26,"Андорра"],[27,"Антигуа и Барбуда"],[221,"Эквадор"],[222,"Экваториальная Гвинея"],[223,"Эритрея"],[14,"Эстония"],[224,"Эфиопия"],[226,"Южная Корея"],[227,"Южно-Африканская Республика"],[232,"Южный Судан"],[228,"Ямайка"],[229,"Япония"]]}


Запрос отдал мне массив countries. 235 идентификаторов стран.

Я некоторое время не мог понять как мне теперь получить все города от социальной сети. Ответ по умолчанию в 18 городов меня не устраивал. Посмотрев за отсылаемыми данными во время печати в поле «Город» отсылался следующий запрос

vk.com/select_ajax.php?act=a_get_cities&country=1&str=

Методом подбора установилось следующее значение строки для получения самого весомого и в порядке возрастания индексов ответа сервера:

vk.com/select_ajax.php?act=a_get_cities&country=1&str=$$$***

Также используя буквы после спец символов мы можем выводить результаты поиска по строке и благодаря спецсимволам результаты показаны по возрастанию идентификаторов записей из таблицы:

vk.com/select_ajax.php?act=a_get_cities&country=1&str=$$$***Тамбов

Так до 153-го идентификатора (регионы все наверно):

vk.com/select_ajax.php?act=a_get_cities&country=1&str=******

Так мы получаем до 848-го идентификатора города:

vk.com/select_ajax.php?act=a_get_cities&country=1&str=$$$$$$

Без артефактов не обошлось


Когда мы выбираем страну и город то у нас формируется вот такая адресная строка в браузере:

vk.com/search?c[city]=61&c[country]=1&c[name]=1&c[section]=people

Т.е. идентификатор страны равен 1 (Россия) город с идентификатором 61. Я ввел вместо цифры 61 символ * и в меню выбора города появилась надпись DELETED. Ну появилась и вроде бы ничего не произошло.
Копался я дальше с ajax-запросами и наткнулся в ответе сервера на запись DELETED снова. На картинке ниже вначале и в конце выделения интересные записи.
response4image

И мне стало интересно. Если выбрать страну Россию (в других особо не проверял но не было в других странах) и при вводе города напечатать ВУД или DEL, то высветиться в выборе город с названием DELETED. Выбрав его появятся как я понял удаленные пользователи. Работает также во вкладке сообщества. Везде, где есть выбор страны и города. В чем особенность высвечивается только при наборе трех вышеуказанных букв.
deletedusers
deleted
durov

Подведем итоги или что с этим делать?


  • Написать скрипт, который распарсит json и сохранит города со всех стран у нас на сайте можем выбрать объем, который необходим из запросов выше. Если чего-то не хватает запрашивать с текстом у социальной сети и кэшировать каким-то образом ее ответы, если нужно. В общем можно обойтись сохраненными крупными городами;
  • Можно просто запрашивать постоянно данные через ajax с Вконтакте. Его постоянно мучают другие разработчики через их айпи, а мы будем свою порцию запрашивать. Но я так делать не буду, чтобы не быть зависимым от их изменений. Могут закрыть такие запросы. Хорошо бы если бы они добавили возможность получения таких данных в свой API.
  • Также можно полностью все распарсить по алфавиту и сохранить без повторений. Даже думаю поиск до трех букв будет более, чем достаточен во время вытягивания названий

Стоит выставить временную задержку между запросами в скрипте, чтобы не было похоже на DOS-атаку хотя
думаю это не вызовет большой нагрузки на сервер.

Еще пару строк

Загадкой для меня осталась последняя цифра в результате каждой записи. И то что все таки мне не удалось все результаты подцепить, не до конца я понял структуру базы данных, потому как некоторые идентификаторы имели большие числа порядка 100101 индекс какой нибудь деревни. Более мелкие населенные пункты только ловить через ввод части или целого названия.
Почему такой способ? Вконтакте работающий сайт и достаточно популярный у него хорошая база адресов.

Кстати выполнять запросы ajax можно и без авторизации и регистрации Вконтакте.
А может в скором будущем ajax сотрет границы между сайтами по обмену публичной информацией.

Возможно будет продолжение с рассказом о создании скрипта и практики сохранения необходимых данных.
Удачи!
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.