image

Всем привет! На днях меня встал вопрос, чем мои друзья занимаются, как найти, например друзей которые увлекается сноубордом.

Для этого я решил написать небольшую плюху, используя VK API.

В проекте решил продолжить написание на angularJS, и начал с написания кода для метода APIexecute, на 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'шников


image

Далее с помощью рекурсии я стал пускать этот скрипт (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

Комментарии (2)


  1. IL_Agent
    10.12.2015 12:08

    По названию статьи можно подумать, что входными данными является список друзей, а на выходе — список групп, в которых они состоят. А в результате всё наоборот: на входе — группы, полученные по запросу, а на выходе — список друзей. Впрочем, может это только мне так показалось :)
    И ещё. ВК же вроде не разрешает выполнять более 3-х запросов к апи в секунду. Для этого есть т.н. «хранимые процедуры». Не было проблем с вызовом в цикле?


    1. dooza
      10.12.2015 12:16

      execute позволяет сделать 25 запросов, за один запрос — это значит 75 запросов в секунду.

      Хранимая процедура — это код execute.