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.
- Mobaxterm SSH RDP FTP...
- Thunderbird Email client
- Filezilla FTP client/server
- Nirsoft Win utils
- Sysinternals Win utils
- Pi-Hole AD block by DNS
- NUT UPS manager
- Rpi MON Raspberry monitoring
- Free CAD 3D modelling
- Free Commander Far-like filemanager
- Bitwarden Password manager
- Django web framework
- celery multi-tasking
- celery-beat Celery + Django
- celery-results Celery + Django
- Pillow Python image lib
- wsgi mod Apache + Python
- requests best in WEB requests
- openpyxl make Excell docs
- p4python Perforce + Python
- paramiko SSH + Python
- pyvmomi ESXi Vcenter + Python
I'm using these libraries so you can ask me about them.
vk execute wall get comments automation
Как использовать vk execute для получения всех комментариев со всех постов?
Как и обещал, пришло время выложить исходники (исподники) скриптов, которые я использую для собирания комментов с постов в группе. [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
- если комментариев больше 100 - обновить переменную offset и запустить цикл до тех пор, пока переменная не сравняется с кол-вом комментариев -> 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 Код можно взять здесь: Вкрапление кода, для обработки списка постов взято отсюда и немного изменено: