Страницы

Поиск по вопросам

четверг, 23 января 2020 г.

JS в PHP, получение через VK.API пользователей группы, execute

#php #vkontakte_api


Есть следующий код на Javascript, который с помощью метода execute VK.API получает
по 25 тысяч пользователей группы за один запрос. Прошу помочь переделать его в хранимую
процедуру приложения ВК + PHP.

VK.init({
    apiId: 654647 // ID вашего приложения VK
});

var membersGroups = []; // массив участников группы
getMembers(20629724);

// получаем информацию о группе и её участников
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('
' + r.response[0].name + '
Участников: ' + 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); // в случае ошибки выведем её } }); } В моём PHP коде сам запрос к API VK (синтаксис/интерфейс доступа к API VK) выглядит, к примеру, так: $group_members2 = $vk->api('groups.getMembers', array( 'group_id' => $groupID, 'count' => '1000', 'offset' => $offset, ));


Ответы

Ответ 1



Вам нужно чтобы ваш метод отсылал формировал урл в таком виде: https://api.vk.com/method/execute.ИМЯ_ПРОЦЕДУРЫ?СПИСОК_ПАРАМЕТРОВ к примеру: https://api.vk.com/method/execute.mymethod?group_id=1&count=1000&offset=100 Переданные параметры будут доступны внутри кода процедуры в виде полей объекта Args, например, если Вы передали ?user=123, то значение этой переменной будет доступно в Args.user Следовательно, у себя в настройках приложения в хранимых процедурах пишите метод по имени mymethod return API.groups.getMembers({group_id: Args.group_id, count: Args.count, offset: Args.offset}); Предположу, что класс по работе с апи php, взят отсюда: VKAPI И метод "api" позволяет формировать запрос типа "execute"

Ответ 2



Я вот тут писал про это. class DevClass { public $group_id = 30666517; public $membersGroups = array(); public $access_token = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; public function devMethod(){ $opts = ["group_id"=>$this->group_id, "access_token"=>$this->access_token, "fields"=>"photo_50,members_count", "v"=>"5.80"]; $answer = $this->vk->getMethod("groups.getById", $opts, true); //$members_count = $answer->response[0]->members_count; $members_count = 45000; $members_groups = 0; //изначально в массиве 0 объектов //выполняем цикл пока полученное кол-во участников меньше общего кол-ва участников в группе while($members_count > $members_groups){ usleep(300000); //задержка на 0.3 сек. $answer = $this->getMembers25k($this->group_id, $members_count); if($answer->response){ $new = explode(",",$answer->response); $this->membersGroups = array_merge($this->membersGroups, $new); //второй раз определяем переменную, уже с новым массивом данных $members_groups = count($this->membersGroups); } else{ echo "NO RESPONSE"; print_r($answer); die(); } } print_r($this->membersGroups); die(); } public function getMembers25k($group_id, $members_count) { $members_groups = count($this->membersGroups); $offset = 1000; $code = 'var members = API.groups.getMembers({"group_id": '.$this->group_id.', "v": "5.80", "sort": "id_asc", "count": '.$offset.', "offset": '.$members_groups.'}).items;' .'var offset = '.$offset.';' .'while (offset < 25000 && (offset + '.$members_groups.') < '.$members_count.')' .'{members = members + "," + API.groups.getMembers({"group_id": '.$this->group_id.', "v": "5.80", "sort": "id_asc", "count": '.$offset.', "offset": ('.$members_groups.' + offset)}).items;offset = offset + '.$offset.';};' .'return members;'; $answer = $this->vk->getMethod("execute", ["code" => urlencode($code), "v"=>"5.80", "access_token" => $this->access_token], true); return $answer; } } $dev = new DevClass(); $dev->devMethod(); Но надо понимать, что тут у меня уже сформирован access_token другим классом, как и запросы к методам ($this-> vk -> getMethod); я лишь хотел показать логику.

Комментариев нет:

Отправить комментарий