Skypeのログを抽出してブラウザで見る

Skype Logo

先日、長年溜まっているSkypeのログを最初から見たくなったので、その時のやり方を。最終的にはブラウザにてLINE風デザインで閲覧できるようにしました。基本的にはMacでの作業ですが、Windowsのフリーソフトを使ったり、抽出したXMLをPHPで表示するので難易度はやや高めかもです。

 

SkypeのログをXMLで出力

私が見たいログはWindows版Skypeだったので、フリーソフトの『SkypeLogView』でXML抽出できた。Macで同等のソフトがあるかは知らないが、Skypeのログはデータベース(Sqlite?)に記録されているので、MacのSkypeデータ(~/Library/Application Support/Skype/ユーザー)のdbをWinにコピーすればSkypeLogViewで処理できそうだけど未検証。

XMLにさえなれば、あとはMacで作業。

Skype Logs Reader/Viewer (.dbb and main.db files)のスクリーンショットSkype Logs Reader/Viewer (.dbb and main.db files)

 

XMLの構文を修正

できあがったXMLは126Mになった。ちと巨大です。しかも構文エラーで読めません。構文のチェックにはPHPのsimplexml_load_fileか、あるいはChromeにXMLファイルを直接ドラッグで分かります。

XMLには複数のエラーがあるようで、いかんせんファイルが巨大なので安易に修正できない。Macで巨大なテキストファイルを編集するにはTextWranglerというエディタが良かった。126Mでも難なく読めたし置換もバッチリでした。

simplexml_load_fileでXMLが無事に読めるようになったら、あとはPHPで整形するだけ。

Bare Bones Software | TextWranglerのスクリーンショットBare Bones Software | TextWrangler

 

LINEのデザインでログ表示

LINEの画面に慣れているからか個人的には見やすいので、LINE風にログを表示するスクリプトをPHPで作成。エモーティコンとか対応してないけど、ざっと見るには十分です。簡単ですが、よかったらソースをどうぞ。

<?php
$skype_id = 'your skype id';
$logs = simplexml_load_file("skype_log.xml");
foreach ($logs->item as $val) {
    if ($val->action_type == 'Chat') {
        $o .= "<h2>" . date('Y/m/d G:i:s', strtotime($val->action_time)) . " <small>".$val->user_name."</small></h2>\n";
        $last_user = '';
    } else if ($val->action_type == 'Chat Message') {
        $display_name = '';
        if ( strcmp($last_user,$val->user_name) ){
            $display_name = $val->display_name;
        }

        $o .= "<div class=\"row {$val->user_name}\">\n";
        if ($val->user_name == $skype_id) {
            $o .= "<div class=\"col-xs-2 left\"> </div><div class=\"col-xs-8 center\"><span>{$val->chat_message}</span></div><div class=\"col-xs-2 right\">{$display_name}</div>\n";        
        } else {
            $o .= "<div class=\"col-xs-2 left\">{$display_name}</div><div class=\"col-xs-8 center\"><span>{$val->chat_message}</span></div><div class=\"col-xs-2 right\"> </div>\n";        
        }
        $o .= "</div>\n";
        
        $last_user = $val->user_name;
    } else if ($val->action_type == 'Send File') {
        $o .= "<h3>{$val->action_type} <small>{$val->user_name} " . date('G:i:s', strtotime($val->action_time)) . " {$val->filename}</small></h3>\n";
    } else {
        $o .= "<h3>{$val->action_type} <small>{$val->user_name} " . date('G:i:s', strtotime($val->action_time)) . "</small></h3>\n";
    }
}
?>
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Skype Log</title>
        <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet">
        <style type="text/css">
            body{
                font-size: large;
                background-color: #879dbb;
            }
            h2{
                padding-left: 10px;
                font-size: 48px;
                font-weight: 700;
                color: white;
                background-color: #333;
            }
            h3{
                padding-left: 10px;
                color: white;
                background-color: #333;               
            }
            .row{
                margin: 0.1em 0;
            }
            .left, .right{
                color: white;
                padding-top: 0.3em;
            }
            .center {
                line-height: 1;
            }
            .center span{
                border-radius: 10px;
                display: inline-block;
                padding: 0.5em;
                background-color: white;
            }
            .<?= $skype_id ?> .center {
                text-align: right;
            }
            .<?= $skype_id ?> .center span{
                background-color: #b2f08a;
            }
        </style>
    </head>
    <body role="document">
        <div class="container">
            <h1>Skype Log</h1>
            <?= $o ?>
        </div>
    </body>    
</html>