На днях стояла задача посчитать количество пользователей сайта vk.com, поделившихся определенным постом (т.е. количество репостов). Для этого существует приложение «Вирусоанализатор», но в процессе использования выяснилось, что оно не считает большое количество репостов (от 100 и более). Ползунок доходит почти до конца и на этом останавливается. А т.к. уже был объявлен конкурс на наибольшее количество репостов на определенную запись, то нужна была альтернатива. Которой не оказалось…
Поэтому пришлось обращаться к API Вконтакте и искать как реализовать данную задачу. Сразу скажу, что не пришлось создавать standalone-приложения для этой цели. Все получилось реализовать при помощи методов, не требующих access_token. Ниже представлен список методов API, используемых в данной задаче:
- likes.getList — получение списка пользователей, который нажали «Мне нравится» или «поделились» постом
- users.get — получение информации о пользователях по их uid или коротким именам
- wall.get — получение новостей со страницы пользователя.
Из плюсов данного расчета можно выделить только то, что не нужно создавать приложение для этой цели.
Бот ВКонтакте на Python #1 | Парсинг ВКонтакте
Из минусов (если изучить эти API методы): неудобный поиск нашего репоста у пользователя. Вконтакте разрешает получить методом wall.get максимум 100 новостей. Разумеется данный метод поддерживает параметр offset (смещение по новостям), но все же я ограничился определенным количеством новостей для обработки (500 штук).
Некоторые возникшие проблемы:
Итак, нам нужно было данные о тех пользователях и их постах, которые поделились нашим репостом. Для получения этого списка используется метод API likes.getList, у которого есть параметр filter, принимающий два возможных значения:
- likes — пользователи, которые нажали «Мне нравится»
- copies — пользователи, которые поделились постом. Именно это и нужно.
Но когда уже что-то было готово, выявилось, что данные, полученные при помощи API не сходятся с реальными.
Например, пользователь который «поделился» не доставался методом likes.getList?filter=copies, но находился в списке, которым просто «понравилась» запись. К тому попался еще один пользователей с ситуацией с точностью до наоборот.
Поэтому для более верных результатов пришло обрабатывать весь список (пользователи, нажавшие «Мне нравится» и «Поделиться»).
Ниже приведен класс, написанный на PHP для поиска количества репостов:
Показать код
-
‘; $this->printProgress(‘Получаю список ID пользователей, сделавших репост. ‘); $this->getUsers($this->owner_id, $this->post_id, ‘copies’); $this->printProgress(‘Список ID успешно получен’, false); $copies = $this->users; $this->printProgress(‘Получаю список ID пользователей, сделавших лайк. ‘); $this->getUsers($this->owner_id, $this->post_id, ‘likes’); $this->printProgress(‘Список ID успешно получен’, false); foreach ($this->users as $id) < if (in_array($id, $copies)) continue; $copies[] = $id; >$this->users = $copies; $this->printProgress(‘Уникальных ID пользователей для получения их информации: ‘.count($this->users).»); $this->printProgress(‘Получаю информацию о пользователях по их ID. ‘); $usersWithInfo = $this->getUsersInfo($this->users); $this->printProgress(‘Информация была успешно получена’, false); $this->printProgress(‘Уникальных ID пользователей с информации: ‘.count($usersWithInfo).»); $this->printProgress(‘Подготавливаю массив с информацией о пользователях. ‘); $this->users = $this->remakeUsersArray($usersWithInfo); $this->printProgress(‘Массив успешно сформирован’, false); $this->printProgress(‘Начинаем искать репосты у пользователей. ‘); $k = 1; foreach ($this->users as $id => $data) < $this->printProgress(».$k.’) Обрабатывается пользователь: id’.$id.’ — ‘.$data[‘last_name’].’ ‘.$data[‘first_name’].»); $this->getUsersPosts($id); if ($this->find) < $this->printProgress(‘Определяем количество репостов #’.$this->findPost.’ у пользователя. ‘); $this->getUsers($id, $this->findPost, ‘copies’, 0, true); $status = ‘countReposts > 0) $status .= ‘ style=»font-size: 20px;»‘; $status .= ‘>Количество репостов #’.$this->findPost.’: ‘.$this->countReposts.»; $this->printProgress($status, false); $this->users[$id][‘count_reposts’] = $this->countReposts; //тут можно добавлять $this->user[$id] в сессию > $k++; > $this->printProgress(‘Поиск репостов завершен’, false); > >
Вышеприведенный класс позволяет получить количество репостов с пользовательскими данными. Подобным образом можно считать и лайки (необходимо лишь установить ?filter=likes)
VK API — Урок photos.get как получить все фотографии из альбома пользователя и группы через php
Данное решение — очень удобный вариант отображения данных при встройке на свой сайт, при проведении различных викторин и конкурсов. К примеру мы это реализовали так
Источник: savepearlharbor.com
Как получить список постов в определенной группе в вк с помощью vk api?
Доброго времени суток!Скажите,как можно получить список ссылок на посты или же сами посты в определенной группе посредством vk api?Заранее спасибо!
- Вопрос задан более трёх лет назад
- 2884 просмотра
Решения вопроса 1
Воспользоваться методом wall.get VK API (https://vk.com/dev/wall.get).
На PHP примерно так:
var_dump(wallGet($owner_id, $count)); //должен вывести массив записей сообщества $owner_id, в количестве $count function wallGet($owner_id, $count) < $result = api(‘wall.get’, array( ‘owner_id’ =>-(int)$owner_id, ‘count’ =>(int)$count, )); if ($result !== false) < return $result[‘items’]; >else < return false; >> function api($method, $params) < $params[‘access_token’] = $access_token; $params[‘v’] = $api_version; $url = ‘https://api.vk.com/method/’ . $method; if (!function_exists(‘curl_init’)) < die(‘ERROR: CURL library not found!’); >$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $params); curl_setopt($ch, CURLOPT_HTTPHEADER, array( «User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729)», «Accept-Language: en-us,en;q=0.5>» )); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); $json = curl_exec($ch); $error = curl_error($ch); if ($error) < error_log($error); return false; >curl_close($ch); $response = json_decode($json, true); if (!$response || !isset($response[‘response’])) < error_log($json); return false; >return $response[‘response’]; >
Ответ написан более трёх лет назад
Нравится 1 2 комментария
Источник: qna.habr.com
Получение всех поcтов группы вКонтакте
Проблема: нужно получить информацию о всех постах группы вКонтакте (Python 3 + VK API). Дело в том, что метод wall.get позволяет получит информацию максимум о 100 постах. P.S. Заранее cпаcибо.
Отслеживать
1,732 1 1 золотой знак 21 21 серебряный знак 41 41 бронзовый знак
задан 9 авг 2016 в 11:47
Вадим Николаев Вадим Николаев
35 5 5 бронзовых знаков
Используйте offset : new.vk.com/dev/wall.get
9 авг 2016 в 12:44
не cовcем понял Ваc , как именно это иcпользовать ?Объяcни , еcли еcть время)
9 авг 2016 в 12:52
Организовать цикл. Собрать первые сто постов, потом ещё сто — и так далее, пока не соберёте все посты.
9 авг 2016 в 12:54
Извини за назойлевоcть , но не помешал бы пример
9 авг 2016 в 13:44
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
def do_vk_request(parameters, method_name, need_token=True): global requests if need_token: url = base_url + method_name + ‘?’ + urllib.parse.urlencode(parameters) + stub else: url = base_url + method_name + ‘?’ + urllib.parse.urlencode(parameters) + ‘https://ru.stackoverflow.com/questions/553558/%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B2%D1%81%D0%B5%D1%85-%D0%BF%D0%BEc%D1%82%D0%BE%D0%B2-%D0%B3%D1%80%D1%83%D0%BF%D0%BF%D1%8B-%D0%B2%D0%9A%D0%BE%D0%BD%D1%82%D0%B0%D0%BA%D1%82%D0%B5″ target=»_blank»]ru.stackoverflow.com[/mask_link]