На данный момент VK API уже имеет версию 5.68 и многие уже знакомы с его методом execute, который позволяет запускать последовательность других методов, сохраняя промежуточные результаты.
На днях столкнулся с задачей получения списка участников сообщества. Поиск в интернете дал достаточные результаты, но к сожалению интересующий метод был реализован не на PHP. Подумал, что кому-то еще будет интересна и полезная такая реализация алгоритма.
Чтобы работать с API на PHP необходимо подключить библиотеку
Затем необходимо пройти авторизацию, для того, чтобы начать делать запросы к vk.com
Далее сделаем запрос на получение информации о сообществе (кол-ве участников)
Вызов метода формирования code для exсute с последующим повторного вызова функции для достижения поставленной цели.
За основу была взята статья эта. огромное спасибо автору.
P.S. Это мой первый опыт выкладывания туториала, поэтому ожидаю адекватных советов от завсегдатых…
На днях столкнулся с задачей получения списка участников сообщества. Поиск в интернете дал достаточные результаты, но к сожалению интересующий метод был реализован не на 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 VK\VK($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. Это мой первый опыт выкладывания туториала, поэтому ожидаю адекватных советов от завсегдатых…