Получить комментарии vk api

Но бывают сообщества, с которых эти команды возвращают ошибку «Too many operations» — по-видимому, из-за большого количества комментариев на них, которые процедурой не обрабатываются (так как берется определенное количество постов, а комментариев к ним слишком много).

Вопрос заключается в том, как уменьшить в коде приведенной ниже процедуры — значение постов так, чтобы также не было пропусков между цифровыми шагами? То есть, чтобы процедура брала постов меньше чем она берет сейчас (пусть берётся один пост), но чтобы следующая команда продолжала с комментария, на котором остановилась предыдущая, и таким образом, получался бы последовательный перебор страниц без пропусков?

if (post_count == null)
post_count = 10;

// Получаем список постов
var posts = API.wall.get( <
«owner_id»: owner_id,
«offset»: offset,
«count» : 100,
>);

var i = 0;
var userComments = <>;

while(i < posts.items.length i < post_count)

Парсинг стены вконтакте vk api | Основы


<
var post_id = posts.items[i].id;
var comments = API.wall.getComments( <
«owner_id»: owner_id,
«post_id»: post_id,

var j = 0;
while(j < comments.items.length)
<
if (user_id == null || comments.items[j].from_id == user_id)
userComments.push(comments.items[j]);

Цитата:

То есть, чтобы процедура брала постов меньше чем она берет сейчас (пусть берётся один пост)

ну так укажите другое число
Цитата:

var comments = API.wall.getComments( <
«owner_id»: owner_id,
«post_id»: post_id,

Точно: процедура ищет только среди первых ста комментариев у указанного числа постов (post_count = *;), пропуская сто первый и все последующие коммы и переходя к следующему посту. Это не то, что было нужно.

Может есть возможность следующую процедуру, возвращающую 500 записей со стены за раз (путём вызова 5 методов подряд) — приспособить для получения комментариев из одного поста? То есть, в процедуре, приведенной выше — указать обрабатывать 1 пост за раз, но комментарии из него доставать по примеру ниже? —

Цитата:

приспособить для получения комментариев из одного поста

https://vk.com/dev/wall.getComments

Цитата:

Возвращает список комментариев к записи на стене.

что не так?

Если получать комментарии так — то придется делать множество запросов. Тогда как с вызовом сразу нескольких (до 25-ти) методов внутри execute — понадобится только один запрос. Поэтому хотелось, чтобы первая процедура брала один пост и последовательно получала подстраницы коммов к нему, не ограничиваясь первой сотней.

Еще по теме:  Советы и идеи Вконтакте

КАК НАКРУТИТЬ КОММЕНТАРИИ ВКОНТАКТЕ С ТЕЛЕФОНА. РАБОЧИЙ СПОСОБ.НЕ ФИКС. МНОГО КОММЕНТАРИЕВ ВКОНТАКТЕ

Пост и комментарии — это примерно как у нас на форуме, — в самом верху основное стартовое сообщение, а внизу комментарии к нему.

Добавлено:
Есть ещё такая процедура, получающая 2500 коммов к посту. Может её можно будет объединить с первой процедурой? —

Источник: forum.ru-board.com

Как получить комментарии пользователя, оставленные в конкретном сообществе в vk

Как получить все комментарии конкретного пользователя, оставленные на стене под постами в конкретном сообществе в vk?

Я рассмотрел все методы, существующие в vk api и пока не нашел способа выполнить данную задачу.

В качестве исходных данных в этой задаче даны id пользователя и id сообщества.

Вот пример того, как я это пытался реализовать:

for i in range(200): url = «https://api.vk.com/method/wall.get?owner_id=%scount=1″ % (self.text1.toPlainText(), i) response = requests.get(url).text parsed_string = json.loads(response) url1=»https://api.vk.com/method/wall.getComments?owner_id=%scount=100» %(self.text1.toPlainText(), parsed_string[‘response’][1][‘items’][‘id’]) response1 = requests.get(url1).text parsed_string1 = json.loads(response1) for j in range(1, len(parsed_string1[‘response’])): if parsed_string1[‘response’][j][‘items’][‘from_id’]==self.text2.toPlainText(): item1 = QTableWidgetItem(parsed_string1[‘response’][j][‘items’][‘text’]) item2 = QTableWidgetItem(str(datetime.datetime.fromtimestamp(parsed_string1[‘response’][j][‘items’][‘date’]))) self.tablewidget.setItem(i-1, 0, item1) self.tablewidget.setItem(i-1, 1, item2)

Но в таком случае происходят слишком частые запросы к серверу, да и этот вариант слишком муторный. Подскажите, пожалуйста, в каком направлении мне двигаться и какие у вас есть мысли по этой теме.

Ответы (1 шт):

VK API позволяет получить комментарии только для определенного объекта за один запрос. Например, можно получить список комментариев к конкретному посту на стене с помощью метода wall.getComments . Из этого списка нужно будет отобрать комментарии нужного пользователя.

Чтобы получить комментарии сразу к нескольким постам можно воспользоваться хранимыми процедурами, либо методом execute. Метод execute в качестве параметра принимает код хранимой процедуры и выполняет его. ВКонтакте поддерживает хранимые процедуры с возможностью до 25 обращений к бд внутри одной процедуры. Таким образом мы можем получить за раз комментарии сразу к нескольким постам.

Как написать процедуру

Для этого можно воспользовать функционалом, который предоставляет ВК. Первым делом Вам понадобится приложение для доступа к API. Создать его можно тут (кликабельно) — кнопка Создать приложение . После создания зайдите в редактирование приложения, перейдите в раздел Хранимые процедуры и нажмите Добавить новую процедуру .

Создание хранимой процедуры

Теперь нужно написать саму процедуру. Следующая процедура будет возвращать комментарии конкретного пользователя к 10 постам:

Еще по теме:  Зачем зеркалят фильмы Вконтакте

var owner_id = Args.owner_id; var user_id = Args.user_id; var offset = Args.offset; var post_count = Args.post_count; if (post_count == null) post_count = 10; // Получаем список постов var posts = API.wall.get(< «owner_id»: owner_id, «offset»: offset, «count» : 100, >); var i = 0; var userComments = <>; while(i < posts.items.length i < post_count) < var post_id = posts.items[i].id; var comments = API.wall.getComments(< «owner_id»: owner_id, «post_id»: post_id, «count» : 100, >); var j = 0; while(j < comments.items.length) < if (user_id == null || comments.items[j].from_id == user_id) userComments.push(comments.items[j]); j = j + 1; >i = i + 1; > return userComments;

Как вызвать хранимую процедуру

Вызвать можем 2мя способами:

  • Через созданное ранее приложение. Это возможно только с помощью токена данного приложения.
  • Через метод execute. Подойдет токен любого VK приложения.

Соответственно для получения списка комментраиев Вам нужно обратиться:

  • В первом случае к https://api.vk.com/method/execute.getCommentsFromPosts , передав соответствующие параметры.
  • Во втором к https://api.vk.com/method/execute , передав в качетве параметра code содержимое хранимой процедуры.

Источник: husl.ru

Пишем бота Slack для получения комментариев из VK на Python

Расширяя базовые возможности Slack, столкнулся с проблемой интеграции некоторых соц.сетей в чаты.

Чтобы подружить Slack и Вконтакте, было решено использовать Python и API. Ниже базовый рецепт того, как научить Slack-бота получать информацию о последних комментариях из постов на стене групп или сообществ Вконтакте.

Slack API

У популярного месенджера Slack есть удобный и простой API. С его помощью можно легко управлять чат-ботами и проводить различные манипуляции с каналами. Здесь представлен самый простой вариант по созданию чат-бота:

1. Откройте Slack.com (вы уже должны быть зарегистрированы в нем, для управления вашей командой).
2. Перейдите в управление приложениями slack.com/apps и откройте «Configure».
3. Откройте «Custom Integrations» и создайте своего первого бота для Slack. (Придумайте имя, выберите комнату, куда он будет отправлять сообщения)
4. Slack выдаст вам API token, который вы будете использовать для авторизации бота.

Slack-Bot.py

Начальная стадия пройдена, приступим к написанию бота. Для работы нам нужен установленный Python 3 и некоторые дополнительные библиотеки для работы c API. Устанавливаем slacker и VK_api:

$ pip install slacker $ pip install vk_api

Создаем базовый файл Slack-Bot.py в любом редакторе кода и начинаем писать нашего бота.

Импортируем нужные библиотеки:

from slacker import Slacker import vk_api

Авторизуемся по token в Slack:

slack = Slacker(‘Полученный ранее API token’)

Авторизуемся в VK.com:

login, password = ‘Login’, ‘pass’ vk_session = vk_api.VkApi(login, password) try: vk_session.authorization() except vk_api.AuthorizationError as error_msg: print(error_msg) return vk = vk_session.get_api()

Еще по теме:  Что такое мау Вконтакте

А теперь научим нашего бота получить информацию со стены групп Вконтакте:

man_id = str(-29534144) #id группа, с которой будем брать посты и комментарии postidlist = vk.wall.get(owner_id=man_id, count=1, offset=0) #получаем последний пост со стены a = str(postidlist[‘items’][0][‘id’]) #получаем id поста в виде цифры и записываем response = vk.wall.getComments(owner_id=man_id, post_id=a, count=1, sort=’desc’, offset=0) #Получаем последний комментарий в последнем посте со стены

По стандарту ответ приходит в виде массива, чтобы вытащить текст, надо выбрать интересующие нас строки:

b = response[‘items’][0][‘text’] #вытаскиваем из ответа только текст

Теперь полученный текст отправляем ботом в Slack (параметр #vk означает комнату куда бот отправить сообщение):

slack.chat.post_message(‘#vk’, ‘Новый комментарий: ‘ + b) #отправляем сообщение с текстом в Slack

Так мы получили базовый функционал по получению комментариев со стены групп Вконтакте и отправки их в комнаты Slack.

Логика работы скрипта следующая:

1. Авторизуемся в Slack и Вконтакте;
2. Запрашиваем у выбранной группы последний пост;
3. Получаем из поста последний комментарий;
4. Отправляем комментарий в Slack.

Можно модифицировать бота и расширить его функционал, добавив ему проверку стены группы с определенной периодичностью и отправлять новые комментарии в Slack.

Итоговый код работающего бота:

from slacker import Slacker import vk_api import time slack = Slacker(‘Вставить token Slack bot’) def main(): login, password = ‘login’, ‘pass’ vk_session = vk_api.VkApi(login, password) try: vk_session.authorization() except vk_api.AuthorizationError as error_msg: print(error_msg) return vk = vk_session.get_api() while True: #зацикливаем man_id = str(-29534144) #id группы с которой будем брать посты и комментарии postidlist = vk.wall.get(owner_id=man_id, count=1, offset=0) #получаем последний пост a = str(postidlist[‘items’][0][‘id’]) #получаем id поста в виде цифры и записываем time.sleep(5) ts = 10 bts = 10 while ts == bts: #сравниваем два числа времени комментариев, цикл выполняется до тех пор, пока цифры равны. response = vk.wall.getComments(owner_id=man_id, post_id=a, count=1, sort=’desc’, offset=0) #Получаем последний комментарий ts = str(response[‘items’][0][‘date’]) #запрашиваем время комментария time.sleep(5) #ожидание 5 секунд response = vk.wall.getComments(owner_id=man_id, post_id=a, count=1, sort=’desc’, offset=0) bts = str(response[‘items’][0][‘date’]) print(‘новых комментариев нет ‘ + ts + bts) time.sleep(5) #если время у комментариев разное цикл прекращается response = vk.wall.getComments(owner_id=man_id, post_id=a, count=1, sort=’desc’, offset=0) # получаем комментарий со стены b = response[‘items’][0][‘text’] #вытаскиваем из него только текст slack.chat.post_message(‘#vk’, ‘Новый комментарий: ‘ + b) #отправляем сообщение с текстом в Slack и повторяем цикл if __name__ == ‘__main__’: main()

Источник: habr.com

Рейтинг
( Пока оценок нет )
Загрузка ...