Страницы

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

понедельник, 27 мая 2019 г.

Как получить больше 1000 людей, лайкнувших пост, через VK API?

Пытаюсь получить всех пользователей, кто поставил лайк под записью, через likes.getList. Но есть ограничение: получить разом можно только 1000 человек. А как получить всех пользователей, если таковых является, например, 3500?
Вот так я получаю список первой 1000 лайкнувших:
$res = file_get_contents('https://api.vk.com/method/likes.getList?t‌​ype=post&owner_id=-1‌​111&item_id=111&exte‌​nded=1&count=1000&of‌​fset=0'); $resp = json_decode($res, true); foreach($resp['response']['items'] as $val) { echo $val['first_name'] . "

"; }


Ответ

Небольшая функция, которая работает рекурсивно, каждый раз смещая параметр offset на нужную величину (на offset в запросе + количество уже выбранных юзеров count) пока не придет пустой ответ. Это значит, что пора обрывать рекурсию.
Однако может еще прийти ответ error вместо response. Но эта обработка на вашей совести))
Еще также указывайте версию API, а то может вернуть не те данные, которые ожидаете или вообще ошибку вернуть.
$count = 1000; $offset = 0; $apiVersion = 5.60; $result = [];
getLikesData($result, $count, $offset, $apiVersion);
function getLikesData(&$output, $count, $offset, $apiVersion) { $query = 'https://api.vk.com/method/likes.getList?type=post&owner_id=-1‌​111&item_id=111&extended=1&friends_only=0&v='.$apiVersion.'&count='.$count.'&offset='.$offset; $resp = json_decode(file_get_contents($query), true);
if (!$resp['response']) return;
$items = $resp['response']['items'];
if (empty($items)) return;
foreach ($items as $item) { $output[] = $item; }
getLikesData($output, $count, $offset + $count, $apiVersion); }
echo '

';
print_r($result);
echo '
';

В функции находится цикл для заполнения результирующего массива по порядку. Если вместо этого воспользоваться array_push, то будет отрабатывать быстрее. Однако в результирующем наборе будет массив массивов.
Это я к чему... Выбирайте что нужно: меньшая скорость, но по порядку или большая скорость, но потом при выводе придется организовывать двойной цикл.

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

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