Предположим, что нам нужно воспользоваться функцией 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.