SkypeのチャットログのSQLiteをhtml出力する

Skype4のチャットログはC:\Users\ユーザ名\AppData\Roaming\Skype\アカウント名のmain.dbのMessagesテーブルの中に他人の発言も全部あります。*1これをHTML出力したいと思います。
main.dbファイルの調査は、id:Pupさんの"PupSQLite"を使わせてもらいました。テーブルの閲覧にしか使っていませんが、直感的に操作が出来て非常に使いやすく、SQL文のチェックも使えるのでオススメです。


SQL文による抽出結果の表示

準備

今回必要なものをインストール。
DBIx::Simple(v1.32) - ラッパー

ppm install DBIx::Simple

DBIx::XHTML_Table(v1.36) - HTML出力の為

ppm install DBIx::XHTML_Table

ソースコード

#!/usr/bin/perl
use DBIx::Simple;
use Data::Dumper;
use strict;
use warnings;

my $db = DBIx::Simple->connect('dbi:SQLite:dbname=main.db') || die DBIx::Simple->error;
my $result = $db->query('SELECT from_dispname, body_xml, timestamp FROM Messages WHERE author="cherenkov_" AND chatname="#cherenkov_;12846c3d04f0e4fa"') -> html;
warn Dumper $result;
open(OUT,">skype-log.html") || die;
print OUT $result;
close(OUT);

skype-log.plで保存。main.dbと同じ場所にしておく。


すぐに試してみたい人は、

  • 全ての過去ログから一人の発言を抽出。
my $result = $db->query('SELECT from_dispname, body_xml, timestamp FROM Messages WHERE author="抽出したいアカウント名"') -> html;
  • 全ての過去ログを抽出
my $result = $db->query('SELECT from_dispname, body_xml, timestamp FROM Messages') -> html;

ソース解説

  • main.dbにアクセス。
  • SQL文で指定、「Messagesテーブルのfrom_dispname列, body_xml列, timestamp列のデータを持って来い。ただしauthor列がcherenkov_かつ、chatname列が#cherenkov_;12846c3d04f0e4faのもの。」
    • from_dispname列:Skypeでの表示名、body_xml列:本文、timestamp列:タイムスタンプ、author列:アカウント名、chatname列:部屋固有の文字列。列は他にいくつもある。
  • ->htmlでDBIx::XHTML_Tableによってhtml出力。
  • Dumperでプロンプトに結果を表示。
  • 最後の三行でhtmlファイルに出力。

実行

skype-log.plの場所まで移動して、

perl skype-log.pl

結果

生成されたhtmlを開くと、

SQL文で指定した項目の順番でテーブルが作られる。
timestampは後ろに0を3つ付けて、javascript:alert(new Date(1241013723000));すれば読めますね。

不具合

  • body_xmlの内容にHTMLタグ以外のタグを含む場合html化したときに捨てられる。(絵文字がssタグ)
  • body_xmlの内容が複数行の場合html化したときに捨てられる。(数行のソースコードなどをペーストしたとき)
    • DBIx::XHTML_Tableを使わずに自分で加工すれば問題無いと思う。自分にはまだ出来ない。

感想

最初にClass::DBI::SQLiteだかDBD-SQLiteを使ったけどうまく動かなかった。
なぜSkypeを調べてたのかというと、ブラウザを全て閉じた状態でSkypeに貼られたリンクをクリックすると、どうやら"既定のブラウザ"が起動するがFirefoxで複数のプロファイルを扱っている場合でもdefaultのプロファイルが起動してしまい、それを避けたかった。レジストリやファイルを見て回ったけどプロファイル指定で起動はできなさそうだった。

*1:ログが増えると別のテーブル、別のファイルになるのかは不明。