vk execute wall get comments automation

Как использовать vk execute для получения всех комментариев со всех постов?

py_vk

Как и обещал, пришло время выложить исходники (исподники) скриптов, которые я использую для собирания комментов с постов в группе.

Почему «исподники»? Потому что этот самый код на самом деле такая глючная тварь и такой «грязный» что его стыдно показывать на людях!
Эту конструкцию я использую в двух модулях, один собирает статистику, другой удаляет комментарии, если они оставлены не участником группы\сообщества. Обновляться и рассматриваться эта конструкция будет в ключе использования её именно как парсилки комментариев, для последующего удаления оных. Главная проблема заключалась в том, что возвращался крайне запутанный список, в котором могли возникать пробелы, из-за которых удалялись не те комментарии, которые следовало бы удалять.

Суть в следующем, у вас есть группа, в которой есть посты, в которых есть комментарии. Вначале вы отбираете ТОЛЬКО те посты, в которых комментов больше нуля и формируете их них список, разделенный запятыми, это важно, так как метод вк не позволяет отправлять сразу список, поэтому мы его «обманем».

Порядок действий такой:

  • получить все посты (wall.get) -> python
    • отобрать посты, где комментарии > 0; -> python
    • соорудить array из id постов, перевести его в строку: ‘11111,2222,3333,4444‘; -> python
  • передать строку в execute-> python
    • собрать с каждого поста комментарии; -> vk execute
    • собрать из комментариев результирующий список (id комментария, id юзера, время, лайки) -> vk execute
      • если комментариев больше 100 —
        обновить переменную offset и запустить цикл до тех пор,
        пока переменная не сравняется с кол-вом комментариев -> vk execute

        • получить оставшиеся комментарии в этом цикле, выйти из него -> vk execute
        • добавить в список указанный ранее, выше в коде -> vk execute
    • получить список комментариев -> python

Как это выглядело со старым кодом:

response: [[
[481784, 481785, 481790, 481818, 481821, 481824, 481828, 481832, 481859, 481873, 481876], 
[191497646, 13400503, 138118604, 255472757, 255472757, 255472757, 255472757, 255472757, 9175668, 53942663, 9175668], 
[1469552168, 1469552240, 1469553891, 1469561626, 1469562110, 1469562212, 1469562342, 1469562457, 1469577253, 1469600240, 1469600769], 
[2, 2, 6, 0, 0, 0, 0, 0, 1, 0, 0]
]]

Вот это все список списков со списками элементов всех комментов, то есть первый список в списке — id комментариев и далее по схеме. Все это крайне неудобная, монструозная, ужасная конструкция, которую приходится еще потом дополнительно разгребать.

# Format tuple - comment_id, user_id, date, likes
all_post_comments_formatted = []
for list_item in all_comments:
    for element in list_item:
       element_formatted = list(zip(element[0], element[1], element[2], element[3]))
       all_post_comments_formatted.append(element_formatted)
То есть вот эти все списки приходится «пересписчивать» в один тупль (честно, я вообще не отстреливаю вот эти вот русскоязычные аналоги типов: словарь, список, кортеж бррр) и конечно же, спешу вас удивить — часто-не-часто, но возникают всякие проблемы, когда удаляются комментарии именно участника группы, хотя логика скрипта НЕ предполагает попадания id участника в список «на удаление» — чисто логически, вернется просто Null, но никак не id.

Как это выглядит сейчас:

response: [
[481784, 191497646, 1469552168, 2], 
[481785, 13400503, 1469552240, 2], 
[481790, 138118604, 1469553891, 6], 
[481818, 255472757, 1469561626, 0], 
[481821, 255472757, 1469562110, 0], 
[481824, 255472757, 1469562212, 0], 
[481828, 255472757, 1469562342, 0], 
[481832, 255472757, 1469562457, 0], 
[481859, 9175668, 1469577253, 1], 
[481873, 53942663, 1469600240, 0], 
[481876, 9175668, 1469600769, 0]
]

Сейчас старый код будет использоваться чисто в образовательных целях, потому как у меня наконец появилось время его переделать в новый, чистый! Теперь новая версия возвращает список элементов со свойствами каждого комментария в элементе, что позволит избежать ситуаций, когда id комментариев и пользователей путаются и удаляются не те комментарии, сейчас, если что-то пойдет не так, один элемент просто выпадет из списка, а не будет сдвигаться и заменять другие.

Кроме того, новый подход позволит избавиться от дополнительной секции кода в Python, где ранее приходилось склеивать списки в одно целое. Еще не знаю, конечно, как поведет себя новая версия под нагрузкой, но надеюсь все будет ОК, и спустя какое-то время я выложу и его.

Все это было создано по опыту и подобию логики, некогда описанной здесь: vk execute VS python while

Код можно взять здесь:

Вкрапление кода, для обработки списка постов взято отсюда и немного изменено:

trianglesis

Об авторе trianglesis

Александр Брюндтзвельт - гений, филантроп, 100 гривен в кармане. Этот блог - "сток" моих мыслей и заметок. Достаточно одного взгляда на него, чтобы понять, что такой же бардак творится у меня в голове. Если вам этот бардак интересен - милости прошу.
Закладка Постоянная ссылка.
  • Denis Krylov

    Спасибо, очень здорово и полезно, единственный вопрос, как потом response с комментариями связать с самими постами, ведь в ответе не приходит post_id?

    • trianglesis

      А вы ведь когда собираете комменты — используете этот же пост айди.
      Каждая итерация по сбору комментов это один пост айди отправленный в теле запроса на ВК, так что он у вас уже есть изначально.

      • Denis Krylov

        Да, уже слегка изменил код. Все ровно работает, но на постах с большим количеством комментариев часто вылетает error:Too many API calls… Пока не решил как поправить.