Skypeからメッセージ履歴をエクスポートする

LinuxのSkype Skypeユーザーの多くは、チャットメッセージの履歴を操作するのがいかに不便であるかに気付いています。 通常の検索はありません。長時間のメッセージは非常に長く読み込まれます。 他の形式/クライアントにエクスポートする可能性はありません。

LinuxのSkypeは、文書化されていないバイナリ形式でメッセージ履歴を保存します。 愛好家はかなり長い間それを拾ってきたという事実にもかかわらず、多くは不明のままです。

メッセージ履歴をエクスポートするためのターンキーソリューションの表面的な検索は成功していません。 したがって、入手可能なすべての情報を収集したので、私は自分で書きました。

Skype API

最初の考えは、D-Busインターフェースを介してSkype APIを使用することでした。 SEARCH CHATSコマンドがあるように見えますが、何らかの理由ですべてのチャットを発行することができませんでした。 これを意図したものではないと思います。 Skype APIは現在のイベントを処理するのに十分ですが、履歴にアクセスするには、別のソリューションを探す必要があります。 サポートによると、APIを介してエクスポートする可能性はhttps://jira.skype.com/browse/SPA-596計画に含まれていません。

Dbbファイル

したがって、唯一の解決策は、プロファイルファイルからメッセージを抽出することです。 理由はわかりませんが、Skypeのエンジニアがデータを保存するためのかなり奇妙なバイクを思いつきました。 クライアントの4番目のバージョンから、彼らは考えを変えてSQLiteに切り替えましたが、Linuxに関しては、これまでのところ、古い形式の2番目のバージョンしかありません。

データはnameXXX.dbbファイルのプロファイルフォルダーに保存されます。 各ファイルには、「2のべき乗」+8の固定サイズのレコードが含まれています。 レコードサイズは最も近い2のべき乗(少なくとも256)に切り上げられ、レコードは対応するファイルに書き込まれます。

したがって、 chatmsg512.dbbファイルは、それぞれ512 + 8 = 520バイトのブロックで構成され、各ブロックには256〜512バイトの長さのレコードが含まれます。

そのような形式がどのような目的で効果を発揮するのか、私にはほとんど想像できません。 丸めにより、未使用の穴が得られ、サイズが不当に大きくなります。 たとえば、21,500メッセージのデータベースでは、 23.5%のスペースが丸めで失われました。これは、メッセージあたり平均73バイトです。 空き領域をこのように自由に使用すると、数字の7ビットエンコードはやや奇妙に見えます(以下を参照)。 最後に、メッセージは異なるファイルに書き込まれるため、意味のある使用の前にメッセージを結合およびソートする必要がありますが、これも速度を向上させません。

記録フォーマット

レコードは、見出しと本文で構成されます。 ヘッダーの長さは17バイト(17)です。
4バイトのマジック値「l33l」
4バイトの記録サイズ32ビット整数
4バイトの識別子32ビット整数
5バイト不明

次の3つのタイプのフィールドは0x00-7ビットエンコーディングの数字、0x03-文字列、0x04-バイナリデータのブロックです。 データタイプに加えて、各フィールドには7ビットエンコーディングのフィールドタイプも含まれています。

フィールドタイプ
0x00-データ型(数値)
7ビット数-フィールドタイプ
7ビット数-フィールド値

0x03-データ型(文字列)
7ビット数-フィールドタイプ
ヌル終了文字列-フィールド値

0x04-データ型(blob)
7ビット数-フィールドタイプ
7ビットBLOBサイズ-フィールド長
バイナリblob-フィールド値

可変長の7ビットコーディング
各バイトの最上位ビットは、このバイトが最後かどうかを示します(1-いいえ、0-はい)。 残りの7ビットは重要です。 数値を取得するには、ビッグエンディアンの順序で7ビットブロックを接着する必要があります。

Skypelog.pyスクリプト

DBBファイルを読み取るPythonスクリプト/モジュールは、GitHub https://github.com/Vayu/skypelogから取得できます
モジュールには、SkypeMsg、SkypeAcc、SkypeContactなどのさまざまなタイプのレコードのフィールド名について現在知られている情報が含まれています。

スクリプトを直接実行すると、 chatmsgXXX.dbbファイルの内容をJSONまたはプレーンHTMLにエクスポートできます。skypelog.pyをモジュールとして使用する例:
#!/ usr / bin / env python
skypelog インポート から *
データ= SkypeDBB "/home/user/.Skype/account/call256.dbb"
データのrの場合。 レコード
プリント r
GitHubの長いapiuse.pyの例。

おわりに

上記の例からわかるように、 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ブログ-Skypeログ
Neal Krawetzブログ-Skype Logsディスカッション

PS1:コメントのレビューから判断すると、「検索チャット」は以前は機能していましたが、Skypeのバージョンに依存する可能性があります。 ご希望の方は、次のコードを試すことができます:
(Python用のdbusモジュールが必要)
#!/ usr / bin / env python
インポート dbus
インポートシステム
試してください
skype = dbus。 SystemBus get_object 'com.Skype.API''/ com / Skype'
を除く
試してください
skype = dbus。 SessionBus get_object 'com.Skype.API''/ com / Skype'
を除く
「Skype APIが見つかりません」を 印刷する
sys 終了

スカイプを印刷します呼び出し "NAME python"
スカイプを印刷します呼び出し "PROTOCOL 9999"
スカイプを印刷します呼び出す 「検索チャット」

Source: https://habr.com/ru/post/J129044/


All Articles