Всем привет! На днях меня встал вопрос, чем мои друзья занимаются, как найти, например друзей которые увлекается сноубордом.
Для этого я решил написать небольшую плюху, используя VK API.
В проекте решил продолжить написание на angularJS, и начал с написания кода для метода API — execute, на VK Script.
В проекте я вынес его в отдельный файл (/js/execute/get_array_members_in_groups.js) для удобства, и дергаю с помощью $.get.
var groups_ids = $groups_ids$;
var arr_groups = "";
var i = 0;
while (i < groups_ids.length) {
var items = API.groups.getMembers({
"group_id": groups_ids[i],
"v": "5.27",
"count": "1000",
filter: "friends"
}).items;
var j = 0;
var items_result = "";
while (j < items.length) {
if (j == 0)
items_result = items[j];
else
items_result = items_result + ", " + items[j];
j = j + 1;
}
if (i == 0)
arr_groups = "{\"id\": " + groups_ids[i] + ", \"items\": [" + items_result + "]}";
else
arr_groups = arr_groups + ", {\"id\": " + groups_ids[i] + ", \"items\": [" + items_result + "]}";
i = i + 1;
}
return "[" + arr_groups + "]";
На VK Script, без извращения составить нужные выходные данные не так просто, я бы сказал это невозможно.
$groups_ids$ — это id'шники групп, их вставляю с помощью функции замены.
var code = array_members_in_groups // текст VK Script (упомянутый выше)
.replace("$groups_ids$", JSON.stringify(groups)); // groups - массив id'шников
Далее с помощью рекурсии я стал пускать этот скрипт (1000/25, 1000 — максимальное число возвращаемое методом groups.search, даже не смотря на offset) 40 раз, это максимальное число операция для получения структурированных данных. ([{id: ИД_ГРУППЫ, items: [ИД_ДРУЗЕЙ.....]}...)
Не буду объяснять все до мельчайших деталей, ниже приложу исходники, кода не много.
Ссылки:
Демо (вторая вкладка): vk.com/app4236781
Исходники: github.com/romkagolovadvayha/romkagolovadvayha.github.io/tree/master/vk-search-friends-by-group
Применено:
Сложение массивов: habrahabr.ru/post/250191
Опыт работы с VK Script: habrahabr.ru/post/248725
AngularJS: angular.ru
Серверные методы API
vk.com/dev/groups.search
vk.com/dev/groups.getMembers
vk.com/dev/execute
vk.com/dev/groups.getById
vk.com/dev/users.get
IL_Agent
По названию статьи можно подумать, что входными данными является список друзей, а на выходе — список групп, в которых они состоят. А в результате всё наоборот: на входе — группы, полученные по запросу, а на выходе — список друзей. Впрочем, может это только мне так показалось :)
И ещё. ВК же вроде не разрешает выполнять более 3-х запросов к апи в секунду. Для этого есть т.н. «хранимые процедуры». Не было проблем с вызовом в цикле?
dooza
execute позволяет сделать 25 запросов, за один запрос — это значит 75 запросов в секунду.
Хранимая процедура — это код execute.