Как использовать vk execute для получения всех комментариев со всех постов?
Как и обещал, пришло время выложить исходники (исподники) скриптов, которые я использую для собирания комментов с постов в группе.
Суть в следующем, у вас есть группа, в которой есть посты, в которых есть комментарии. Вначале вы отбираете ТОЛЬКО те посты, в которых комментов больше нуля и формируете их них список, разделенный запятыми, это важно, так как метод вк не позволяет отправлять сразу список, поэтому мы его “обманем”.
Порядок действий такой:
- получить все посты (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
- если комментариев больше 100 –
- получить список комментариев -> 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)
Как это выглядит сейчас:
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
Код можно взять здесь:
Вкрапление кода, для обработки списка постов взято отсюда и немного изменено: