...
Just my blog

Blog about everything, mostly about tech stuff I made. Here is the list of stuff I'm using at my blog. Feel free to ask me about implementations.

Soft I recommend
Py lib I recommend

I'm using these libraries so you can ask me about them.

vk execute wall get comments automation

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

py_vk Как и обещал, пришло время выложить исходники (исподники) скриптов, которые я использую для собирания комментов с постов в группе. [su_note]Почему "исподники"? Потому что этот самый код на самом деле такая глючная тварь и такой "грязный" что его стыдно показывать на людях![/su_note] [su_quote]Эту конструкцию я использую в двух модулях, один собирает статистику, другой удаляет комментарии, если они оставлены не участником группы\сообщества. Обновляться и рассматриваться эта конструкция будет в ключе использования её именно как парсилки комментариев, для последующего удаления оных. Главная проблема заключалась в том, что возвращался крайне запутанный список, в котором могли возникать пробелы, из-за которых удалялись не те комментарии, которые следовало бы удалять.[/su_quote] Суть в следующем, у вас есть группа, в которой есть посты, в которых есть комментарии. Вначале вы отбираете ТОЛЬКО те посты, в которых комментов больше нуля и формируете их них список, разделенный запятыми, это важно, так как метод вк не позволяет отправлять сразу список, поэтому мы его "обманем".

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

  • получить все посты (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)

[su_quote]То есть вот эти все списки приходится "пересписчивать" в один тупль (честно, я вообще не отстреливаю вот эти вот русскоязычные аналоги типов: словарь, список, кортеж бррр) и конечно же, спешу вас удивить - часто-не-часто, но возникают всякие проблемы, когда удаляются комментарии именно участника группы, хотя логика скрипта НЕ предполагает попадания id участника в список "на удаление" - чисто логически, вернется просто Null, но никак не id.[/su_quote]

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

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 Код можно взять здесь: Вкрапление кода, для обработки списка постов взято отсюда и немного изменено: