Как открыть дамп вк
Перейти к содержимому

Как открыть дамп вк

Делаем дамп фотографий из диалога vk.com

Вчера мне понадобилось скачать все фотографии из диалога с одним человеком в vk.com. Фотографий было больше 1000 штук. Понятное дело, что ручками это все делать было бы утомительно и… Стыдно. Не для того программированием занимаюсь, чтобы такую грязную работу делать не автоматизированно. Поэтому было решено написать скрипт.

В качестве языка был выбран Python. Его удобно использовать для консоли, он довольно быстрый, есть модуль urllib, позволяющий «одним движением» скачивать картинки по ссылке. Но главная причина — это то, что я начал изучать его недавно. Решил дополнительно попрактиковаться.

Сам скрипт получился небольшой, но было бы интересно описать процесс создания. Буду стараться писать побольше комментариев в коде, чтобы те, кто не знает python, тоже смогли понять процесс. А от знатоков очень приветствуются советы и указания. Итак, приступим.

«Вконтакте» не предоставляет API конкретно для скачивания материалов из беседы, поэтому самое долгое время заняло изучение того, как устроена система подгрузки картинок из диалога в vk.com. Все картинки лежат у них, понятное дело, на сервере, и доступ к ним имеет любой, у кого есть ссылка на эту картинку. Таким образом, чтобы скачать все фотографии из диалога, нам надо получить все ссылки на картинки. Тыкаясь туда-сюда, было выяснено, что при нажатии на «Действия -> показать материалы из беседы» отправляется POST запрос на vk.com/wkview.php. Запрос содержит параметры:

  • act:show
  • al:1
  • loc:im
  • w:history<dialog_id>_photo

Здесь я заменил ссылки на <некая ссылка>, так как уже говорил, что картинки vk лежат в открытом доступе и получить их может любой, кто знает ссылку.

Из всего этого нам интересны только ссылки, которые находятся внутри <img src=»https://habr.com/ru/post/244647/»>, а так же json на конце. Я был не до конца честен, говоря, что POST запрос принимает 4 параметра. Точнее, он принимает, но если его выполнить нам выдадутся только первые несколько фотографий. Так как vk.com имеет подгрузку контента по мере прокручивания страницы, то существует параметр offset, который отвечает за то, какую часть из всего множества фотографий нам подгрузить. В итоге параметры запроса выглядят вот так:

  • act:show
  • al:1
  • loc:im
  • w:history<dialog_id>_photo
  • offset: offset
  • part: 1

Кстати, а что насчет выполнения запросов? Как нам получить доступ к своей странице? Было выяснено, что доступ к странице может получить тот, у кого есть cookie под названием remixsid. Таким образом нам надо подставить эту куку в функцию, которая выполняет запрос и все получится. Безопасно? Не совсем, швыряться куками — это не есть хорошо, но я не нашел другого варианта. Если кто-то знает, напишите пожалуйста.

Общий алгоритм вроде понятен: сделать запрос, вытащить ссылки, записать их в файл, проверить-
новый offset>count?-, если нет, то присвоить offset новое значение и выполнить запрос с ним, если да, то выйти из цикла. Затем пройтись по всем ссылкам в файле и скачать картинки лежащие по их адресу. Начинаем писать код.

Аргументы у нас будут передаваться через терминал (remixsid, dialog_id и название папки):

Создадим отдельную папку для фотографий:

Отлично, начинаем выполнение запросов:

Теперь начинаем парсинг ответа. Извлекаем все через регулярные выражения. Сначала извлекаем json и устанавливаем следующий offset:

Теперь надо извлечь все ссылки из тегов src. Действуем тем же способом, но используем метод findall, который возвращает массив всех строк, которые совпали с регуляркой:

Теперь запишем все в файл:

С этим все. Осталось только пройтись по файлу и скачать все по ссылкам. Это делается с помощью модуля urllib, вот так:

А для нашего случая:

Готово! Но, так как использовать это мы будем из командной строки, давайте еще напишем небольшую документацию (—help), а так же вывод об ошибке, если аргументов командной строки меньше, чем нужно. Добавим в начало:

hikiko4ern/vk_dump

Разработка этого скрипта прекращена. Ещё какое-то время он будет кое-как работать при всех своих багах, пока используемую версию API не прикроют (однако сохранение лайкнутых фото/видео/т.п. скоро перестанет работать)

На данный момент иногда пользователи определяются как . Решения проблемы пока нет (#24).

  • склонировать/скачать репозиторий
  • установить зависимости

Для загрузки видео из некоторых сторонних источников (например, RuTube) youtube-dl использует ffmpeg , который необходимо установить отдельно.

Если Вы используете Windows ниже 10 версии, дополнительно установите пакет colorama :

Все доступные аргументы можно посмотреть при запуске с —help .

Для сохранения нескольких типов данных за один вызов необходимо указывать каждый тип отдельным аргументом dump . Например, для сохранения фото и документов надо запускать dump.py —dump photo —dump docs .

Возможны два способа аутентификации — с помощью пары логин-пароль или токена. Авторизация по логину идёт с данными от Kate Mobile.

Для входа по токену необходимо передать аргумент token при запуске:

Количество процессов, создаваемых для загрузки, по умолчанию равняется 4*потоки .

При загрузке видео — числу, заданному в настройках, но не больше количества потоков. Такое ограничение введено ввиду отсутствия смысла в спаме лишними процессами при загрузке больших по размеру видео (однако лимит всё же убирается через настройки).

Поддерживаемые для сохранения данные

  • Фото
  • Видео
  • Аудио
  • Документы
  • Диалоги (txt) и вложения (фото, видео, документы, голосовые)
  • Вложения понравившихся постов (фото, видео, документы)
  • Понравившиеся фотографии
  • Понравившиеся видео
  • прочее, прочее, прочее 😉

Любые предложения и репорты о багах приветствуются :з

Настройка сохраняемых диалогов

Для сохранения или исключения определённых диалогов необходимо вручную подредактировать конфиг settings.ini .

ID диалогов перечисляются через запятую. Получить его можно, например, открыв диалог в разделе сообщений, тогда в URL вроде https://vk.com/im?sel=100 идентификатором будет являться кусок, идущий после sel= .

Пример исключения диалога с ID 100 и беседы c60 :

Сохранение только диалога с ID 100 и исключения всех остальных:

Дозапись новых сообщений вместо перезаписывания

Если включена, при кэшировании будут получены не все сообщения, а только с ID больше последнего записанного (последняя строка в файле).

Q: Можно ли не вводить каждый раз логин и пароль (и код 2FA) при авторизации?
A: Просто передавайте логин аргументом ( —login ) или вводите пустой пароль на экране авторизации. В таком случае данные будут подтянуты из конфига vk_api .

Q: Ошибка vk_api.exceptions.AccessDenied: You don’t have permissions to browse user’s audio
A: К сожалению, vk_api не поддерживает сохранение аудио при входе по токену. Ну или же попробуйте удалить файл vk_config.v2.json и переавторизироваться, если это не Ваш случай ¯\_(ツ)_/¯

Q: Ошибка RegexNotFoundError(‘Unable to extract %s’ % _name)
A: Обновите youtube_dl : pip3 install —upgrade youtube_dl .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *