Как найти что-то из своего во ВКонтакте и немного grep-магии
Когда я собирал свои смешнявки для галереи, взбрело мне в голову посмотреть, что там есть в ВК — вдруг что-то смешное я сделал и отослал через него? Если смотреть все вручную, то так можно и кукухой поехать, поэтому я решил поехать кукухой автоматизированно.
Disclaimer: Длительное чтение историй своих переписок 10-летней давности может привести к необратимым повреждениям психики и к потере кучи времени. Повторять описанное стоит с максимальными мерами предосторожности.
Кому не интересно нудное описание, что есть и чего нет в архиве — листайте до заголовка Ищем информацию
Скачиваем архив с данными #
С этим все почти просто. Заходим по ссылке, запрашиваем архив. Есть нюанс: для скачивания понадобится привязка к мобильному устройству и/или к мобильному телефону, так что если вы до сих пор злостный анон, ВК захочет вас послать. Не забудьте в настройках поставить все галочки — по умолчанию они не все установлены.
Мой архив был готов через пару часов после запроса.
Смотрим, что внутри #
Первое, что бросается в глаза — очень маленький размер архива, всего 13 мегабайт. Я в ВК 14 лет и в моей жизни был период, когда “вся жизнь там”. Очень сомнительно звучит, что “это самый полный архив”.
Внутри лежит поганый HTML. С одной стороны — удобно для обывателя, но с другой — я ожидал выгрузку в машиночитаемом формате. Те же операторы связи закинут список ваших звонков в CSV. Или телега, которая дает выбор — либо красивую HTML-ку, либо JSON (правда, для индивидуальных чатов — только HTML). Ну ладно, это не самое страшное.
Вишенкой к формату идет кодировка — конечно же, это всеми любимая CP1251. Ну, хоть не KOI8-R, и на том спасибо.
Малый размер объясняется тем, что внутри только текстовая информация. Картинок нет, только ссылки на них. При этом телега честно скачает, если ее попрость, а тут такой опции нет. Получается, что как бэкап этот архив использовать не получится. Истории тоже особо нет, только та информация, которую и без этого архива можно посмотреть на сайте. С некоторыми оговорками — см. далее.
Что в итоге есть?
Информация о профиле #
Которую и так видно на главной странице. Всякие вузы, интересы, даты рождения, отношения к алкоголю и т.п.
Список друзей #
Для каждого друга покажут: текущее имя или DELETED, ссылку на страницу и дату добавления в друзья (текстом). При этом примерно до июня 2009 года текст даты будет “очень давно”.
Подарки #
Картинка, ссылка на профиль подарившего, дата.
Подписки #
Тупо список пабликов с ссылкой на них. Иногда с пометкой “Администратор” или “Владелец”.
Черный список #
В формате списка друзей, только вместо “очень давно” — “Дата добавления неизвестна”. И DELETED может быть не только ссылкой, но и просто текстом. Спасибо, ВК, теперь я знаю, что у меня в черном списке есть
DELETED
Дата добавления неизвестна
Сообщения #
Разбиты по диалогам. Только текстовая информация. Даже картинки указаны голой ссылой, а не в <img>
теге. Даты, разумеется, только текстом. Часть контента просто заменяется текстом, например, сообщение может содержать только “пересланное сообщение” без ссылки — и решай ребус, что же ты там такого переслал. Особенно если это чат с DELETED. Похожая ситуация с “1 прикреплённое сообщение” и “Запись на стене”.
Вы, 17 мая 2018 в 16:39:27
2 прикреплённых сообщения
Возникают также сомнения, что история сообщений действительно вся: скорее всего только то, что и так через интерфейс можно посмотреть. Но проверять уже желания нет. “Этот вопрос оставлен как упражение читателю”, как говорится.
Стена #
Примерно в том же формате, что и сообщения, но еще есть ссылка на оригинал. Репосты раскрываются, а не показываются дурацкосй строкой вроде “Запись на стене”. Однако “Аудиозапись” и “Граффити” — без ссылки. Посты от других людей на стене тоже есть. И даже есть ссылка на комментарии к записи, которые в этом же архиве.
Лайки #
5 категорий: Фото, Видео, Стена, Заметки, Товары. В каждой — список ссылок. Тут хотя бы логично, хотя насколько я знаю, даты лайков ВК тоже знает.
Фотографии #
Альбомы из профиля и вдобавок фотографии со страницы, со стены, сохраненные и из “фото со мной”. Для альбомов есть даты сохранения и обновления. Фотки в таком же формате, как и стена, со ссылкой на комменты. Но зато сама фотка вставлена <img>
тегом.
Видео #
Загруженные и добавленные. Как фотки (есть превьюшка), есть еще длительность и количество просмотров. Но прямой ссылки на скачивание нет.
Музыка #
Список композиций с именем и длительность, без ссылок.
Документы #
Список с датой загрузки, названием файла и ссылкой на него в документах. Никаких превью и прямых ссылок на скачивание.
Товары #
К сожалению, я не настолько успешен, чтобы иметь свой бизнес в ВК, поэтому у меня тут пусто.
Истории #
Aka “сториз”. Не умею таких делать, и тут у меня тоже пусто.
Приложения #
Список текущих приложений с названием, ссылкой, правами доступа в формате “кучей через запятую” и датой в формате “Дата последнего запуска неизвестна”.
Закладки #
Нет, не те. Страницы, записи, видео, товары, статьи, ссылки, подкасты. Везде “Данных нет”.
История изменений #
Для имени, почты и телефонов. У меня там пусто, но вот немного печалит, что мне суют всяких DELETED, когда ВК все это про них знает. Привязки к телефонам по классике: “Привязан номер телефона 1234547”. Ишь чего, машиночитаемый формат захотел!
Платежи #
Все, чего у меня нет: карты, история платежей, голоса, голоса внутри приложений, подписки, история переводов.
Реклама #
Это уже поинтереснее: всего этого не посмотришь на сайте. Ретаргетинг:
Вы попали в 3271 группу ретаргетинга
Кабинет пользователя
Что бы это ни значило.
Интересы
Бизнес
Пользовательский интерес
ИТ (компьютеры и софт)
Пользовательский интерес
Образование
Пользовательский интерес
iPad
Системный сегмент
Firefox
Системный сегмент
Windows 10
Системный сегмент
Android (бюджетные)
Системный сегмент
Друзья именинников — всех, 3 дня
Системный сегмент
Друзья именинников — всех, 7 днeй
Системный сегмент
Друзья именинников — женщин, 3 дня
Сторонний сегмент
Друзья именинников — женщин, 7 дней
Сторонний сегмент
Образование
Пользовательский интерес
Наука и техника
Пользовательский интерес
Общество
Пользовательский интерес
Интересы к “Windows 10” и “Android (бюджетные)” даже натолкнули на мысль, что меня ломанули. Но в целом нормальный список, понимаешь, почему тебе суют рекламу IT-конференций.
В “Кабинетах” и “Часто посещаемых местах” закономерно пусто, но про последние не очень ясно, что они делают в рекламе.
Прочее #
“Обращения в Поддержку”: только в новую, в старую — нет. Блокировки: когда блокировали вход в страницу и почему. “Сеансы авторизации”: только недавние, с именем, User-Agent и IP. “Импортированные контакты”: из почты, телефона, Twitter, FB, G+ и ОК — там у меня пусто. “Верификация”: для тех, у кого галочка рядом с именем.
Комментарии #
Одной большой кучей. Текст, ссылка на оригинал и дата. Комментарии могут быть:
- к публикациям на вашей стене.
- к публикациям на чужих стенах, в т.ч. в пабликах. Причем даже если владелец стены их скрыл.
- комментариями от имени сообщества, если писал от его имени.
- ВНЕЗАПНО публикациями в пабликах — когда пишешь на стену паблика от своего имени. Почему ВК считает это комментарием — непонятно.
Приятный бонус заключается в том, что можно прочитать комментарии к постам, доступа к которым уже нет.
Немного удручает, что нет никакой информации о том, что комментируешь, только ссылка. Особенно прикольно, когда есть id стены, профиль удален, из текста непонятно, кому ты это писал — и решай ребус, что это за чел. Иногда помогает гугление (причем гугл может не помнить, а яндекс выдаст результат, но, опять же, не для всех).
Чего в архиве точно нет #
Если вы надеялись, что в архиве будет суперполное досье на вас, то у меня для вас печальные новости: ВК явно хранит данных о вас гораздо больше, чем присылает в архиве. Я приведу список того, чего точно нет, но я наверняка о чем-то забыл. А чего-то вообще не знаю.
Обсуждений в группах #
Имеются в виду те, которые отдельно от стены.
Постов от имени сообщества #
Если вы админ сообщества и на стену публиковали записи от имени сообщества, то их не будет. Не важно, подписывались ли вы своим именем или нет. Забавно с учетом того, что комментарии от имени сообщества в архиве есть.
Постов на чужих стенах #
С учетом того, что записи на стенах пабликов есть — очень странно.
Некоторых комментариев #
Например, к фотографиям в чужих альбомах. Комментариев, отправленных через виджет ВК на сторонних сайтах. Возможно, еще каких-то.
Обращений в старую поддержку и баг-репортов #
Отчетливо помню, как парочку багов заводил. Баг-репорты, видимо, сгинули вместе со старым баг-трекером, как и обращения в ТП. Второе может быть объяснено тем, что обращение осуществлялось через обсуждения в специальном паблике.
Мнений #
Олды помнят, как говорится. Когда-то давно были “мнения”, где человеку можно было анонимно написать что-нибудь. Прикольно, правда? Ну это хотя бы можно понять: сейчас такого уже нет, сервак отключили, данные удалили и все это забыли.
Закладок людей #
Да, в ВК можно добавлять людей в закладки. У меня там 25 человек, которые не в друзьях. И этого в архиве нет, хотя другие закладки есть.
Немного про безопасность #
Все ссылки на фото (даже которые в личке грузили!) являются публично доступными. СЕСУРИТИ. Документы хоть закрыты — но за это ВК уже нагибали. Так что если вы слали нюдсы в личных сообщениях, то не такие уж они и приватные. Хотя вряд ли это вас смутит, если вы шлете дикпики через интернет.
Ищем информацию #
Текст #
Наконец-то можно приступить к поиску иголки в стоге сена. Начнем с поиска текста. Самый очевидный вариант — это grep
, но если вы попробуете что-то поискать, то вас будет ждать облом. Потому что кодировка не та. Чтобы это исправить, поможет iconv
, который умеет конвертировать данные между разными кодировками:
grep -Rnia "$(iconv -t CP1251 <<<'привет')" . | iconv -f CP1251
Не забудьте флаг a
, который говорит grep
, что мы работаем с бинарным форматом, иначе он будет спамить текстом Binary file matches
.
Однако и с такой командой есть проблема: несмотря на флаг -i
, который нам говорит игнорировать регистр, grep
ничего не знает о нашей кодировке и не знает, что ‘п’ и ‘П’ — это одна буква. Поэтому спереди надо дописать LC_CTYPE=ru_RU.CP1251
.
Стоит также учесть, что всякие знаки препинания в html записаны мнемониками или кодом, поэтому писать их в шаблоне поиска не стоит.
Комментарии мне было удобно читать по обсуждениям. Чтобы выдрать все обсуждения, в которых поучаствовали, выполняем
grep -Raioh 'https://vk.com/wall[^?]*' ../Archive/comments | sort | uniq
Довольно много комментариев будут на вашей стене, лучше отфильтровать по своему id. Повторюсь, что есть скрытые комментарии. Судя по всему, они появились следующим образом: пользователь закрыл комменты к своей стене. По крайней мере, API ВК пишет Access to post comments denied
.
Картинки #
С поиском по картинкам сами знаете, как обстоят дела, поэтому придется их смотреть своими глазами. Но для этого их надо сначала скачать. Если вы дата сатанист, то все равно в хозяйстве пригодится — какую-нибудь очередную генерилку треша написать, например. У меня в личке было всего полторы тысячи картинок.
Качать будем из сообщений, т.к. на стене — только ссылки на посты. Но если нужны картинки со стены — они есть в альбомах. Насчет комментариев — не знаю, не нашел у себя ни одного комментария с картинкой.
Включаем grep
-магию:
grep -RiohPa "attachment__link' href='\K.*?(?=')" ../Archive/messages | grep 'userapi' | xargs -P 10 -n 1 curl -sO
Что тут происходит? Мы занимаемся запрещенными темными искусствами — парсим HTML с помощью регулярных выражений :) И не простых, а перловых (-P
), да еще с positive look-ahead ((?=)
) и zero-width look-behind (\K
). Флаг -o
говорит нам о том, что нас интересует только совпадение, т.е. сама ссылка, которая находится после href
в одинарных кавычках. Подробнее про это можно почитать на Unix StackExchange.
Потом выбираем ссылки только на картинки, которые хранятся на серверах ВК. А дальше с помощью xargs
в 10 потоков скачиваем все через curl
. Подробнее про связку xargs
с curl
. Клево, но будут потенциальные проблемы, если что-то не получится загрузить. Тогда было бы мудрее записать все в файл, убрав дубликаты (у меня штук 30 было), и потом сверять список скачанного и список из файла.
Если нужны картинки из фоток, то можно немного поменять первую команду:
grep -RiohPa "img src=\"\K.*?(?=\")" ../Archive/photos/
Ссылки #
Пришлось добавить вариантов завершения ссылки, т.к. она может быть текстом. А еще в HTML от ВК где-то двойные кавычки используются, а где-то одинарные.
grep -Raioh 'https\?://[^"<'\'']*' ../Archive | grep -v -e 'vk.com/wall' -e 'www.w3.org' -e 'vk.com/id' | sort | uniq > all_links.txt
Второй grep
отсеивает лишние результаты: ссылки на стены и профили ВК, строку с ссылкой на стандарт из шапки. Дальше можно анализировать этот список как душе угодно: читать все подряд, искать grep
ом интересное, удалить к чертям.
Можно посмотреть топ доменов ваших ссылок:
cat all_links.txt | grep -ioP '://\K[^/]*' | sort | uniq -c | sort -n
Но предварительно лучше разобраться с поддоменами, чтобы были более четкие данные. Я особо не парился и писал ручками обрезку домена третьего уровня через sed
:
cat all_links.txt | grep -ioP '://\K[^/]*' | sed 's/.*.userapi.com/userapi.com/g' | sed 's/.*.joyreactor.cc/joyreactor.cc/g' | sort | uniq -c | sort -n
Заключение #
Я на самом деле хотел только картинки посмотреть. А потом одно посмотрел, другое посмотрел, да и затянуло. Разумеется, в обычных условия я не позволи бы себе столько времени потратить на такую чушь — не повторяйте мою ошибку :). Но, признаюсь, чтение некоторых старых переписок навеяло… воспоминания. Эмоции. Пищу для размышлений и рефлексии. Так что, может быть, эти часы копания в прошлом были потрачены не совсем зря.
UPD #
Вторым ответом техподдержка ВК признала, что есть недочеты и передала разработчикам.
ВНЕЗАПНО публикациями в пабликах
как выяснилось, такое происходит не всегда, почему — не знаю. Просмотрел часть своих старых групп на 1,5 землекопа - моих постов со их стен в архиве нет.