Edited at

Skype の SQLiteファイル main.db の構造

More than 3 years have passed since last update.


Skype の発言内容を読み取りたい

Skype API 等もあるがもっと高速に読みたい。

Skype が使用しているデータベースファイルの構造を、手当たり次第データを漁ることにより解析した。


main.db を読む

Linux, Mac に Skype をインストールしてあれば、

/home/{Linuxユーザ名}/.Skype/{Skypeユーザ名}/main.db

というファイルができているはず。

このファイルは SQLite のファイルなので、SQLite のコマンドにより中身を読み取ることができる。


SQLite コマンド

インストールされていなければ yum 等でインストールする。

# yum -y install sqlite

sqlite3 コマンドで main.db にアクセスする。

$ sqlite3 /home/Hoge/.Skype/Fuga/main.db

SQLite version 3.6.20
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>


テーブル一覧

.table コマンドでテーブル一覧を見ることができる。

sqlite> .table

Accounts ChatMembers DbMeta SMSes
Alerts Chats LegacyMessages Transfers
AppSchemaVersion ContactGroups MediaDocuments VideoMessages
CallMembers Contacts Messages Videos
Calls Conversations Participants Voicemails


コンタクト一覧

sqlite> .schema Contacts

CREATE TABLE Contacts (id INTEGER NOT NULL PRIMARY KEY, ..., skypename TEXT, ..., fullname TEXT, ...);
......


  • skypename … ID

  • fullname … 表示名

sqlite> SELECT skypename, fullname FROM Contacts LIMIT 10;

kobayan-tokyo|k.kobayashi
kobabot|こばぼっと
......


トピック一覧

いわゆる「窓」一覧は「Conversations」テーブルから確認することができる。

sqlite> .schema Conversations

CREATE TABLE Conversations (id INTEGER NOT NULL PRIMARY KEY, ..., identity TEXT, ..., displayname TEXT, ..., last_activity_timestamp INTEGER, ...);
......


  • identity … トピック識別子

  • displayname … 表示名

  • last_activity_timestamp … 最終更新時刻

sqlite> SELECT id, identity, displayname FROM Conversations ORDER BY last_activity_timestamp DESC LIMIT 10;

1212|xxxxxx|窓1
1213|yyyyyy|窓2
1200|zzzzzz|窓3
.......


トピック内発言一覧

sqlite> .schema Messages

CREATE TABLE Messages (id INTEGER NOT NULL PRIMARY KEY, ..., chatname TEXT, ..., from_dispname TEXT, ..., timestamp INTEGER, ..., body_xml TEXT, ...);
....


  • chatname … トピック識別子

  • from_dispname … 発言者

  • timestamp … 発言時刻

  • body_xml … 発言内容

たとえば上述の「窓1」(identity = 'xxxxxx')の発言一覧を取得したければ、

sqlite> SELECT timestamp, from_dispname, body_xml FROM Messages WHERE chatname = 'xxxxxx' ORDER BY timestamp LIMIT 5;

1434871603|kobayashi|hello
1434871611|kobayashi|test
1434871640|kobayashi|testtest
1434871640|kobayashi|こんにちは
1434871641|kobayashi|g

のような感じ。


応用

今回の解析結果を元に、Skype の発言内容をブラウザから閲覧・検索できる qskype というものを作ってみた。これの完成間近に Skype for Web が発表されてしまったが他意は無い。