На данный момент VK API уже имеет версию 5.68 и многие уже знакомы с его методом execute, который позволяет запускать последовательность других методов, сохраняя промежуточные результаты.
На днях столкнулся с задачей получения списка участников сообщества. Поиск в интернете дал достаточные результаты, но к сожалению интересующий метод был реализован не на PHP. Подумал, что кому-то еще будет интересна и полезная такая реализация алгоритма.
Реализация на PHP
Чтобы работать с API на PHP необходимо подключить библиотеку
require_once('src/VK/VK.php');
require_once('src/VK/VKException.php');
Затем необходимо пройти авторизацию, для того, чтобы начать делать запросы к vk.com
self::ex();
public static function ex () {
$attach = ORM::for_table('attach')->where('id', 1)->find_one(); // получение данных для авторизации из базы данных таблицы attach
$vk_config = array(
'app_id' => $attach->app_id,
'api_secret' => $attach->api_secret,
'access_token' => $attach->access_token
);
$vk = new VKVK($vk_config['app_id'], $vk_config['api_secret'], $vk_config['access_token']); // создание объекта с последующей авторизацией
Далее сделаем запрос на получение информации о сообществе (кол-ве участников)
$group_id = group_id; // пишеи сюда ID сообщества
$membersGroups = array(); // массив участников группы
$info_group = $vk->api('groups.getById', array( // вызов запроса на информацию о сообществе и получения количества участников и фотографии 200х200 px
'group_id' => $group_id,
'fields' => 'photo_200,members_count',
'v' => '5.27'
));
if ($info_group['response']) { // проверка на успешный запрос
print_r('<img src="' . $info_group['response'][0]['photo_200'] . '">'); // вывод информации
print_r('<br> Участников: ' . $info_group['response'][0]['members_count']);
}
Вызов метода формирования code для exсute с последующим повторного вызова функции для достижения поставленной цели.
self::getMembers25k($group_id, $membersGroups, $info_group['response'][0]['members_count'], $vk);
// $group_id - ID сообщества
// $membersGroups - массив участников
// $info_group['response'][0]['members_count'] - количество участников сообщества
// $vk - объект
public static function getMembers25k ($group_id, $membersGroups, $len, $vk) {
require_once('src/VK/VK.php');
require_once('src/VK/VKException.php');
$code = 'var members = API.groups.getMembers({"group_id": ' . $group_id . ', "v": "5.27", "sort": "id_asc", "count": "1000", "offset": ' . count($membersGroups) . '}).items;' // делаем первый запрос и создаем массив
. 'var offset = 1000;' // это сдвиг по участникам группы
. 'while (offset < 25000 && (offset + ' . count($membersGroups) . ') < ' . $len . ')' // пока не получили 20000 и не прошлись по всем участникам
. '{'
. 'members = members + "," + API.groups.getMembers({"group_id": ' . $group_id . ', "v": "5.27", "sort": "id_asc", "count": "1000", "offset": (' . count($membersGroups) . ' + offset)}).items;' // сдвиг участников на offset + мощность массива
. 'offset = offset + 1000;' // увеличиваем сдвиг на 1000
. '};'
. 'return members;';
//print_r($code); die("asdasdasdasd");
$data = $vk->api("execute", array('code' => $code));
if ($data['response']) {
//print_r($data); die("123123132");
// $membersGroups = $membersGroups.concat(JSON.parse("[" + data.response + "]")); // запишем это в массив
$array = explode(',', $data['response']);
//print_r($array); die();
$membersGroups = array_merge($membersGroups, $array); // запишем это в массив
// $('.member_ids').html('Загрузка: ' + membersGroups.length + '/' + members_count);
if ($len > count($membersGroups)) {// если еще не всех участников получили
sleep(rand(0, 1));
self::getMembers25k($group_id, $membersGroups, $len, $vk); // задержка [0,1] с. после чего запустим еще раз
}
else { // если конец то
print_r("Готово");
print_r($membersGroups);
}
} else {
print_r($data); // в случае ошибки выведем её
}
die();
}
За основу была взята статья эта. огромное спасибо автору.
P.S. Это мой первый опыт выкладывания туториала, поэтому ожидаю адекватных советов от завсегдатых…
Автор: тащит всю команду