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にエクスポートできます。
- JSONは、外部プログラムによる後続の処理を目的としており、アカウント履歴全体を単一のファイルに保存します。 2つのオプションがあります。「full」はすべての既知のフィールドをエクスポートし、「compact」は「日付、名前、メッセージ」の最小限のセットをエクスポートします。
- HTMLは、アカウントの連絡先のペアごとにメッセージ履歴ファイルを作成します。 たとえば、vasya-petya.htmlおよびvasya-masha.html。 残念ながら、グループチャットのレコードの構造はまだ完全には明らかではありません。
#!/ usr / bin / env pythonGitHubの長いapiuse.pyの例。
skypelog インポート から *
データ= SkypeDBB ( "/home/user/.Skype/account/call256.dbb" )
データのrの場合。 レコード ( ) :
プリント r
おわりに
上記の例からわかるように、 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" )
スカイプを印刷します 。 呼び出す ( 「検索チャット」 )