Получение участников сообщества vk.com за считанные секунды

  • Tutorial
Ни для кого не секрет, что 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 запросов.

Содержание:



I. Немного о execute


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

II. Реализация на javascript



Пишем простую функцию которая рекурсий будет дергать процедуру описанную ниже execute.getMembers.
getMembers(group_id);


Чтобы получить участников группы мы будем использовать execute, за один запрос мы получим 25 000 участников. Execute позволяет сделать до 25 запросов описанных с помощью языка VKScript. В параметре code нам нужно передать алгоритм на языке VKScript.

Создана процедура getMembers, которую мы будем дергать с клиента 3 раза в секунду.
var members = API.groups.getMembers({"group_id": Args.group_id, "v": "5.27", "sort": "id_asc", "count": "1000", "offset": Args.offset}).items; // делаем первый запрос и создаем массив
var offset = 1000; // это сдвиг по участникам группы
while (offset < 25000 && (offset + Args.offset) < Args.total_count) // пока не получили 20000 и не прошлись по всем участникам
{
  members = members + "," + API.groups.getMembers({"group_id": Args.group_id, "v": "5.27", "sort": "id_asc", "count": "1000", "offset": (Args.offset + offset)}).items; // сдвиг участников на offset + мощность массива
  offset = offset + 1000; // увеличиваем сдвиг на 1000
};
return members;


Исходники и примеры


На случай если лежит VK, то выглядело так:
image

Пример работы: http://vk.com/app4236781
Исходники: github.com/romkagolovadvayha/getmembersVKAPI.git
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 26

    +9
    Ты большой молодец.
      0
      спасибо за статью
      полезно очень!
        0
        А почему за один execute забирается до 25к участников? Эта цифра получена каким-то опытным путем?
          +2
          Максимальное количество запросов в execute 25, за один запрос можно получить не более 1 000 участников. Следовательно максимальное число участников полученное от execute = 1 000 * 25
            0
            А цифра 25 откуда? В документации ничего об этом нет.
            Я тоже пользовался execute для склейки длинных списков, но так и не заметил конкретной цифры, после которой мне отвечают, что execute исполнялся долго и прекратился по timeout
              0
              да цифры нет в API, я сам проверял на 26 запросе ошибка вылетает (Слишком много запросов).
                +2
                Как цифры нет? А вот этот текст разве не об этом?
                Внутри code может содержаться не более 25 обращений к методам API.

                Взят по вашей же ссылке на описание метода execute.
                  +2
                  Все дело в том, что у меня стоит английский язык, и в этой локализации этого текста нет. Спасибо что помогли разобраться.

                  Завел баг об этом в трекере
          +2
          Чтобы не передавать весь код каждый раз, просто создайте в вашем приложении хранимую процедуру и вызывайте ее обычным рестом.

          П.С: Тоже пользуюсь этой фишкой. Только еще и через несколько акков )
          Я думаю, те кто так или иначе качал инфу юзеров/групп контакта знают про эту штуку. Правда скачивание лайков все еще является убийственным, по количеству запросов.
            +13
            и тут внезапно контактик полег…
              +4
              image
              Все методы лежат
              image
              0
              А какой дневной лимит на вызовы API для одного id?
                +1
                не слышал о дневном лимите, я думаю его нет.
                  0
                  Лимиты вроде как есть — vk.com/dev/api_requests:
                  Помимо ограничений на частоту обращений, существуют и количественные ограничения на вызов однотипных методов. По понятным причинам, мы не предоставляем информацию о точных лимитах.
                +8
                Надо было назвать статью «как уронить вконтакте написав статью на хабрахабр»
                  0
                  теперь прикроют лазейку
                    +1
                    Это не лазейка, а документированная и рекомендуемая к использованию фича.
                  0
                  groups.getMembers — открытый метод, на него не действует ограничение 3 запроса в секунду, так как он может вызываться без access_token'a, т.е время в 22 минуты это очень преувеличено)
                  в то же время execute может поймать сразу 3 ошибки — флуд контроль, каптча, много запросов в секунду. Поэтому тут вопрос немного спорный, но я тоже юзаю execute для этой цели, когда запросы шлю с токеном, но делаю по 10 запросов, а не 25, разница не очень заметна, а если нужно показывать прогресс обработки — то по 10 визуально лучше. ну а с сервера исключительно чистый метод, без токена, что бы не нагружать токены.
                    0
                    разница будет заметна если взять группу с 4+ миллионов участников.
                    groups.getMembers — на него действует 3 секунды, вы путаете.
                      +2
                      3 секунды действует только на пользователя, на айпи нет ограничений в 3 запроса в секунду, поэтому нет, я не путаю
                    +1
                    На сколько мне известно, можно не извращаться с формированием переменной code на стороне клиента (мало того, код функции сейчас доступен каждому), а сохранить этот код в качестве хранимой процедуры на стороне ВК. Итог тот же, только передавать переменную code не нужно.
                      +1
                      Да, вы правы. Только в данном случае работал с iframe приложением vk, где нет возможности добавить хранимые процедуры.
                        +1
                        Понятно. Думаю, что в статье стоило бы об этом напомнить! Многим было бы удобнее использовать как раз таки хранимые процедуры.
                          0
                          В клубе год назад проскакивало, что можно, если временно в настройках поменять тип приложения на flesh.
                        0
                        Всё хорошо, за исключением того, что если число участников сообщества после запуска скрипта по какой-либо причине уменьшилось, и не растёт, то условие if (members_count > membersGroups.length) не будет выполнено, и цикл будет выполняться до тех пор пока число подписчиков снова не возрастёт. На мой взгляд, лучше использовать в условии не число ранее извлечённых подписчиков membersGroups.length, а считать количество вызовов и умножать на 25000. Что скажете?
                          0
                          Для крупных сообществ, сбор списка Участников которых занимает относительно протяженное время, возможна ситуация, когда кто-то вышел/вошёл прямо во время считывания. Если в это время вы читаете Участников с offset ближе к концу, это вероятно скажется на смещении базы пользователей на эти 1-2 аккаунта.

                          Поэтому, если важна точность до каждого аккаунта, как напр. в моём «Дезертире», считывать список приходится с захлёстами между отдельными тысячами.

                          Практика показывает, что на миллионниках это помогает избежать ошибок.

                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                          Самое читаемое