Страницы

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

четверг, 5 декабря 2019 г.

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

#vkontakte_api #python_35 #pyqt5


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

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

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

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

for i in range(200):
    url = "https://api.vk.com/method/wall.get?owner_id=%s&offset=%s&count=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=%s&post_id=%s&count=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 содержимое хранимой процедуры.

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

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