diff options
Diffstat (limited to 'README.md')
-rw-r--r-- | README.md | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/README.md b/README.md new file mode 100644 index 0000000..d65d533 --- /dev/null +++ b/README.md @@ -0,0 +1,132 @@ +# vk-messages-post-archive + +> **Дисклеймер:** информация актуальна на осень 2020 года. Может, во ВКонтакте уже всё поменялось и скрипт более +> не нужен, а может, поменялся формат отдаваемого архива и скрипт не сработает. Смотрите сами. + +Во ВКонтакте существует [функция](https://vk.com/data_protection?section=rules&scroll_to_archive=1) выгрузки информации +в ZIP-архиве, в т.ч. всех сообщений. Сделана она как попало: история сообщений, полученная таким образом, содержит +только текст самих сообщений (там даже нет пересланных! сложно было положить, что ли?), ссылки на фото и нерабочие (!) +ссылки на документы. Но лучше так, чем никак. + +Этот репозиторий содержит простенькие инструменты и инструкции, с помощью которых можно дополнительно выкачать все +фотографии из истории, а также получить и сохранить объекты сообщений с вложениями из API (рекомендуется как минимум +для получения рабочих ссылок на документы). + +Это проще, чем выкачивать всё через API с нуля. Пусть ВКонтактик соберёт нам свой архив, там уже есть более-менее +нормальная навигация и оформление, а мы потом просто скачаем все, чего не хватает. Все-таки простых текстовых сообщений +без вложений должно быть на порядок больше. + +# Системные требования + +- bash +- PHP >= 7.1 + - composer + - php-iconv + - php-curl + - наверное, неплохой идеей будет включить opcache для cli в `php.ini` (путь которого можно узнать через `php --ini`): + ``` + opcache.enable=1 + opcache.enable_cli=1 + opcache.file_cache=/tmp/php-opcache + ``` +- iconv +- wget +- sqlite3 +- стандартные утилиты типа cat, find, grep, xargs и т.д. + +# "Поехали", как говорил Юра + +## Скачиваем фоточки + +Склонили репозиторий, устанавливаем зависимости: +``` +git clone https://github.com/gch1p/vk-messages-post-archive +cd vk-messages-post-archive +composer install +``` + +Перейти в папку с распакованным архивом от ВК: +``` +cd path/to/Archive +``` + +Запускаем нехитрый парсер: +``` +for f in $(find messages -type f -name "*.html"); do + cat "$f" | iconv -f windows-1251 | php path/to/get-attaches.php >> to-download.txt +done +``` +В файле `to-download.txt` будут ID сообщений с аттачами вперемешку со ссылками на фотки. + +Выкачиваем фотки. `-P8` означает, что будет параллельно запущено 8 процессов wget. Можете написать другое число. +``` +cat to-download.txt | grep https | xargs -P8 wget -x -i +``` + +Заменяем ссылки (`<a>`) на изображения (`<img>`). Тут в `-P` разумно передать количество ядер. +``` +find messages -type f -name "*.html" | xargs -I{} -P4 php path/to/replace-photos.php "{}" +``` + +## Достаём остальную информацию из API + +Теперь давайте залезем в API. ВК недавно отключил сторонним приложениям доступ к сообщениям, но кого это остановит? +Скачайте [десктопный мессенджер](https://vk.com/messenger), авторизуйтесь в нём, потом закройте и зайдите в папку, где +он хранит конфиг (`~/.config/VK` на Linux, `~/Library/Application Support/VK` на маке, на винде по логике должно быть +`%APPDATA%\Roaming\VK`), там будет sqlite3 база `vk.db`. Зайдём в неё: +``` +sqlite3 vk.db +``` + +Осмотримся. +``` +sqlite> .tables +auth debug_api_fails recents users +communities friends settings +``` + +Хм, табличка `auth` выглядит многообещающе. Посмотрим структуру: +``` +sqlite> .schema auth +CREATE TABLE auth ( + id INTEGER PRIMARY KEY, + user_id INTEGER, + ts INTEGER, + access_token TEXT +, is_encrypted INTEGER); +``` + +О! То, что нужно. Нам нужен `access_token`. +``` +sqlite> SELECT access_token FROM auth; +``` + +Скопируйте токен и можно выходить (`Ctrl+D`) отсюда. + +Теперь откройте скрипт `common.php` и пропишите этот токен в константу `ACCESS_TOKEN`, а так же путь к папке +`Archive` в константу `ARCHIVE_DIR`. + +После этого можно запустить скрипт `fetch-messages.php` для слива объектов сообщений. Они будут сохраняться в папку `api` +с именами `{dir}/{id}.txt`, где `{id}` – это ID сообщения, а `{dir}` – это остаток от деления ID сообщения на 100. + +Метод [messages.getById](https://vk.com/dev.php?method=messages.getById) вконтактовского API может вернуть до 100 +сообщений за 1 запрос, плюс нужно учитывать стандартное ограничение на 3 запроса в секунду, иначе нам прилетит капча. +`xargs` поможет запустить не более 3-х инстансов скрипта за раз и передать не более 100 идентификаторов в каждый, а +`sleep(1)` сделает сам скрипт в конце. + +``` +cat to-download.txt | grep -v https | xargs -n100 -P3 php path/to/fetch-messages.php +``` + +Теперь добавим возможность просмотра этих объектов на страничках истории. +``` +find messages -type f -name "*.html" | xargs -I{} -P4 php path/to/insert-api-objects.php "{}" +``` + +## Скачиваем документы + +``` +php fetch-documents.php +``` + +Ну вот, вроде, и всё.
\ No newline at end of file |