Получение участников сообщества vk.com через REST API с помощью PHP

в 0:00, , рубрики: Песочница

На данный момент 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. Это мой первый опыт выкладывания туториала, поэтому ожидаю адекватных советов от завсегдатых…

Автор: тащит всю команду

Источник

* - обязательные к заполнению поля