В не столь далеком, но уже практически забытом 2015 году, я опубликовала статью (одну из самых читаемых в бложике), посвященную обработке базы данных, в которой Skype хранит свои сообщения. Много воды утекло с тех пор…

Причина, по которой та статья сегодня теряет свою актуальность – прекращение поддержки версий Skype с сохранением всех сообщений в локальную БД. Я не просто так пишу слово “всех” и “локальную”. Дело в том, что часть сообщений (самые последние) все еще хранятся в БД (но не Sqlite), а полные логи доступны на серверах Microsoft. Приятная особенность заключается в том, что их все еще можно достать.

Неприятная особенность кроется в большой доли неопределенности касаемо будущего такой выгрузки. Но сам факт того, что данные можно выгружать, означает возможность анализа.

Где-то в конце 2016 года меня задолбал дурацкий синтаксис VBA и я переписала свой парсер на Python. Делает он все то же самое: пробегается по БД и складывает все данные парсинга в отдельную базу данных. К ней можно делать простые запросы, например:

select word, sum(quan) as quan from words group by word order by quan desc limit 10

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

Мне, конечно, пришлось ее изрядно покромсать после того как Microsoft отказалась от Sqlite на клиентской стороне, но новый парсер ничем не уступает старому и большая часть кода осталась неизменной.

Теперь, когда я описала получаемый моим скриптом результат, можно перейти к более техническим подробностям. Для тех, кто не хочет работать напрямую с БД будут приятные новости в каком-нибудь из моих будущих постов, а в этом я распишу как пользоваться скриптом и что он умеет. Скажу сразу – он писался костыльно и на коленке, поэтому особой красоты от него ждать не стоит, но со своей задачей он справляется весьма неплохо.

Основная точка входа в скрипт находится в test.py. Я не прорабатывала интерфейс командной строки, поэтому для работы вам придется поменять часть кода в первых строчках файла. Здесь нужно указать путь к вашему хранилищу файлов в resourceRoot. Сейчас там напрямую прописана моя конфигурация. В списке ресурсов прописывается список доступных баз данных и json файлов. Выгрузка актуальной версии скайпа осуществляется в JSON. В репозитории лежат обе реализации скриптов – для Sqlite БД (dbcon) и JSON (jsoncon). В теории их можно довольно просто совместить, но мне это не требовалось. Кроме того, если возникнет необходимость, можно написать сколько угодно ваших собственных реализаций, которые будут парсить что угодно, а не только данные Скайпа.

Данные укладываются в четыре таблицы:

  • Authors – просто информационная табличка для использования в join запросах;
  • Words – используется для подсчета числа слов в разрезе по авторам и годам;
  • Stats – используется для подсчета специальной статистики по датам сообщений. Также по годам и авторам;
  • Special – подсчет использований смайликов, цитат и другой специфической ерунды.

Чего скрипт делает:

  • Заносит в БД довольно точные данные о числе использованных слов и дополнительную информацию;
  • Фильтрует содержимое различных тегов (прописанных в коде вручную), не добавляя его к подсчету слов в сообщении;
  • Позволяет складывать статистику нескольких аккаунтов в одного уникального пользователя;
  • Позволяет складывать несколько файлов json или баз данных в один результат (хотя результат не совсем проверялся, я не знаю отличаются ли id сообщений на разных аккаунтах). При этом никто не мешает комбинировать оба вида источников, но для этого нужно слегка поправить код;
  • Позволяет анализировать часть данных и не стирать все данные из БД целиком (нужно вносить изменения в код, см. методы с префиксом wipe).

Чего скрипт не делает:

  • Невозможно точно определить все специальные сообщения, так как сообщения статуса (/me) никак в XML не отражены. Для фильтрации этих сообщений я проверяю, что первые символы сообщения совпадают с отображаемым именем учетной записи. Такие сообщения считаются в отдельную категорию, которая в таблицы пока что не попадает;
  • Даже те спецсообщения, которые отражены в XML, могут обрабатываться недостаточно точно. Например, сообщения о редактировании никак не вляют на подсчет слов и просто исчезают из статистики;
  • Сообщения в JSON хранятся с UTC временем. Я перевожу его в московское время, поэтому возможно потребуются изменения. См. getDateTime.

Код слегка обмазан комментариями, но после изменения конфигурации в основном файле он должен работать из коробки. Тем не менее, целевая аудитория скрипта должна хоть немножко уметь в программирование.

Я привожу свою программу парсинга просто как пример реализации. Она писалась для личного пользования, а потому не слишком готовилась к публикации. Может быть когда-нибудь я напишу более человечную и всеядную версию парсилки, но это неточно.

Пост написан на основе кода на дату публикации. В дальнейшем код будет меняться, а пост, скорее всего, нет. Имейте в виду.

Обсуждение в telegram