Страницы

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

воскресенье, 15 декабря 2019 г.

Как получить лучшего лайкера? VK API, PHP

#php #vkontakte_api


Есть задача - нужно получить лучшего лайкера постов за неделю. При помощи каких методов
лучше всего это реализовать? (Пытался собирать все посты в массив и после прогонять
каждый отдельный пост через likes.get, но по коду получилось очень объемно и есть проблемы
с ограничениями на количество запросов в секунду к VK api)
    


Ответы

Ответ 1



На самом деле тут нужно подумать, не все так просто, хотя недавно передо мной стояла задача сделать аналогичную функцию для вывода самого активного пользователя недели на обложку группы. И вот я делюсь с вами парочкой вариантов как это можно сделать: Итак, первый вариант: Он очень схож с описанием вашего варианта реализации, то есть, получаем записи с определенной группы с помощью метода wall.get (с учетом специального фильтра1), далее используем метод likes.get и проходим по отфильтрованным постам, получаем списки пользователей, остается только подсчитать и выбрать самого активного. Плюсы: Получение точных данных на текущий момент, то бишь на момент запроса. Минусы: Большой объем данных и длительное время их получения. Второй вариант идентичен первому, но суть в том, что он является не полным: Он строится таким образом, что скрипт получает данные самого активного юзера не за неделю, а за сутки. Таким образом имеем данные всех пользователей поставивших лайк за сутки (при желании выделяем самого активного за 1 день). Итак, спустя 7 дней на основе полученных данных строится статистика и подсчет самого активного. Неактуальные данные, которым больше недели, удаляются, и загружаются новые. Плюсы: Тут можно сказать, что это палка о двух концах, как бы много времени не теряем (если получаем данные за сутки), все происходит быстро, но если смотреть с другой стороны, нужно ждать неделю, чтобы сказать наверняка. Минусы: Манипуляции пользователей, то есть, в течении недели, пользователь может убрать лайк на определенной записи, или же новый пользователь может добавить. Итак, можно сделать вывод, что если мы заранее получили данные (а после чего на загруженных нами постами случались манипуляции в виде убранного/добавленного лайка), то можем считать, что у нас данные являются устаревшими. Специальный фильтр1 — это логика, с помощью которой скрипт подгружает исключительно посты те, где дата с момента публикации не превышает больше одной недели. Касаемо ограничения токена на 3 запроса в секунду, могу посоветовать использовать массив токенов (скажем около 10), и совсем недавно открыл для себя то, что можно использовать генераторы (подр. см. здесь), или функцию со статический переменной (подр. см. здесь). Простой пример реализации, имеем массив токенов: $data = ['token', 'token2', 'token3', 'token4']; И у нас, допустим, имеется огромный цикл, около 1000 итераций, чтобы не использовать один токен на протяжении всех итераций, можно задействовать их по порядку из массива, с помощью функцией ниже (пример реализации функции со статической переменной): function demark($data) { static $i = 0; return $data[$i++ % count($data)]; } И, когда мы запустим цикл в котором итераций будет больше, чем токенов в массиве, тогда увидим, что как только токены в массиве заканчиваются, их отсчет начинается сначала: for ($i = 0; $i < 10; ++$i) echo $i.' => '.demark($data), PHP_EOL; В результате получаем следующий результат (демо см. здесь): 1 iteration => token 2 iteration => token2 3 iteration => token3 4 iteration => token4 5 iteration => token 6 iteration => token2 7 iteration => token3 8 iteration => token4 9 iteration => token 10 iteration => token2 Лично я использовал 2-ой вариант, но склонен к тому, что разумнее использовать первый, так как он является более точным и практичным по сравнению со вторым.

Ответ 2



Рекомендую использовать метод execute позволяющий объединить 25 запросов в одном. Первым запросом с помощью метода wall.get можно забирать 25*100=2500 постов, далее допустим 100*25 запросов likes.get. Даже если подстраховаться от лимитов VK поставив между запросами sleep(1) скрипт должен отработать за 2-3 минуты.

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

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