Получение участников сообщества 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 запросов.

Содержание:

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

Чтобы работать с Open Api нам нужно подключить библиотеку OpenApi.

<script src="http://vk.com/js/api/openapi.js" type="text/javascript"></script> 

Пройдем авторизацию приложения 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(r) { 			if(r.response) { 				$('.group_info') 				.html('<img src="' + r.response[0].photo_50 + '"/><br/>'  					+ r.response[0].name 					+ '<br/>Участников: ' + r.response[0].members_count); 				getMembers20k(group_id, r.response[0].members_count); // получаем участников группы и пишем в массив membersGroups 			} 	}); } 

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

VK.init({     apiId: 6456476 // 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(r) { 			if(r.response) { 				$('.group_info') 				.html('<img src="' + r.response[0].photo_50 + '"/><br/>'  					+ r.response[0].name 					+ '<br/>Участников: ' + 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, выглядело так:
image

Пример работы: swey.biz/getmembersVKAPI/index.html
Исходники: github.com/romkagolovadvayha/getmembersVKAPI.git

ссылка на оригинал статьи http://habrahabr.ru/post/248725/


Комментарии

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *