Skip to content

Утилита для скачивания всех вложений, которые можно получить из архива аккаунта VKontakte

License

Notifications You must be signed in to change notification settings

DvaMishkiLapa/VKArchiveDownloader

Repository files navigation

VKArchiveDownloader VKArchiveDownloader icon

Утилита для скачивания данных по ссылкам, которые можно получить из архива аккаунта VKontakte.

1. Описание работы

С помощью данной утилиты возможно скачать данные по ссылкам, которые, так или иначе разбросаны по архиву VKontakte.

Информация о поддерживаемых данных, которые можно скачать:

Тип данных Поддержка Сохранение по дате Примечание Папка хранения
Сообщения Полная поддержка [*], кроме видео ./output/messages
Стена Все фото со стены скачиваются из photos (Фото) ./output/photos
👍->Фото Полная поддержка [*] ./output/likes/photos
Фото Полная поддержка ./output/photos
Файлы Полная поддержка [*] ./output/profile
Музыка В архиве есть только названия песен, но не ссылки -

[*] - Если включен доступ к Сookie файлам.

2. Результат работы

Результат работы утилиты будет находится в директории output.

2.1 JSON файл с ссылками

В папке output, после работы утилиты, будет находится файл links_info.json. Его содержание зависит от того, какие данные были запрошены в архиве.

Пример links_info.json, где были запрошены все поддерживаемые типы данных:

{
    "messages": {
        "id диалога/беседы": {
            "name": "Имя диалога/беседы",
            "dialog_link": "Ссылка на диалог/беседу",
            "Тип данных": ["Ссылки, связные с типом данных"]
        }
    },
    "photos": {
        "Имя альбома": {
          "Тип данных": ["Ссылки, связные с типом данных"]
        }
    },
    "likes/photo": {
        "not_parse": ["Ссылки, связные с типом данных"]
    }

}

Для каждой папки из архива, в которой происходит поиск, все ссылки отсортированы по типу контента или их поведения.

Возможные типы разделения ссылок:

  • Разделение на основе информации о том, на что ссылается ссылка. Информация содержится в заголовке ответного запроса content-type, о котором подробнее можно прочитать тут. Чаще всего, встречаются следующие типы:
    • image/jpeg: изображения в формате jpeg;
    • image/png: изображения в формате png;
    • image/gif: анимационные изображения в формате gif;
    • video/mp4: видеофайлы в формате mp4;
    • audio/ogg: аудиофайлы в формате ogg. Обычно, голосовые сообщения;
    • application/octet-stream: базовый тип бинарных данных. Может быть чем угодно;
    • application/pdf: файлы PDF;
    • application/msword: файлы Microsoft Word, а именно, файлы doc;
    • application/vnd.openxmlformats: файлы Microsoft Word, а именно, файлы docx;
    • application/zip: ZIP архивы;
    • application/x-rar-compressed: RAR архивы;
    • text/plain: текстовые файлы txt;
  • Ссылки, связанные с VKontakte:
    • vk_contact: ссылки на профили людей или сообществ;
    • vk_video: ссылка на видео;
    • vk_story: ссылка на истории;
    • vk_club: ссылки на группы;
  • Ссылки, при работе с которыми были получены ошибки:
    • error: ссылки VKontakte, переход по котором приводит к ошибке. Например, ошибке отсутствия файла на серверах;
    • not_parse: ссылки, парсинг которых был неудачен или пропущен;
  • telegram_contact: ссылки на профили мессенджера Telegram;
  • github_link: ссылки, связанные с GitHub;
  • aliexpress_link: ссылки, связанные с AliExpress;
  • pastebin_link: ссылки, связанные с Pastebin;
  • gdrive_link: ссылки, связанные с Google Drive;
  • google_link: ссылки, связанные с Google.com;
  • wikipedia_link: ссылки, связанные с Wikipedia;
  • 🍓: ссылки, связанные с PornHub;
  • dns_shop_link: ссылки, связанные с магазином DNS;
  • habr_link: ссылки на Habr;
  • onedrive_link: ссылки, связанные с OneDrive;
  • youtube_link: ссылки, связанные с YouTube.

2.2 Папки с данными

В папке output, после работы утилиты, будут находится папки с данными, которые удалось получить.

Возможные папки при условии, если присутствуют исходные данные в архиве, можно просмотреть в таблице поддерживаемых типов данных.

2.3 Логи работы утилиты

В процессе работы утилиты, весь процесс работы логируется и хранится в папке logs.

3. Использование утилиты

Перед использованием утилиты необходимо запросить данные архива на официальной странице VKontakte.

VKontakte дает возможность архивировать разные данные, в зависимости от пожеланий и терпения. Чем больше данных выбрано, тем больше времени будет формироваться архив. Утилита сможет забрать любые поддерживаемые данные, которые найдет, вне зависимости от выбора.

Диалог выбора данных для архивирования

3.1 Использование Сookie файлов браузера

Утилита поддерживает использование Сookie файлов некоторых браузеров. Это может понадобится для скачивания контента, для которого необходима авторизация на сайте VKontakte.

Пример таких данных (сложно перечислить их всех, проще сказать, что все, кроме сжатых фото и голосовых сообщений):

  • Бинарные данные (.doc, .docx, .pdf, etc);
  • ZIP архивы;
  • Текстовые файлы (.txt, .ini, .py, etc);
  • Фото, которые были отправлены документом, чтобы избежать сжатия;
  • etc.

Поддерживается множество популярных браузеров и ОС. Их список можно найти на странице используемого для этого модуля browser_cookie3.

Для того, что утилита могла использовать такие Сookie файлы, достаточно авторизоваться в учетной записи VKontakte, для которой был сформирован архив используя браузер, который поддерживается со стороны browser_cookie3.

⚠️ Сookie файлы аккаунта будут использованы исключительно для доступа к ресурсам VKontakte и не будут переданы на сторонние ресурсы.

3.2 Настройка через файл конфигурации config.ini

Работа утилиты может быть настроена в конфигурационном файле config.ini.

Доступные параметры:

  • main_parameters - главные параметры утилиты:

    • use_coockie=True - использование Coockie файлов VKontakte для скачивания документов.

      True - использовать Coockie файлы, False - не использовать;

    • semaphore_small=10 - количество одновременных скачиваний файлов малого размера, таких, как фото.

      Если скорость сети оставляет желать лучшего, стоить уменьшить данное значение. 10 одновременных скачиваний отлично работает на 150-200 мбит/c;

    • semaphore_big=2 - количество одновременных скачиваний файлов большого размера. Например, документы.

      Если скорость сети оставляет желать лучшего, стоить уменьшить данное значение 2 одновременных скачиваний отлично работает на 150-200 мбит/c;

    • core_count=0 - количество потоков для поиска ссылок в архиве.

      Если значение равно 0 - автоматическое определение количества используемых потоков;

    • log_level=INFO - уровень ведения лог-файла.

      INFO - только сообщения ошибок, предупреждений и информация. DEBUG - сообщения ошибок, предупреждений, информации, а также сообщения отладки (для разработчика);

    • delete_output_folder=False - нужно ли отчищать содержимое папки результата перед выполнением скрипта.

      Удобнее не удалять результаты работы скрипта, если скачивание идет частями. True - отчищать, False - оставить нетронутым.

    • save_by_date=False - нужно ли разделять сохраняемые файлы по подпапкам, на основе даты d-m-yyyy.

      Для файлов и альбомов - дата загрузки, для сообщений - дата сообщения. True - разделять, False - оставить обычную логику сохранения.

    • disable_ssl=False - отключать ли проверку SSL сертификата. Подробнее об этом описано в Q&A.

      Шифрования трафика не будет использоваться, используйте только под вашу ответственность. Стоит использовать только в безопасной сети и в случаях, когда возникают ошибки вида: Cannot connect to host [...] certificate verify failed: self signed certificate in certificate chain

  • folder_parameters - параметры папок архива.

    Если любой из параметров в этой секции будет закомментирован в конфигурационном файле - парсинг папки будет пропущен.

    По умолчанию, используются имена папок, которые встречаются в архиве ВК (проверено в 2024 году):

    • vk_archive_folder=Archive - имя папки архива VK;

    • messages_folder=messages - имя папки сообщений из архива.

    • profile_folder=profile - имя папки профиля (документов аккаунта) из архива.

    • photos_folder=photos - имя папки фото из архива.

    • likes_folder=likes/photo - имя папки лайков и папки лайкнутых фото из архива.

3.3 Запуск утилиты, используя исходный код (рекомендуется)

Для запуска утилиты из исходного кода в системе должен быть установлен Python 3.10.5 или выше.

⚠️ Для установки зависимостей в ОС Windows, скорее всего, понадобится Microsoft Visual C++ версии 14.0 или выше.

Необходимо скачать или клонировать репозиторий в удобное для работы место. Предварительно стоит убедиться, установлен ли в системе Git, если будет происходить клонирование репозитория, а не скачивание исходного кода с сайта.

Клонирование репозитория:

git clone https://github.com/DvaMishkiLapa/VKArchiveDownloader.git

В клонированную или скачанную директорию необходимо поместить директорию архива VKontakte Archive. Сделайте это любым удобным для вас способом.

После клонирования или скачивания репозитория, а также перемещения папки Archive, необходимо в директории репозитория развернуть виртуальное окружение venv.

Для ОС Windows необходимо открыть CMD, PowerShell или Windows Terminal в папке репозитория и ввести следующие команды:

py -m venv .venv
.\.venv\Scripts\activate

⚠️ В Windows 10 и выше возможна ошибка, связанная с запретом выполнения скриптов в системе. Тут хорошая статься с описанием и решением этой проблемы.

Для ОС Linux необходимо в папке репозитория ввести следующие команды:

python3 -m venv .venv
source ./.venv/bin/activate

После разворачивания виртуального окружения необходимо установить зависимости:

pip install -r requirements.txt

После всех шагов необходимо запустить утилиту и ждать ее завершения:

python main.py

3.4 Запуск утилиты, используя собранный exe файл для Windows x64

⚠️ Для данного способа не требуется установка Python. Замечено, что в таком режиме утилита работает, примерно, на 15% медленнее.

Необходимо скачать последний собранный релиз VKArchiveDownloader_win64.zip и распаковать архив с ним в любую удобную папку.

После этого необходимо поместить директорию архива VKontakte Archive в директорию распакованной утилиты. Сделайте это любым удобным для вас способом.

После всех шагов подготовки запустите VKArchiveDownloader.exe любым удобным способом.

4. Вопросы и ответы

4.1 Почему нет поддержки скачивания видео?

Есть несколько причин, по которым это не реализовано:

  1. Странное поведения доступа к ссылке на само видео. Не ясно почему, но я не всегда могу получить ссылку на исходник видео в максимальном качестве.
  2. Скачивание займет много времени и займет большое пространство на постоянном носителе. Время - не самый критичный параметр. Но размер самого видео - уже более весомый аргумент, учитывая, что не все видео, в итоге, будут нужны после скачивания.

Как альтернативу данному вопросу, после работы утилиты, в JSON файле с ссылками будет отдельная категория vk_video со всеми ссылками на видео VKontakte.

4.2 Почему в папке сообщений или в папке документов начали появляется скачивания по пути */text/html без разрешения файла?

Это не решенная проблема. В папках лежат html страницы, которые VKontakte отдает на попытку скачать какой-либо документ. В этот момент утилита сталкивается с ошибкой 429 Too Many Requests, которая появляется, если в день было слишком много попыток скачать документы. Пока что, решением данной проблемы является время - нужно подождать 1-2 дня. Проблема появится, если запускать утилиту за один день множество раз, например, с разными настройками. Стоит помнить о таком поведении VKontakte.

Также данная проблема может встретится, если а архиве содержится безумно много ссылок на документы в случае, если, например, аккаунт был довольно активным в использовании. Выходом из такой ситуации может стать разделение скачиваемого контента по дням. Например, в 1 день в config.ini оставить только настройку с сообщениями и запустить утилиту, а в следующий день выбрать другую категорию.

4.3 Почему в логах начали часто появляется ошибки, связанные с asyncio.TimeoutError?

Для скачивания файлов в утилите заложен таймаут в 15 минут. Если за это время файл не будет скачан, скачивание оборвется с ошибкой asyncio.TimeoutError в лог-файле.

Что бы решить данную проблему, стоит уменьшить количество одновременных скачиваний в настройке semaphore_small и semaphore_big конфигурационного файла config.ini.

Для удобства, все ссылки, которые быль обработаны и для них была получена ошибка тайм-аута, будут собраны в отдельную группу данных timeout_error в файле links_info.json.

4.4 Почему выдается ошибка, подобная PermissionError: [Errno 13] Permission denied: '.../Cookies'?

Она возникает, если Google Chrome или браузер, основанный на его движке, открыт во время работы скрипта. Как вариант решения проблемы, можно закрыть браузер перед началом работы скрипта. После появления строчки в логах В работе утилиты будут использованы файлы 🍪 браузер можно будет снова открыть.

Ошибка не возникает, если не используются cookie.

Подробнее об этой проблеме и путях ее решения можно прочитать в соответствующем Issue.

4.5 Фактически, доступ к сжатым фото и голосовым сообщениям может получить любой человек, у которого на них есть ссылка?

Да. Для доступа к такому контенту не нужны никакие механизмы авторизации. Если ссылка (или группа ссылок) попадет к другому человеку, он без каких либо сложностей сможет получить файл, на который эта ссылка ссылается. Так что осторожнее с этим интересным решением ребят из VKontakte. Все, что попадает в интернет, остается там на всегда.

Пример такой ссылки, которая была взята из моего случайного диалога.

4.6 Как работает скачивание по ссылкам (для любопытных)?

После нахождения всех ссылок в архиве VKontakte, их можно разделить на три основных категории:

  1. Ссылки, связанные с VKontakte;
  2. Ссылки, связанные с серверами VKontakte;
  3. Ссылки, связанные с другими ресурсами.

Скачивание файлов выполняется только для 1 и 2 категории.

  • Ссылки 2 категории - чаще всего, это ссылки, которые сразу можно найти в сообщениях, в архиве. Это прямые ссылки на файл, которые хранятся в каком-то из серверов VKontakte. Выглядят они, примерно, так:

    • https://sun9-**.userapi.com/<ссылка_на_файл>, где ** - некоторое число от 1 до 99;
    • https://psv4.userapi.com/<ссылка_на_файл>.
  • Ссылки 1 категории - либо ссылки на какой-либо документ, либо ссылка на фото с предпросмотром в интерфейсе VKontakte (с лайками, комментариями и так далее). В этом случае, что бы получить файл, необходимо быть авторизованным на сайте, утилита это делает через файлы Сookie от используемого браузера. Если такая авторизация присутствует, в html коде страницы, на которую вела ссылка, можно найти ссылку с редиректом на ссылку 2 категории.

4.7 Чем опасно отключение проверки SSL сертификата? (флаг disable_ssl)

⚠️ Хотя данная опция может помочь в случаях, когда существуют проблемы с сертификатом VKontakte, лучше найти причину, по которой скрипт не может с ним работать.

Отключение проверки SSL сертификата представляет собой значительный риск безопасности и может привести к серьёзным последствиям. Вот несколько ключевых аспектов, которые стоит учесть:

  1. Подверженность атакам "man-in-the-middle" (MitM): При отключении проверки SSL сертификата, ваше приложение не может убедиться в идентичности сервера, к которому оно подключается. Это дает злоумышленникам возможность перехватывать и модифицировать передаваемые данные, такие как личная информация, учетные данные и финансовая информация;
  2. Утечка конфиденциальной информации: Без верификации сертификатов нет гарантий, что соединение защищено от несанкционированного доступа третьих лиц. Это может привести к утечке важной конфиденциальной информации.
  3. Риск повреждения данных и атак: В отсутствие защиты SSL/TLS злоумышленники могут не только просматривать, но и изменять данные во время их передачи. Это может привести как к искажению информации, так и к внедрению вредоносного кода в вашу систему.

5. Тесты производительности

Здесь приведены тесты производительности выполнения утилиты на разных платформах и с разными конфигурациями. Все запуски выполнены на максимально возможном количестве потоков, если не указано иное.

ЦП или SoC Использование 🍪 ОС Общее кол-во 🔗 ⌛ поиска 🔗 ⌛ скачивания Общее ⌛
Core i7-8565U Google Chrome Windows 11 15141 2 мин. 1 сек. 8 мин. 10 сек. 10 мин. 11 сек.
Core i7-8565U Vivaldi Windows 11 + WSL Ubuntu 22.04 15141 35 сек. 10 мин. 48 сек. 11 мин. 24 сек.
Core i7-8565U Manjaro Linux 13753 25 сек. 4 мин. 29 сек. 4 мин. 54 сек.
Snapdragon 855 Android 12 + Termux 13753 45 сек. 6 мин. 38 сек. 7 мин. 23 сек.
Exynos 4412 Android 9 + Linux Deploy Ubuntu 15.10 13753 5 мин. 19 сек. 23 мин. 1 сек. 28 мин. 20 сек.
OMAP 3430 890MHz postmarketOS 3519 12 мин. 8 сек. 29 мин. 5 сек. 41 мин. 13 сек.