aboutsummaryrefslogtreecommitdiff
path: root/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'README.md')
-rw-r--r--README.md132
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