Программа, представляющая из себя довольно быстрый парсер пользователей и сообществ ВКонтакте, который аналогично недавно опубликованному собирает базу сообществ по списку указанных ключевых слов. Даёт возможность настраивать несколько очень полезных параметров, благодаря чему можно парсить узконаправленные базы сообществ, да ещё и пользователей в придачу.

Парсер групп из поиска

Парсер позволяет собирать базы сообществ определённого типа (групп, публичных страниц, встреч) по списку указанных ключевых слов. Ключевые слова можно загрузить из файла. Количество сообществ, которые необходимо получить с одного ключевого слова, можно указать вручную (но не более 1000, это ограничение ВКонтакте). Для отсеивания ненужных групп предусмотрена такая опция, как стоп-слова, которая исключает из результатов поиска сообщества, в названиях которых встречается хотя бы одно из указанных стоп-слов.


Для создания баз, ориентированных под различные рассылки на стены групп/пабликов/встреч можно парсить только сообщества с открытыми стенами. Указывая метод сортировки перед началом парсинга, можно получать базы сообществ с определёнными параметрами и характеристиками. Если вы нацелены на крупные сообщества, вам поможет параметр, ограничивающий минимальное число участников в них.

Как и в случае с программой , в данном парсере можно ограничивать область поиска путём задания определённого региона в виде страны или города. Однако указывать их необходимо вручную с помощью идентификаторов. О том, как узнать ID города, можно прочитать в специальной статье « ». ID страны определяется таким же образом.

В качестве окончательных результатов вы получите список прямых ссылок на нужные вам сообщества. К сожалению, для получения списка ID групп вместо ссылок на них придётся воспользоваться другой программой, но для этого подойдёт любой текстовый редактор, например, блокнот.

Парсер людей из поиска

Парсер позволяет получить список ссылок на страницы пользователей, найденных в поиске по людям ВКонтакте по списку указанных ключевых слов. Ключевые слова можно загрузить из файла. В силу ограничений ВКонтакте максимальное количество получаемых результатов с одного ключевого запроса – 1000 человек. Если вам важен порядок сортировки пользователей в поиске, вы можете настроить его, выбрав наиболее подходящий пункт в выпадающем меню.


Опять же, если вы собираете базу для массовых рассылок по пользователям, специально для вас разработчик сделал поиск более избирательным, способным собирать только страницы с открытыми стенами и/или личными сообщениями. Для сбора целевой аудитории можно указать регион для поиска в виде идентификаторов города и страны, а также пол и возраст пользователей.

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

Необходимая вам целевая аудитория будет собрана в виде прямых ссылок на страницы пользователей. Преобразовать ссылки в ID в этой программе также нельзя, однако это сделать очень легко и без этой программы.

Парсер людей из групп

Парсер, позволяющий получить список пользователей из любых открытых сообществ ВКонтакте. Достаточно лишь указать прямые ссылки на нужные сообщества и настроить остальные настройки как вам будет угодно. Ссылки на сообщества можно загружать из файла и указывать в любом виде. Например, вот так можно указать ссылку на сообщество Live:


По итогам сбора собранную базу можно предварительно отсортировать по возрастанию или убыванию ID пользователей. Если вы имеете права модератора в сообществах, с которых парсите пользователей, то вам будут доступны ещё 2 метода сортировки результатов: в хронологическом или антихронологическом порядке по вступлению в сообщество.

Для получения наиболее эффективных баз пользователей, которым в дальнейшем вы планируете осуществлять рассылки, присутствуют опции для сбора пользователей онлайн и с открытыми стенами и личными сообщениями.

Парсер информации о людях

Раздел, для сбора расширенной информации по списку пользователей ВКонтакте. Анализирует и выводит в виде таблицы следующие данные: имя, фамилия, пол, дата рождения, страна, город, мобильный телефон, прикреплённые аккаунты Instagram, Twitter, Facebook, текущий статус (онлайн/оффлайн), открытость стены и личных сообщений.


Для получения этих данных по пользователям необходимо и достаточно загрузить список прямых ссылок на интересующих вас пользователей в поле «Страницы людей».

Собранную информацию, при необходимости можно сохранить в 2 типа файлов: в таблицу Excel формата.xls или в обычный текстовый файл. В последнем случае, все данные о пользователях будут разделены символом "точка с запятой".

Работа со строками

Спарсив базу сообществ, можно при помощи встроенного инструмента для работы с базой выполнить действия над полученной базой. Сейчас, пока что, доступны только 3 полезные опции: добавление текста в начало или конец строк, ограничение количества строк в базе и удаление дублей в ней.

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

Для фанатов данной программы сразу отметим, что ранее её можно было найти на различных форумах и сайтах вроде нашего под названием «VKGroupsWorker».

Что такое парсеры пользователей из групп ВКонтакте? Это программы, которые собирают различную информацию по заданному алгоритму. Существуют различные сервисы парсинга, которые помогают собрать нужную аудиторию для показа рекламы в социальных сетях, в частности – в социальной сети ВКонтакте.

Парсеры также могут быть использованы для подбора аудитории или . Для этого базовых функций социальной сети недостаточно.

Не знаете, какой сервис использовать? В сегодняшней статье мы собрали десятку программ для парсинга данных в социальной сети ВКонтакте, рассмотрев их преимущества и цены. Вам остается только сделать выбор в пользу одного из них.

Как работает парсинг и как применяется

Прежде чем приступать к парсингу, вам нужно:

  • понять, где может обитать ваша целевая аудитория.

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

Сервис собирает аудиторию по заданным вами параметрам. Сегодня парсеры предлагают сбор аудитории более чем по сотне различных параметров.

Обычно из групп в ВК парситься аудитория по следующим параметрам:

  • собираются группы, в которых могут состоять нужные вам люди (например, по ключевым словам);
  • собираются подписчиков групп конкурентов;
  • активная аудитория, которая ставит лайки и комментирует;
  • администраторы и руководители сообществ;
  • только что вступившие в тематические или группы конкурентов пользователи;
  • по возрасту, полу, имени, у которых скоро день рождения, с нужным вам количеством детей и т.п.;
  • фильтрация ботов и удаленных аккаунты, чтобы на выходе у вас была реально живая аудитория.

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

10 программ для парсинга в ВК

Давайте же рассмотрим, какие сервисы для парсинга в ВК сегодня есть на рынке.

1. Церебро Таргет.

Сайт: церебро.рф.

Стоимость: от 1225 руб/месяц.

Тестовый период: нет.

Один из самых популярных парсеров для ВК. Предлагает более ста способов для поиска целевой аудитории. Поможет спарсить сообщества, где состоит ваша ЦА, найти похожую аудиторию, собрать клиентов из фотоальбомов конкурирующих сообществ. Можно сделать комбинацию аудиторий, например, выбрать тех, кто вступил в сообщество и оставил комментарий.

Краткий вывод: мощный инструмент с огромным количеством функций, но подойдет больше уже для опытных таргетологов. Плохо, что нет тестового периода. Но огромный плюс – это база знаний и развитое сообщество ВК с кучей полезного материала и практическими кейсами.

Сайт: targethunter.net.

Стоимость: от 100 рублей (на 2 дня).

Тестовый период: попробовать базовые возможности сервиса можно бесплатно. Бесплатный тариф включает в себя 24 инструмента и 1 поток задач.

Лично мне этот парсер нравится больше всего. Идеальное сочетание цены и набора функций, которые можно опробовать бесплатно. Если вам нужно быстро запустить небольшую рекламу – достаточно подключить доступ на 2 дня всего за 100 рублей.

Умеет собирать группы, участников групп, находить нужных пользователей по их контактам. Есть функция очистки списка от ботов.

Из нового – доступны для покупки (и многие бесплатно) уже готовые базы. Вашу работу уже сделали за вас.

Краткий вывод: отличный сервис для сбора аудитории ВКонтакте, понятный для новичков и доступный по цене каждому. Если вы не работаете SMM-щиком, и собирать базы нужно время от времени – как раз то, что нужно.

3. Pepper.Ninja

Сайт: pepper.ninja.

Стоимость: от 490 рублей в месяц.

Тестовый период: есть бесплатный базовый аккаунт, но с его помощью доступен только поиск сообществ.

Данный парсер работает не только с ВКонтакте. Он поможет найти нужную аудиторию и в других популярных социальных сетях: Инстаграмм, Фейсбук и Одноклассники.

Можно задавать периодические задания, которые будут запускаться сами через определенный промежуток времени.

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

4. Фонарик.

Сайт: spotlight.svezet.ru

Стоимость: бесплатный.

Это довольно простой инструмент с «древним» интерфейсом, который поможет сделать вашу рекламу во ВКонтакте более эффективной. Собирает аудиторию ретаргетинга, доступны самые базовые инструменты. Чем еще интересен — вы будете получать уведомления об активностях в группах.

Краткий вывод: неплохо для тех, кто хочет просто «пощупать», что такое ретаргетинг, научиться собирать аудиторию, не платя за это ни копейки.

5. «Барков.нет».

Сайт: vk.barkov.net

Стоимость: базовый ограниченный функционал бесплатный; можно приобретать доступ ко всем скриптам на 1 день за 149 рублей.

С базовым бесплатным доступом можно собрать аудиторию по основным параметрам, спарсить сообщества, активных и новых подписчиков (только с ограничением по объему расчетов).

Сервис поможет найти даже людей с открытой стеной и открытой личкой, собрать номера телефонов. Есть функция очистки списков от забаненых и удаленных пользователей.

Краткий вывод: этот сервис отлично подойдет для новичков, которые только вникают в тонкости таргетированной рекламы.

Сайт: segmento-target.ru.

Стоимость: от 60 рублей в день до 1500 рублей в месяц.

Тестовый период: 7 дней.

Этот парсер работает не только с ВКонтакте, но еще с Инстаграмм и Одноклассниками. Позволяет собирать номера телефонов, участников опросов, промо-посты, скайпы и твиттеры. Есть инструменты для аналитики и фильтрации аудитории.

Краткий вывод: отличное сочетание цены и набора функций. Подойдет для тех, кто хочет продвигаться сразу в нескольких социальных сетях.

Стоимость: 900 рублей.

Тестовый период: нет.

Это не онлайн-сервис, а десктопная программа. То есть, ее нужно скачать и установить на свой компьютер. Собирает данные о подписчиках – страна, город, возраст и т.п., но кроме этого ловит, принимает ли пользователь сообщения, какой номер телефона и аккаунты Скайп, Инстаграмм.

Краткий вывод: простая программа, но функционал немного ограничен. Да и неудобна тем, что нужно устанавливать на свой ПК – проще воспользоваться онлайн-сервисами.

8. TARGET-TRAINING.

Сайт: retarget.target-training.ru.

Стоимость: бесплатно.

Этот сервис умеет находить ключевые слова на стенах пользователей ВКонтакте. Причем понимает их в прямом вхождении (в кавычках) и в непрямом. В результате вы можете собрать базу людей, которых волнует какая-то общая проблема, и предложить им свой продукт.

Краткий вывод : всего одна функция, зато бесплатно. Может быть полезно, если у вас есть какой-то один продукт или вы ищете партнеров.

9. Паблер.

Сайт : publer.pro.

Стоимость: от 300 рублей за сутки до 20 000 рублей за год.

Тестовый период : есть бесплатный демо-режим с ограничениями.

Это мультифункциональный сервис для мониторинга соцсетей и тизерных сетей. Для себя вы можете использовать две крутые функции: поиск пересечений между группами (взять две группы конкурентов и найти подписчиков, которые есть там и там). Также можно проанализировать вовлеченность.

Краткий вывод: этот сервис больше подходит для арбитражников, и тех, кто зарабатывает на партнерском маркетинге.

10. Турбо.Парсер.

Сайт: turboparser.ru

Стоимость: от 60 рублей.

Тестовый период: можно попробовать бесплатно.

Это парсер для тех, кто торгует через социальные сети, в особенности – кто занимается совместными покупками. Основная функция – парсинг товаров с указанного сайта для выгрузки их в ВК или Одноклассники. Есть еще одна интересная функция – парсинг альбомов товаров ВКонтакте.

Краткий вывод: этот парсер не подходит для настройки рекламы. Однако упростит жизнь тем, кто торгует через эту социальную сеть.

Заключение

Как видите, сегодня на рынке представлены самые разные инструменты для парсинга данных во Вконтакте. Одни из них подойдут для тех, кто профессионально занимается настройкой рекламы, с другими справится и новичок.

Сохраните себе подборку, чтобы не потерять!

На создание данной статьи я был вдохновлен публикацией «Получение участников сообщества vk.com за считанные секунды» . Моя статья написана новичком и отражает опыт решения одной задачи. Основная цель написания этой статьи для меня - собрать мнения, отзывы и критику примененного подхода от более опытных коллег. Кроме того, надеюсь, что кому-то приведенная здесь информация будет полезна.

Не так давно в одном из тестовых задания на вакансию младшего php-программиста мне попалась простая, но интересная для меня задача.

«Сделайте скрипт на php, который возвращает список id пользователей «ВКонтакте», разделенный символами перевода строки, которые являются мужчинами старше 25 лет и состоят в группе vk.com/habr ».

Доступ к информации из базы «ВКонтакте» осуществляется с использованием VK API. Начинать знакомство с VK API лучше с официальной документации . Для того чтобы вызвать метод API ВКонтакте, необходимо осуществить POST или GET запрос по протоколу HTTPS на URL следующего вида:

Получаем JSON-структуру с общим количеством членов сообщества vk.com/habr и тысячей первых id в списке по умолчанию отсортированном по возрастанию.

По условию задачи нам нужно вывести id пользователей определенного пола и возраста. Очевидный способ - выбирать запросами VK API пользователей группы вместе с их данными о поле и возрасте, а потом в PHP-коде анализировать их и выводить только нужные. Другой возможный способ - метод execute - позволяет в одном запросе передать скрипт на специальном языке VKScript для манипуляции с данными на сервере и вернуть уже обработанные данные. Сразу скажу, что мне не удалось, решить задачу с помощью метода execute. Может быть в комментариях кто-то укажет такое решение.

Пойдем по первому пути. Метод groups.getMembers с помощью значения sex параметра fields может выдавать пол пользователя, но он не выдает возраст. Вместо этого параметр fields имеет поле bdate - дата рождения. Кроме того, в запросах мы выбираем по тысяче пользователей, значит каждый следующий запрос должен выдать следующую тысячу. Для этого есть параметр offset, который показывает с какой позиции начинать выборку. Укажем в запросе еще и версию API.

В итоге запрос будет иметь примерно такой вид: https://api.vk.com/method/groups.getMembers?group_id=habr&offset=0&fields=sex,bdate&version=5.27

Чтобы забирать файл по ссылке, в PHP есть функция file_get_contents() . Она получает контент по ссылке и возвращает его в виде строки. Нужно учесть, что для того, чтобы file_get_contents() понимала протокол HTTPS нужна поддержка openssl в веб-сервере.

Потом полученный JSON-контент можно преобразовать в массив функцией json_decode() . Массив будет содержать и id, и пол. Дата рождения может быть вообще не указана.
Если дата рождения всё же указана, осталось из даты рождения получить возраст.

Даты рождения в bdate хранятся в строках формата ДД.ММ.ГГГГ, если указан год рождения, или ДД.ММ, если год рождения не указан. Чтобы узнать в каком формате строка фактически, я использовал первое, что пришло в голову: count(explode(".", $user_array["bdate"])) равно 2 или 3. Этот способ работает и не думаю, что это самое узкое место скрипта.

Для вычисления возраста по дате рождения нашел формулу hashcode.ru/questions/137939#137940 . Функция strtotime() понимает формат поля bdate.

Проверяем пол и возраст. Если они удовлетворяют условию, выводим id.

Весь код на PHP

// Номер пакета запроса $packet = 0; // Размер пакета запроса $limit = 1000; do { // Каждый запрос начинаем там, где остановились в предыдущем запросе. $offset = $ packet * $limit; // Выполнение запроса. // Результат - JSON-файл с общим количеством и данными пользователей. // Чтобы file_get_contents() работал с https на веб-сервере apache // должен быть активен модуль openssl. $contents = file_get_contents("https://api.vk.com/method/groups.getMembers?group_id=habr&offset=$offset&fields=sex,bdate&version=5.27") // Преобразуем JSON в массив $members = json_decode($contents, true); // Данные пользователей хранятся в подмассиве users. // Каждый элемент users - ассоциированный массив с данными. foreach ($members["response"]["users"] as $user_array) { // Если пользователь указал дату рождения и пользователь - мужчина... if ((isset($user_array["bdate"])) && ($user_array["sex"] == 2)) { // ... и если в дате рождения три компонента (ДД.ММ.ГГГГ)... if (count(explode(".", $user_array["bdate"])) == 3) { // то вычисляем возраст (формулу нашел в интернете) $age = floor((time()-strtotime($user_array["bdate"]))/(60*60*24*365.25)); // Если возраст нам подходит, выводим id пользователя с переводом строки if ($age >
"; } } } } // Переходим на следующий пакет. $packet++; } while ($members["response"]["count"] > $offset + $limit);


Этот вариант прекрасно работает на относительно небольших группах, но на группах более 100 тысяч подписчиков скрипт отрабатывает не до конца - в какой-то момент почему-то вываливается ошибка «file_get_contents(...): failed to open stream: Connection timed out in … on line ...». Пробовал увеличивать время выполнения скрипта и таймаут веб-сервера - не помогло. Так и не смог найти закономерность.

Тогда нашелся другой вариант - для загрузки ответа запроса использовать cURL . Чтобы применить такой метод, необходимо установить в ОС библиотеку libcurl, например, в Ubuntu - sudo apt-get install libcurl3 и включить в PHP поддержку cURL, например, в Ubuntu - sudo apt-get install php5-curl Теперь можно открыть в PHP-скрипте сеанс curl функцией curl_init() , установить параметры соединения (в том числе URL) функцией curl_setopt() и скачивать контент JSON-файлов в строку функцией curl_exec() . Потом следует закрыть сеанс - curl_close() . Остальной код остается без изменений:

Весь код с cURL на PHP

// Номер пакета запроса $packet = 0; // Размер пакета запроса $limit = 1000; // Инициализируем cURL. // Для работы с cURL должна быть установлена библиотека libcurl // и включена поддержка cURL в PHP. $ch = curl_init(); do { // Каждый запрос начинаем там, где остановились в предыдущем запросе. $offset = $ packet * $limit; // Параметры запроса curl_setopt($ch, CURLOPT_URL, "https://api.vk.com/method/groups.getMembers?group_id=habr&offset=$offset&fields=sex,bdate&version=5.27"); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); // Выполнение запроса. // Результат - JSON-файл с общим количеством и данными пользователей. $content = curl_exec ($ch); $members = json_decode($contents, true); // Данные пользователей хранятся в подмассиве users. // Каждый элемент users - ассоциированный массив с данными. foreach ($members["response"]["users"] as $user_array) { // Если пользователь указал дату рождения и пользователь - мужчина... if ((isset($user_array["bdate"])) && ($user_array["sex"] == 2)) { // ... и если в дате рождения три компонента (ДД.ММ.ГГГГ)... if (count(explode(".", $user_array["bdate"])) == 3) { // то вычисляем возраст (формулу нашел в интернете) $age = floor((time()-strtotime($user_array["bdate"]))/(60*60*24*365.25)); // Если возраст нам подходит, выводим id пользователя с переводом строки if ($age > 25) { echo $user_array["uid"] . "
"; } } } } // Переходим на следующий пакет. $packet++; } while ($members["response"]["count"] > $offset + $limit); // Закрываем cURL curl_close ($ch);


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

P. S. Прошу не думать, что я хочу получить от аудитории «Хабра» решение тестового задания. Вышеприведенные варианты я уже давно отправил и получил ответ. Просто немало времени потратил на эту задачу и хотел бы узнать, в правильном направлении ли я двигался и какие еще подходы можно было бы использовать.

Продолжим заниматься привлечением клиентов через социальную сеть Вконтакте.

Думаю вы уже знаете всех своих конкурентов и состоите в их группах.

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

Итак, приступим. Займемся парсингом групп Вконтакте.

Затем для каждой группы получим список участников с помощью бесплатной программы программы для парсинга Вконтакте VkGroupUsersParser . Для начала работы необходимо ввести данные входа во Вконтакте. В окне программы вводим ID групп и нажимаем кнопку старт.

В каталоге запуска программы будет создан текстовый файл IDS.txt со списком ID участников группы.

Если вы запускали парсинг сразу для нескольких групп, то в нем будут дубли id пользователей, если они состоят одновременно в нескольких группах.

Если вы парсили каждую группу по отдельности и каждый раз удаляли файл результатов (в противном случае результаты нового парсинга будут добавляться в файл), то при объединении списков, следует так же уделить внимание дублям.

Можно дополнить список теми, кто проявлял какую-то активность в группе.
В зависимости от настроек сообщества администратор может запретить или разрешить публикации от не членов сообщества.

Если это так, то помимо участников группы придется собирать тех, кто оставлял сообщения на стене, в обсуждениях, комментариях к фотографиям т.к. они не попадут в выборку по участникам сообщества.

Мне не известны программы, которые смогут автоматизировать этот процесс. Если группы содержат много сообщений, выгоднее заказать программу для парсинга, чем обрабатывать вручную, либо пропустить этот вариант сбора людей.

Итак, мы получили список тех, кто

  • состоит в группе,
  • оставил сообщение на стене группы или в обсуждениях.

Если приглашения в друзья будут делаться автоматически необходимо провести чистку базы от мертвых душ, ботов и забаненных аккаунтов. Это можно сделать с помощью специализированных программ.

Если приглашения будут делаться вручную, то такие нежелательные аккаунты пропустим в процессе приглашения в друзья.

На создание данной статьи я был вдохновлен публикацией . Моя статья написана новичком и отражает опыт решения одной задачи. Основная цель написания этой статьи для меня - собрать мнения, отзывы и критику примененного подхода от более опытных коллег. Кроме того, надеюсь, что кому-то приведенная здесь информация будет полезна.

Не так давно в одном из тестовых задания на вакансию младшего php-программиста мне попалась простая, но интересная для меня задача.

«Сделайте скрипт на php, который возвращает список id пользователей «ВКонтакте», разделенный символами перевода строки, которые являются мужчинами старше 25 лет и состоят в группе vk.com/habr ».

Доступ к информации из базы «ВКонтакте» осуществляется с использованием VK API. Начинать знакомство с VK API лучше с официальной документации . Для того чтобы вызвать метод API ВКонтакте, необходимо осуществить POST или GET запрос по протоколу HTTPS на URL следующего вида:

Получаем JSON-структуру с общим количеством членов сообщества vk.com/habr и тысячей первых id в списке по умолчанию отсортированном по возрастанию.

По условию задачи нам нужно вывести id пользователей определенного пола и возраста. Очевидный способ - выбирать запросами VK API пользователей группы вместе с их данными о поле и возрасте, а потом в PHP-коде анализировать их и выводить только нужные. Другой возможный способ - метод execute - позволяет в одном запросе передать скрипт на специальном языке VKScript для манипуляции с данными на сервере и вернуть уже обработанные данные. Сразу скажу, что мне не удалось, решить задачу с помощью метода execute. Может быть в комментариях кто-то укажет такое решение.

Пойдем по первому пути. Метод groups.getMembers с помощью значения sex параметра fields может выдавать пол пользователя, но он не выдает возраст. Вместо этого параметр fields имеет поле bdate - дата рождения. Кроме того, в запросах мы выбираем по тысяче пользователей, значит каждый следующий запрос должен выдать следующую тысячу. Для этого есть параметр offset, который показывает с какой позиции начинать выборку. Укажем в запросе еще и версию API.

В итоге запрос будет иметь примерно такой вид: https://api.vk.com/method/groups.getMembers?group_id=habr&offset=0&fields=sex,bdate&version=5.27

Чтобы забирать файл по ссылке, в PHP есть функция file_get_contents() . Она получает контент по ссылке и возвращает его в виде строки. Нужно учесть, что для того, чтобы file_get_contents() понимала протокол HTTPS нужна поддержка openssl в веб-сервере.

Потом полученный JSON-контент можно преобразовать в массив функцией json_decode() . Массив будет содержать и id, и пол. Дата рождения может быть вообще не указана.
Если дата рождения всё же указана, осталось из даты рождения получить возраст.

Даты рождения в bdate хранятся в строках формата ДД.ММ.ГГГГ, если указан год рождения, или ДД.ММ, если год рождения не указан. Чтобы узнать в каком формате строка фактически, я использовал первое, что пришло в голову: count(explode(".", $user_array["bdate"])) равно 2 или 3. Этот способ работает и не думаю, что это самое узкое место скрипта.

Для вычисления возраста по дате рождения нашел формулу hashcode.ru/questions/137939#137940 . Функция strtotime() понимает формат поля bdate.

Проверяем пол и возраст. Если они удовлетворяют условию, выводим id.

Весь код на PHP

// Номер пакета запроса $packet = 0; // Размер пакета запроса $limit = 1000; do { // Каждый запрос начинаем там, где остановились в предыдущем запросе. $offset = $ packet * $limit; // Выполнение запроса. // Результат - JSON-файл с общим количеством и данными пользователей. // Чтобы file_get_contents() работал с https на веб-сервере apache // должен быть активен модуль openssl. $contents = file_get_contents("https://api.vk.com/method/groups.getMembers?group_id=habr&offset=$offset&fields=sex,bdate&version=5.27") // Преобразуем JSON в массив $members = json_decode($contents, true); // Данные пользователей хранятся в подмассиве users. // Каждый элемент users - ассоциированный массив с данными. foreach ($members["response"]["users"] as $user_array) { // Если пользователь указал дату рождения и пользователь - мужчина... if ((isset($user_array["bdate"])) && ($user_array["sex"] == 2)) { // ... и если в дате рождения три компонента (ДД.ММ.ГГГГ)... if (count(explode(".", $user_array["bdate"])) == 3) { // то вычисляем возраст (формулу нашел в интернете) $age = floor((time()-strtotime($user_array["bdate"]))/(60*60*24*365.25)); // Если возраст нам подходит, выводим id пользователя с переводом строки if ($age >
"; } } } } // Переходим на следующий пакет. $packet++; } while ($members["response"]["count"] > $offset + $limit);


Этот вариант прекрасно работает на относительно небольших группах, но на группах более 100 тысяч подписчиков скрипт отрабатывает не до конца - в какой-то момент почему-то вываливается ошибка «file_get_contents(...): failed to open stream: Connection timed out in … on line ...». Пробовал увеличивать время выполнения скрипта и таймаут веб-сервера - не помогло. Так и не смог найти закономерность.

Тогда нашелся другой вариант - для загрузки ответа запроса использовать cURL . Чтобы применить такой метод, необходимо установить в ОС библиотеку libcurl, например, в Ubuntu - sudo apt-get install libcurl3 и включить в PHP поддержку cURL, например, в Ubuntu - sudo apt-get install php5-curl Теперь можно открыть в PHP-скрипте сеанс curl функцией curl_init() , установить параметры соединения (в том числе URL) функцией curl_setopt() и скачивать контент JSON-файлов в строку функцией curl_exec() . Потом следует закрыть сеанс - curl_close() . Остальной код остается без изменений:

Весь код с cURL на PHP

// Номер пакета запроса $packet = 0; // Размер пакета запроса $limit = 1000; // Инициализируем cURL. // Для работы с cURL должна быть установлена библиотека libcurl // и включена поддержка cURL в PHP. $ch = curl_init(); do { // Каждый запрос начинаем там, где остановились в предыдущем запросе. $offset = $ packet * $limit; // Параметры запроса curl_setopt($ch, CURLOPT_URL, "https://api.vk.com/method/groups.getMembers?group_id=habr&offset=$offset&fields=sex,bdate&version=5.27"); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); // Выполнение запроса. // Результат - JSON-файл с общим количеством и данными пользователей. $content = curl_exec ($ch); $members = json_decode($contents, true); // Данные пользователей хранятся в подмассиве users. // Каждый элемент users - ассоциированный массив с данными. foreach ($members["response"]["users"] as $user_array) { // Если пользователь указал дату рождения и пользователь - мужчина... if ((isset($user_array["bdate"])) && ($user_array["sex"] == 2)) { // ... и если в дате рождения три компонента (ДД.ММ.ГГГГ)... if (count(explode(".", $user_array["bdate"])) == 3) { // то вычисляем возраст (формулу нашел в интернете) $age = floor((time()-strtotime($user_array["bdate"]))/(60*60*24*365.25)); // Если возраст нам подходит, выводим id пользователя с переводом строки if ($age > 25) { echo $user_array["uid"] . "
"; } } } } // Переходим на следующий пакет. $packet++; } while ($members["response"]["count"] > $offset + $limit); // Закрываем cURL curl_close ($ch);


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

P. S. Прошу не думать, что я хочу получить от аудитории «Хабра» решение тестового задания. Вышеприведенные варианты я уже давно отправил и получил ответ. Просто немало времени потратил на эту задачу и хотел бы узнать, в правильном направлении ли я двигался и какие еще подходы можно было бы использовать.