Evgeny Zinoviev 1f919eaef0 initial
2021-02-05 00:13:21 +03:00

132 lines
6.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
```
Ну вот, вроде, и всё.