Сбор данных о подписчиках группы Вконтакте (VK) через API с помощью execute

В текущем проекте мне понадобилось довольно плотно взаимодействовать с API Вконтакте. Раньше с ним работать не приходилось. Оказалось, он довольно удобный и функциональный, с опрятной документацией и понятными примерами. Через него можно решать огромное количество задач. Простая схема «вопрос-ответ», впрочем, как и для любого другого API, позволяет легко получать статистику, управлять группами, пользователями и т.д.

Все это хорошо работает пока дело касается управления малым количеством групп или вообще одной, но для обработки больших массивов данных, для части задач из ТЗ текущего проекта, скорости работы не хватило. Вкратце об одной из задач, мне нужно было собрать статистику по полу и возрасту подписчиков большого числа сообществ, т.е. относительно быстро выкачать данные о миллионах подписчиков десятков тысяч групп, причем, не один раз. Сложность в том, что у Вконтакте можно запрашивать всего-то по 1 000 записей за один запрос. Плюс к этому, количество запросов тоже ограничено. В моей ситуации максимальное количество извлекаемых подписчиков — 5 000 в секунду, и это в лучшем случае, если учитывать ошибки от самого API, сетевые задержки и, конечно, время на обработку полученных данных (эти процессы можно распараллелить, но на это тоже придется потратить дополнительные ресурсы, время и деньги).

Разработчики Вконтакте в курсе подобных проблем и для таких случаев придумали метод «execute«, который умеет исполнять пользовательский код (т.е. наш код) на специальном языке VKScript. VKScript — язык схожий с JavaScript, в документации так, кстати, и написано. Подробнее о нём можно почитать на Хабре или посмотреть примеры из Вконтакте на странице документации метода «execute». В скрипте на VKScript вы можете целых 25 раз обращаться к API Вконтакте. Схема работы выглядит так: вы выполняете запрос к API с параметром «code», который содержит в себе скрипт на языке VKScript с вызовом API, т.е. ваш один запрос раскрывается в 25 запросов, причем, вы можете частично обработать полученные данные из этих запросов прямо в этом клиентском коде (сильно не увлекайтесь обработкой на стороне Вконтакте, ограничения на количество операций тоже есть) и вернуть себе в подходящем виде. Примеры ниже.

Адрес запроса:

https://api.vk.com/method/execute?access_token=ВАШ_ТОКЕН&v=ВЕРСИЯ_АПИ'

Пример скрипта на VKScript собирающего возраст, пол, страну и город подписчиков группы:

var allMembers = {};
var countRequest = 0;
var currentMembers = {};
var response;
var startFrom = 0; // С какой записи стартовать.
var keys = {};
var countSelectedMembers = 0;
 
while(countRequest < 25) {
	countRequest = countRequest + 1;
	response = API.groups.getMembers({
		"group_id" : 999999999999, // Идентификатор группы.
		"count" : 1000,
		"fields" : "bdate, sex, country, city",
		"start_from": startFrom
	});
	currentMembers = response.items.length;
	countSelectedMembers = countSelectedMembers + currentMembers;
 
	allMembers.push(response);
	startFrom = response.next_from;
	keys.push(startFrom);
 
	if (startFrom == "") {
		return {
			"members" : allMembers,
			"next_from" : startFrom,
			"is_end" : "yes",
			"keys" : keys,
			"count_selected_members" : countSelectedMembers
		};
	}
}
 
return {
	"members" : allMembers,
	"next_from" : startFrom,
	"is_end" : "no",
	"keys" : keys,
	"count_selected_members" : countSelectedMembers
};

Если не удается прочесть весь список объектов (а так почти всегда и бывает), то VK выдаёт ключ «следующей страницы» в поле «next_from», значение которого нужно прописывать в следующем запросе в поле «start_from».

P.S. Один из скриптов выдернул из рабочего процесса и некоторые возвращаемые значения лично вам могут не понадобиться, но они являются хорошим примером создания своего формата ответа от API Вконтакте под нужды проекта.

Полезные ссылки

08.10.2023

Категория(-и): Статьи

# # # #

Добавить комментарий