Быстрая работа с API ВКонтакте.

Предположим, что нам нужно воспользоваться функцией API ВКонтакта — groups.getMembers,ознакомившийся с описанием, с печалью, узнаем, что максимальное значение count за один раз — 1000, т.е. больше 1000 участников получить за один запрос не получится, добавив к этому то, что группы бывают сильно больше 100000 подписчиков и количество запросов к API ограничено 1 в 1 секунду становится совсем печально.

На самом деле не все так страшно! В API есть еще один очень специфический метод — execute это дикая смесь ментола синтаксиса языков высокого уровня и ВКонтактовской силы мысли. Но, он позволяет делать до 25 запросов к API за один внешний запрос. Т.е. мы сможем вытащить 25.000 пользователей за 1 запрос к API — это уже вполне адекватные цифры.

Функция для запросов к API на PHP через библиотеку CURL у меня вот такая:

function vk_query($url, $params) {
  	$ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  	curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_IPRESOLVE, CURLOPT_IPRESOLVE_V4);
  	curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_REFERER, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  	curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}

Вообще с HTTPS она работает глючно, зависает, помогает только перезагрузка сервера Apache. Вроде это было решено в новой версии CURL, но для её переустановки нужно было обновить на сервере Ubuntu, что делать мне было лень.

Итак, вот как за 1 запрос получить 25.000 пользователей:

$members_all = array();

for ($i=0; $i<$query_count; $i++){
  $offset_out = $i*25000;
		$query = "
			var members = API.groups.getMembers({\"group_id\": $group_vk_id, \"count\":1000, \"fields\": \"sex, bdate\", \"offset\": $offset_out}).items;
			var offset = 1000;
			while (offset < 25000 && (offset+$offset_out < $group_vk_count)){
      members = members + API.groups.getMembers({\"group_id\": $group_vk_id, \"count\":1000, \"fields\": \"sex, bdate\",\"offset\": ($offset_out + offset)}).items;
      offset = offset + 1000;
			};
			return members;
		";
  $result = json_decode(vk_query('https://api.vk.com/method/execute', array(
    'access_token' => $_SESSION['access_token'],
    'code' => "$query",
    'v' => '5.37'
  )), true);

  //echo '<pre>';
  //print_r($result);
  $members_all[] = $result;
}

В итоге в массиве $members_all будет информация о поле и возрасте членов группы. Есть только нюанс работы с execute — ему требуется access_token, для получения которого нужно будет зарегистрировать приложении и авторизовать пользователя скрипта через API.

Facebook Comments

Леонид Чернядьев

Увлекаюсь программированием, интернет маркетингом, прогнозированием, дизайном и версткой. Принимаю заказы на лидогенерацию. Связь через - https://www.facebook.com/lenid.chernyadyev