トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

日記/2010-9-25

キーワード

<< 前の日記  次の日記 >>

[日記,コンピュータ]PerlでGoogle Sitesのユーザごとの更新頻度を集計する

仕事で(半分以上遊びだけど)、グループで更新しているGoogle Sitesを、誰がどのくらい更新しているか、という頻度を集計する必要があった。

Google Sitesの更新通知は、サイトの設定でメールで受け取れるので、そのメールをファイルとして保存して、それをPerlで解析して集計することにした。メールの保存は、Thunderbirdなど適当なメーラで対象となるメールを選択し、「保存」などのメニューで.eml形式で書き出すだけ。

で、保存したファイルを適当なディレクトリに集め、以下のスクリプトを実行する。

#!/usr/bin/perl

use strict;
use warnings;
use POSIX qw(strftime);
use File::Basename;
use MIME::Parser;

my $parser = new MIME::Parser;
$parser->output_to_core(1);
#$parser->output_dir('./output');

my @orgmaillist = glob "*.eml";

my $counter = 1;
foreach my $orgmail (@orgmaillist) {
    my $number_file = sprintf("%04d.eml",$counter);
    open (ORGIN, "<:encoding(iso-2022-jp)", "$orgmail");
    open (ORGOUT, ">:encoding(utf8)","$number_file");
    while (<ORGIN>) {
	print ORGOUT $_;
    }
    close(ORGIN);
    close(ORGOUT);
    unlink($orgmail);
    $counter++;
}

my @maillist = glob "*.eml";
my %ranking;

foreach my $mail ( @maillist ) {
    open(IN,$mail);
    my $message = do {local $/; <IN>};
    close(IN);
    my $entity = $parser->parse_data($message);

    my $body_entity = ($entity->is_multipart) ? $entity->parts(0) : $entity;
    my $body = $body_entity->bodyhandle;

    my @body_text = $body->as_lines;
    my $who = $body_text[0];

    $who =~ s/さんが.*$//g;
    $who =~ s/\s//g;
    $ranking{$who}++;
}

my $today = strftime "%Y%m%d",localtime;
my $outfile = "result_$today.csv";

### 書き込み前にunlink
if (-e $outfile) {
    unlink ($outfile);
}

foreach my $freq (sort {$ranking{$b} <=> $ranking{$a}} keys %ranking){
    open(OUT,">>$outfile");
    print OUT "$freq,$ranking{$freq}\n";
#    print "$freq\t$ranking{$freq}\n";
    close(OUT);
}

MIME::Parserモジュールはメールを解析して、ヘッダとか本文とか添付ファイルとか、指定した要素だけを取り出すことができるので、ここでは本文だけを取り出している。

my $message = do {local $/; <IN>};

という部分は、正直何をしているのかよくわからないが、ファイル(メール)の内容を1行ずつでなく、まとめて変数に読み込むための処理。

で、Google Sitesの更新通知は、必ず1行目が「○○さんが投稿 ×× を更新しました。変更内容は下記のとおりです。」となっているので、1行目だけを読み込み、「さんが」以下を削除して、ユーザ名だけを取り出している。

そして、rankingというハッシュにユーザ名を代入し、ソートと重複の削除をおこない、頻度を出力している。このへんはひとくちPerlプログラミングをほぼ丸写し。なんでこれで頻度の数字が出てくるのか、ちゃんと理解してないけど、ひとつ下の行と比較していったあとの、最後の行のキーに対応する値を出力しているのだろうか。

……あぁ、同じキーにどんどん値が上書き(++でカウントアップ)されているだけか。

どうもこのスクリプトで処理していて、同じ人が別のデータとして集計されていたので、よくよくメールを見てみたら、Google Sitesでは、テキストの更新では「○○さんが」という文面になっているのに対し、画像の追加・削除などをおこなうと「○○ さんが」と1文字ぶんのスペースが入ってメールが来るようだ。このせいで、同じ人なのに、テキストを編集した場合と画像を操作した場合とで、違う人としてカウントされていた。なので、スペースがあったらそれを削除するよう、

$who =~ s/\s//g;

という処理を追加した。

コメントをどうぞ

計算:9×6= お名前: コメント:

日記一覧へ