#php #vkontakte_api #like
Пытаюсь получить всех пользователей, кто поставил лайк под записью, через likes.getList. Но есть ограничение: получить разом можно только 1000 человек. А как получить всех пользователей, если таковых является, например, 3500? Вот так я получаю список первой 1000 лайкнувших: $res = file_get_contents('https://api.vk.com/method/likes.getList?type=post&owner_id=-1111&item_id=111&extended=1&count=1000&offset=0'); $resp = json_decode($res, true); foreach($resp['response']['items'] as $val) { echo $val['first_name'] . "
\n"; }
Ответы
Ответ 1
Небольшая функция, которая работает рекурсивно, каждый раз смещая параметр 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=-1111&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, то будет отрабатывать быстрее. Однако в результирующем наборе будет массив массивов. Это я к чему... Выбирайте что нужно: меньшая скорость, но по порядку или большая скорость, но потом при выводе придется организовывать двойной цикл.Ответ 2
Схематично (параметр offset описан в документации): offset = 0; while( likes.getList(type, owner_id, item_id, count, offset) != ERROR ) { users = [сколько_юзеров_получили]; if( users == 0 ) { /* всё, больше юзеров нет */ break; } offset += users; }
Комментариев нет:
Отправить комментарий