Экспорт истории сообщений из Skype

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

    Skype для Linux хранит историю сообщений в недокументированном бинарном формате. Несмотря на то что энтузиасты расковыряли его довольно давно, еще многое остается неизвестным.

    Поверхностный поиск готового решения для экспорта истории сообщений не привел к успеху. Поэтому я, собрав всю доступную информацию, написал своё.

    Skype API

    Первой мыслью было использовать Skype API через D-Bus интерфейс. Казалось бы, есть команда «SEARCH CHATS», но почему-то у меня не получилось её заставить выдавать все чаты. Подозреваю, что она для этого и не предназначена. Skype API достаточен чтобы оперировать текущими событиями, но для доступа к истории надо искать другое решение. Поддержка так и пишет, что возможность экспорта через API в планах не стоит https://jira.skype.com/browse/SPA-596.

    DBB файлы

    Значит единственный выход это извлечь сообщения из файлов профиля. Не знаю по какой причине, но для хранения данных инженеры Skype придумали довольно странный велосипед. С 4ой версии клиента они одумались и перешли на SQLite, но для Linux пока есть только 2ая со старым форматом.

    Данные хранятся в папке профиля в файлах nameXXX.dbb. Каждый файл содержит записи фиксированного размера «степень двойки»+8. Размер записи округляется вверх до ближайшей степени двойки (не меньше 256) и запись пишется в соответствующий файл.

    Таким образом, файл chatmsg512.dbb состоит из блоков по 512+8=520 байт в которых содержатся записи длиной между 256 и 512 байт.

    Я с трудом представляю для какой задачи такой формат будет эффективным. Из-за округления получаются неиспользуемые дырки, что приводит к неоправданному увеличению размера. Для примера, в моей базе из 21500 сообщений 23.5% места потеряно на округлении, в среднем 73 байта на сообщение. При таком вольном обращении со свободным местом, несколько странно выглядит семибитная кодировка чисел (см ниже). Наконец, так как сообщения пишутся в разные файлы, перед каким-то осмысленным использованием их надо объединять и сортировать, что тоже не прибавляет скорости.

    Формат записи

    Запись состоит из заголовка и тела. Заголовок имеет длину 17 байт (семнадцать).
    4 байта магическое значение «l33l»
    4 байта размер записи 32-bit int
    4 байта идентификатор 32-bit int
    5 байт неизвестно

    Далее следуют поля трёх типов 0x00 — число в семибитной кодировке, 0x03 — строка, 0x04 — блок двоичных данных. Каждое поле помимо типа данных содержит тип поля также в семибитной кодировке.

    Типы полей
    0x00 — тип данных (число)
    7bit number — тип поля
    7bit number — значение поля

    0x03 — тип данных (строка)
    7bit number — тип поля
    null-terminated string — значение поля

    0x04 — тип данных (blob)
    7bit number — тип поля
    7bit blob size — длина поля
    binary blob — значение поля

    Семибитная кодировка переменной длины
    В каждом байте старший бит указывает является ли этот байт последним (1 — нет, 0 — да). Остальные 7 бит значащие. Чтобы получить число надо склеить 7 битные блоки в порядке big-endian.

    Скрипт skypelog.py

    Питон скрипт/модуль, который читает DBB файлы можно взять с GitHub https://github.com/Vayu/skypelog.
    В модуле собрана известная на данный момент информация об именах полей записей различных типов: SkypeMsg, SkypeAcc, SkypeContact.

    Прямой запуск скрипта позволяет экспортировать содержимое файлов chatmsgXXX.dbb в JSON или простой HTML:
    • JSON предназначен для последующей обработки внешними программами и сохраняет всю историю аккаунта в один файл. Есть два варианта: «full» экспортирует все известные поля и «compact» экспортирует минимальный набор «дата, имя, сообщение».
    • HTML создаёт файлы с историей сообщений для каждой пары аккаунт-контакт. Например vasya-petya.html и vasya-masha.html. К сожалению, структура записей для групповых чатов пока до конца не ясна.
    Пример использования skypelog.py в качестве модуля:
    #!/usr/bin/env python
    from skypelog import *
    data = SkypeDBB("/home/user/.Skype/account/call256.dbb")
        for r in data.records():
            print r
    Более длинный пример apiuse.py на GitHub.

    Заключение

    Как видно из примера выше, skypelog.py существенно упрощает исследование формата DBB. Имена полей пока известны (угаданы), только для нескольких типов записей:
    chatmsgXXX.dbb — сообщения чата, класс SkypeMsg
    profileXXX.dbb — учетные записи, класс SkypeAcc
    userXXX.dbb — контакты, класс SkypeContact

    Желающие приглашаются к угадыванию пока неизвестных значений полей в следующих файлах:
    alertXXX.dbb — системные сообщения
    chatXXX.dbb — список чатов
    chatmemberXXX.dbb — список участников чата (?)
    transferXXX.dbb — список переданных файлов
    callXXX.dbb — лог звонков
    callmemberXXX.dbb — список участников звонка (?)
    voicemailXXX.dbb — голосовая почта

    Более подробное обсуждение формата (англ)
    Neal Krawetz blog — Skype Logs
    Neal Krawetz blog — Skype Logs discussion

    PS1: Судя по отзывам в комментариях «SEARCH CHATS» раньше работала, возможно зависит от версии Skype. Желающие могут попробовать следующий код:
    (нужен dbus модуль для Python)
    #!/usr/bin/env python
    import dbus
    import sys
    try:
        skype = dbus.SystemBus().get_object('com.Skype.API''/com/Skype')
    except:
        try:
            skype = dbus.SessionBus().get_object('com.Skype.API''/com/Skype')
        except:
            print "Can't find Skype API"
            sys.exit()
     
    print skype.Invoke("NAME python")
    print skype.Invoke("PROTOCOL 9999")
    print skype.Invoke("SEARCH CHATS")
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 51

      –3
      Зачем же так? Есть ведь Skype API, через него можно достаточно доставать всю историю.
        +2
        Псто не читай, сразу отвечай. Но автор всё равно неправ, ибо я доставал как раз всю историю через Skype API. Исходники: forever.disasm.info/files/diary/skype_saver.tar.gz
          +3
          Это не Skype API, а SkypeKit.

          Он платный, соответсвенно я его не пробовал. Если работает под Linux и позволяет достать историю это хорошо.
            0
            Хм, странно. А раньше бесплатный был.
              0
              Это может быть еще старый Skype4Java, который уже не поддерживается (остался только Skype4Com для винды).
                0
                Да похоже что это Skype4Java.

                Вышеприведенный код skype_saver у меня не запустился (не взлетел libskype.so). Но декомпиляция Skype.class показала, что он и в правду использует (использовал? когда работал) Skype API команду «SEARCH CHATS».

                С моей версией Skype она ничего не возвращает (по крайней мере через D-Bus).
          0
          Первой мыслью было использовать Skype API через D-Bus интерфейс. Казалось бы, есть команда «SEARCH CHATS», но почему-то у меня не получилось её заставить выдавать все чаты. Подозреваю, что она для этого и не предназначена. Skype API достаточен чтобы оперировать текущими событиями, но для доступа к истории надо искать другое решение. Поддержка так и пишет, что возможность экспорта через API в планах не стоит jira.skype.com/browse/SPA-596.
            +1
            Какой Вы быстрый!
            +7
            И я вставлю свои 5 копеек.
            У меня немного «черезжопный способ»:
            — ставим pidgin;
            — подключаем все что нам нужно. Разные там протоколы, аимы, джаберы и прочая, в том числе и skype4pidgin;
            — ставим дропбокс;
            — линкуем папку ~/.purple/logs на линуксе и c:\users\%username%\appdata\roaming\.purple\logs на win7 в дропбокс;
            — на выходе имеем ОДИН интерфейс на аську, твиттер, почту, скайп и прочая + синхронизация истории этих протоколов на разных системах с разными операционками в формате html.
            — профит!

            А на выходе имеем хистори скайпа в удобоваримом формате и главная фича в том, что таким вот способом через гланды, skype не тупит с подгрузкой хистори из сервера; когда включил скайп на ноуте и минут через 10 он тебе выдал всю переписку с работы. Это бесит.
              +3
              идея интересная, к сожалению опыт «сношений» (по другому не назвать) Pidgin и Skype не очень удачен. Падают попеременно и с завидным постоянством.
              • UFO just landed and posted this here
                0
                Скайп никогда не грузит историю с сервера.
                  0
                  Да конечно. Это вы не пользовались им на двух компах
                    +2
                    Скайп грузит хистори с других участников своры. Но никак не с сервера.
                      0
                      s/своры/чата/
                      Чертовы словарные клавиатуры мобилок! Еще и карма не позволяет быстро написать исправление…

                      Хотя получилось интересно ))
                      0
                      Именно потому что я пользовался, я и говорю. Сервер используется для авторизации и поддержания работы сети.
                        +1
                        Ну да, мое возмущение было направлено на «никогда не грузит», а не на сервер. Против загрузки с других участников своры не возражаю
                          0
                          :D надо создать свою соцсеть, где общие чаты будут называться «сворами» :D
                            +2
                            а что, вполне подходящее слово. я бы и не понял опечатки, если бы не исправили
                    0
                    В пиджиноплагине, не побоюсь этого слова, уёбищно реализована поддержка групповых чатов скайпа. Если вы ими не пользуетесь, это не значит, что не пользуются остальные.
                      +1
                      А кто спорит?
                      Не побоюсь этого слова — сам скайп под линукс выглядит уёбищно.

                      А что именно не так? Чаты есть. Отображение есть. Смайлов нет — хрен с ними. /help-комманды работают.
                      Тем более, плагин работает через d-bus, клиент скайпа висит паралельно из-за закрытой техноголгии; всегда можно сделать что-то в самом скайпе, если этого нет в плагине.
                        +1
                        Темы чата нет. Картинки чата нет. Избранных чатов нет. Населена роботами.
                          0
                          ТЕма чата есть. описание есть.
                          картинки нет.
                          фейворит тоже нет.

                          боты — лесом. На комнату ставиться пароль и все новенькие делаются юзерами, ждущими авторизации.

                          Хотя избранное можно достичь еще путем добавления комнаты. В пиджине выставить 2 галочки «автоматом коннектится как только вошел» и «оставаться в комнате как закрыл окно».

                          Если есть альтернатива — я бы непрочь и сам переползти. Много костылей тоже напрягает.
                            0
                            Насчёт роботов — это была отсылка к планете Шелезяка, как я понял :)
                              0
                              боты — лесом.
                              Это была отсылка к советскому мультфильму. «Планета Шелезяка. Растительности нет. Воды нет. Полезных ископаемых нет. Населена роботами.»

                              Мне вообще пиджиноплагин не актуален. У меня из аськи и жабера 3 относительно активных контакта, все остальные в скайпе.
                        0
                        Сам этим пользуюсь. И в linux, и в windows. Для меня один минус — нельзя редактировать(удалять) отправленные сообщения. Для этого skype приходится открывать. Групповые чаты устраивают. Свою задачу решают.
                        +6
                        скайп это зло.
                          0
                          А что делать…
                            0
                            Экспортировать данные в альтернативные клиенты_)
                              0
                              Людей увы в альтернативные протоколы не экспортируешь…
                                0
                                Людей у которых есть е-мыло больше, чем тех кто имеет скайп… а мыло может стать идентификатором джабера… А по джаберу можно совершать аудио видео звонки с помощью jitsi.org :) Хотя есть и прочие клиенты, но jitsi умеет все, что умеет скайп. А в будущем запланировано даже то, что умет коммерческий скайп. Не плохо для начала?
                                  +1
                                  Далеко не для каждой почты есть соответствующий джаббер акк. Увы.
                                0
                                А смысл? Дело в людях
                                  0
                                  Я потому и написал альтернативные клиенты, а не протоколы.

                                  В любом случае, возможность перескочить не помешает. Не сегодня, так завтра.
                                    0
                                    А где они, совместимые клиенты?
                                +1
                                Jitsi — открытая альтернтива скайпу, с возможностью аудио/видео звонков с использование jabber протокола. Я сомневаюсь, что количество пользователей jaberra меньше, чем у скайпа. Альтернатива есть. Правда клиент еще в стадии разработки. Но активно развивается. Поддерживает все открыты стандарты.

                                Пока главная проблема jabber клиентов в том, что они не все совместимы между собой для передачи аудио и видео. По уровню убоства и функционалу к скайпу ближе всего Jitsi. Но пока жду релиза, что бы навсегда пересадить всех своих знакомых на него. :)
                                  0
                                  Вы не понимаете или прикидываетесь? Клиентов есть сколько угодно, причем один лучше другого. Хоть гугловский.

                                  Ведь проблема не в том, чтоб выбрать лучший клиент, и проблема не в обучении работы с ними. Если я хочу уйти со скайпа мне придется пересадить не только тех человек, с которыми общаюсь я, но и тех, с кем общаются они. А это уж совсем никак невыполнимо.

                                  нужен совместимый клиент, а не альтернативный.
                                    0
                                    Вы разве не понимаетете, что скайп принадлежит главному вендорлокеру планеты? Понятие совместимость и микрософт не совместимы. Я именно по этому и назвал jabber, не как альтернатива протоколу, а как альтернатива базе пользователей. Вы думаете, что база пользователей скайпа больше jabbera? И практически у всех пользователей интернета есть почта, а этого уже достаточно для jabbera. Вообще-то jabber вообще не поддерживает аудио по умолчанию, требует расширение протокола jingle, который криво поддерживается разными клиентами, а многие его вообще не поддерживают. Проект пока все еще развивается.
                                      0
                                      А зачем мне альтернатива базе пользователей? Это не сайт знакомств. Вот мне нужно общаться с человеком, у которого есть только скайп. Мне найти его альтернативу?
                                        0
                                        Вы хотите сказать что есть люди у которых есть скайп, но нет электронной почты? Тогда это проблема. Но для большиснва это не будет проблемой. Я же не говорю, что нужно отказаться от скайпа. Кто мешает использовать разные клиенты с разными людьми. Например у меня есть контакты в асе и в джабере. И ничего не страдаю от этого. Если сильно нужно, то можно звонить по SIP на телефонные сети. Не путайте меня с проповедниками скайпокапца :) Этот клиент и протокол будет жить долго. Но я хочу альтернатив. И я их показываю. А будет спрос на альтернативы, то будет и их развитие.
                              +2
                              Поверхностный поиск готового решения для экспорта истории сообщений не привел к успеху. Поэтому я, собрав всю доступную информацию, написал своё.
                              Первая ссылка в гугле. Отлично зацепила историю и перегнала её в html.
                                0
                                Даже если она и работает в WINE, я не большой любитель запускать непонятные программы из интернета. О вкусах не спорят верно?)
                                  0
                                  Я запустил под wine. Отлично работает. Проблем не замечено. Без проблем съела всю историю из линукс и виндовс клиента :)
                                0
                                А между тем, в habrahabr.ru/blogs/cpp/122735/ товарищ вполне себе экспортит историю именно через API.
                                Хотя, возможно, в вендовой и линуксячьей версиях апи отличается.
                                  0
                                  API почти одинаковое, но экспорт сообщений в моей версии не работает (команда «SEARCH CHATS» выдает пустую строку, а должна выдавать список всех чатов). В любом случае, в Windows версии уже используется SQLite, который читается в два счета и использовать API для эскпорта смысла нет.

                                  Интересный факт: мой код ни Питоне читает историю чата из DBB файлов примерно 100 раз быстрее чем клиент Skype for Linux. Собственно это и была основная мотивация, при достижении нескольких тысяч сообщений работать с историей в оригинальном клиенте становится невозможно.
                                  0
                                  А вот этот репозиторий: github.com/SergXIIIth/skype-history-import? Его вы не смотрели? Мне казалось, что там автор не только экспортит skype историю, но и импортирует её в gmail. Глянете?
                                    0
                                    «Экспортирует» это громко сказано. Там просто парсер копи-паста сообщений из окна клиента.
                                      0
                                      Понял, спасибо. Я посмотрел ваш проект на github'e — (моё почтение за вашу работу!) — но я так и не понял, работает оно с линукс версией или с виндовской? Там написано: «The D-Bus API does give access to the old message.»
                                        0
                                        Скажем так, мне не удалось заставить Skype выдать старые сообщения по dbus (хотя по идее должно работать). D-Bus есть только в Linux. Аналог для Windows называется Skype4Com.

                                        skypelog.py читает DBB файлы, которые использует Skype до версии 4.х
                                        Т.к. для Skype for Linux все еще 2.х (и видимо останется таким долго), skypelog.py имеет больше смысла в Linux (и поэтому этот пост размещен в блоге «Linux для всех»)

                                        В Windows и MacOS, начиная с 4.х Skype перешел на SQLite и все стало гораздо проще, тк есть куча программ читающих этот формат.
                                          0
                                          Если вам нетрудно, очень прошу вас привести пример для виндовской версии скайпа, потому что кроме g-recorder я не нашёл подобных программ. спасибо
                                          0
                                          Да и там аж три опечатки) должно быть «The D-Bus API doesn't give access to the old messages»

                                    Only users with full accounts can post comments. Log in, please.