Получение участников сообщества vk.com за считанные секунды
Ни для кого не секрет, что VK API возвращает за один запрос к методу groups.getMembers не более 1 000 участников. В одну секунду вы можете получить максимум 3 000 участников, так как установлено ограничение на количество запросов в секунду до 3. Эту проблему решает метод execute, с помощью которого вы можете получить более 100 000 участников за одну секунду и до 25 000 участников за один запрос. В этой статье я расскажу Вам, как я это реализовал.Без использования метода execute, процесс получения участников группы с аудиторией в 4 000 000 человек займет примерно около 22 минут, и нам нужно будет выполнить около 4 000 запросов к API. С помощью метода execute мы ускорим этот процесс примерно до 40 секунд и выполним всего около 160 запросов.Содержание:
Это универсальный метод, который позволяет запускать последовательность других методов, сохраняя и фильтруя промежуточные результаты.Делается обычный запрос как и на все другие методы, но в параметрах нужно передать code написанный на VKScript.Что поддерживает VKScript и что это? Это язык похожий на JavaSсript или ActionScript. Алгоритм должен завершаться командой return %выражение%. Операторы должны быть разделены точкой с запятой.Поддерживаются:
арифметические операции логические операции создание массивов и списков ([X, Y]) parseInt и parseDouble конкатенация (+) конструкция if фильтр массива по параметру (@.) вызовы методов API, параметр length циклы, используя оператор while методы Javascript: slice, push, pop, shift, unshift, splice, substr оператор delete присваивания элементам массива, например: row.user.action = «test»; С помощью этого метода, мы можем получить результат нескольких методов за один запрос API.
Чтобы работать с Open Api нам нужно подключить библиотеку OpenApi. Пройдем авторизацию приложения VK и объявим массив:
VK.init ({ apiId: 4235235 // ID вашего приложения VK });
var membersGroups = []; // массив участников группы Получим информацию о группе:
// получаем информацию о группе и её участников
function getMembers (group_id) {
VK.Api.call ('groups.getById', {group_id: group_id, fields: 'photo_50, members_count', v: '5.27'}, function® {
if (r.response) {
$('.group_info')
.html ('
'
+ r.response[0].name
+ '
Участников: ' + r.response[0].members_count);
getMembers20k (group_id, r.response[0].members_count); // получаем участников группы и пишем в массив membersGroups
}
});
}
Чтобы получить участников группы мы будем использовать execute, за один запрос мы получим 25 000 участников. Execute позволяет сделать до 25 запросов описанных с помощью языка VKScript. В параметре code нам нужно передать алгоритм на языке VKScript. Я это сделал следующим образом.
var id_app = [2866099, 4195289, 4195287, 4195284, 4161477, 4161462, 4149350, 4149349, 4149336, 2394133, 3043953]; var apiID_index = Math.floor (Math.random () * (id_app.length)); VK.init ({ apiId: id_app[apiID_index] // ID вашего приложения VK });
var membersGroups = []; // массив участников группы getMembers (30666517);
// получаем информацию о группе и её участников
function getMembers (group_id) {
VK.Api.call ('groups.getById', {group_id: group_id, fields: 'photo_50, members_count', v: '5.27'}, function® {
if (r.response) {
$('.group_info')
.html ('
'
+ r.response[0].name
+ '
Участников: ' + r.response[0].members_count);
getMembers20k (group_id, r.response[0].members_count); // получаем участников группы и пишем в массив membersGroups
}
});
}
// получаем участников группы, members_count — количество участников function getMembers20k (group_id, members_count) { var code = 'var members = API.groups.getMembers ({«group_id»: ' + group_id + ', «v»:»5.27», «sort»: «id_asc», «count»:»1000», «offset»: ' + membersGroups.length + '}).items;' // делаем первый запрос и создаем массив + 'var offset = 1000;' // это сдвиг по участникам группы + 'while (offset < 25000 && (offset + ' + membersGroups.length + ') < ' + members_count + ')' // пока не получили 20000 и не прошлись по всем участникам + '{' + 'members = members + "," + API.groups.getMembers({"group_id": ' + group_id + ', "v": "5.27", "sort": "id_asc", "count": "1000", "offset": (' + membersGroups.length + ' + offset)}).items;' // сдвиг участников на offset + мощность массива + 'offset = offset + 1000;' // увеличиваем сдвиг на 1000 + '};' + 'return members;'; // вернуть массив members VK.Api.call("execute", {code: code}, function(data) { if (data.response) { membersGroups = membersGroups.concat(JSON.parse("[" + data.response + "]")); // запишем это в массив $('.member_ids').html('Загрузка: ' + membersGroups.length + '/' + members_count); if (members_count > membersGroups.length) // если еще не всех участников получили setTimeout (function () { getMembers20k (group_id, members_count); }, 333); // задержка 0.333 с. после чего запустим еще раз else // если конец то alert ('Ура тест закончен! В массиве membersGroups теперь ' + membersGroups.length + ' элементов.'); } else { alert (data.error.error_msg); // в случае ошибки выведем её } }); } Использование:
getMembers (IDгруппы);
На случай если слишком много человек в раз попытается выполнять запросы с одного приложения VK, выглядело так: Пример работы: swey.biz/getmembersVKAPI/index.htmlИсходники: github.com/romkagolovadvayha/getmembersVKAPI.git