Pull to refresh

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

На данный момент 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 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. Это мой первый опыт выкладывания туториала, поэтому ожидаю адекватных советов от завсегдатых…
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.