distributed.netのstatsをメールで通知する

distributed.netでは各参加者の貢献度に応じたランキングが公開されています。これをstatsと呼びます。statsはプロジェクトの初期はリアルタイム更新というとんでもないことになっていましたが、今は1日1回(UTC0:00過ぎ)更新に落ち着いています。

distributed.netにはまると、このstatsチェックが日課になります。毎日毎日statsの更新が気になるようになった人をstatsジャンキーと呼びます。statsジャンキーはstatsが更新されたら即座にチェックして自分の順位を確認したいのですが、前述の通り更新時間はUTC0:00過ぎ。これは日本時間では午前9時過ぎということなります。社会人なら仕事をしている時間でして、堂々とstatsをチェックするのがはばかられる人も多いでしょう。ということで、stats更新内容をスクレイピングしてメールで通知するようにしよう、というのがお題です。

## URL構成

まずstatsのURL構成を知らなければなりません。と言っても簡単な話。statsを表示しているページのURLを控えておけばそれでOK。私の個人とチームのstats URLは以下の通りです。

* RC5-72個人 - http://stats.distributed.net/participant/psummary.php?project_id=8&id=497669
* RC5-72チーム - http://stats.distributed.net/team/tmsummary.php?project_id=8&team=4504
* OGR-28個人 - http://stats.distributed.net/participant/psummary.php?project_id=28&id=497669
* OGR-28チーム - http://stats.distributed.net/team/tmsummary.php?project_id=28&team=4504

## スクリプト

URLがわかれば、ページ内容を取ってきてメール送信するというただそれだけです。スクレイピングというか、statsページの内容をテキスト化するだけなんで、HTMLタグを除去する処理が入りますけれど。単純にテキスト化するとヘッダ、フッタ、ナビゲーションも入ってくるので、これらは除去しています。順位上下のマークが画像なのでその置換処理も入っていたり。

```perl:dnetstats.pl
#!/usr/local/bin/perl

use strict;
use warnings;
use Encode;
use utf8;

use LWP::Simple;
use Net::SMTP;

my @urllist = (
'http://stats.distributed.net/participant/psummary.php?project_id=8&id=497669',
'http://stats.distributed.net/team/tmsummary.php?project_id=8&team=4504',
'http://stats.distributed.net/participant/psummary.php?project_id=28&id=497669',
'http://stats.distributed.net/team/tmsummary.php?project_id=28&team=4504' );
my $smtp = 'mail.example.com';
my $from = 'saoyagi2@gmail.com';
my $to = 'saoyagi2@gmail.com';

{
	my @t = localtime( time() );
	my $body = '';
	for my $url ( @urllist ) {
		my $stat = get( $url );
		$stat =~ s/\n//msg;
		$stat =~ s/\s+/ /g;
		$stat =~ s/<\/tr>/\n/msg;
		$stat =~ s/<img.*?up\.gif.*?>/+/g;
		$stat =~ s/<img.*?down\.gif.*?>/-/g;
		$stat =~ s/<.*?>//g;
		$stat =~ s/.*Yesterday( Gnodes| Blocks|)//ms;
		$stat =~ s/Total.*//ms;
		$body .= "$url\n$stat\n\n";
	}

	my $subject = sprintf( "distributed.net stats %d-%d-%d", $t[5] + 1900, $t[4] + 1, $t[3] );
	my $data = <<"DATA";
To: $to
Subject: $subject
Content-Type: text/plain; charset=\"UTF-8\"

$body
DATA

	my $mail = Net::SMTP->new( $smtp, Hello=>$smtp );
	$mail->mail( $from );
	$mail->to( $to );
	$mail->data();
	$mail->datasend( encode( 'UTF-8', $data ) );
	$mail->dataend();
	$mail->quit;
}
```

非常に手抜きのてきとースクリプトですが、これによってstatsジャンキーの日々の幸福度はぐっとアップするのです。ちなみにやってくるメールはこんな感じになります。

```
http://stats.distributed.net/participant/psummary.php?project_id=8&id=497669

  6345(-1) Team #Mrieke 1,279 458,200  0
  6346(-1) daniel@haxx.se 2,658 458,059  0
  6347(-1) xactit@gmail.com 834 457,869  0
  6348(-1) saoyagi2 1,544 457,829  0
  6349(-1) holmes4444@dnetc.net 30 457,777  0
  6350(-1) rc5@tin.org 3,823 457,767  0
  6351(-1) Participant #27,704 1,736 457,657  0


http://stats.distributed.net/team/tmsummary.php?project_id=8&team=4504

  69   Moo! Wrapper Project  636 37,210,197 19,368
  70   Cows With Guns  4,863 36,813,300 0
  71   Universe  4,793 35,331,606 0
  72   team bukkake  4,905 35,197,114 0
  73   Team RimArts UsersGroup  4,929 35,049,250 7,781
  74   Final Tear Z  4,926 34,995,104 14,134
  75   AnandTech 10635  4,929 34,381,043 66
  76   Team 123  4,549 33,923,181 0
  77   Kaizoku!  4,893 32,985,595 0
  78   Ultimate Chaos  4,781 32,040,712 0
  79   Bivio Networks  937 31,582,764 0


http://stats.distributed.net/participant/psummary.php?project_id=28&id=497669

  657 u_jlbrown@yoyo.rechenkraft.net 758 3,687,453  0
  658 u_ElricM@yoyo.rechenkraft.net 489 3,676,787  0
  659(+1) u_bsivko@yoyo.rechenkraft.net 822 3,671,123  13,205
  660(-1) saoyagi2 833 3,669,838  1,529
  661(+1) Harry.vanEssen@Deltares.nl 832 3,649,078  14,863
  662(-1) barryma22@hotmail.com 834 3,648,204  13,289
  663(+1) rus20376@s242434804.onlinehome.us 834 3,634,754  23,042


http://stats.distributed.net/team/tmsummary.php?project_id=28&team=4504

  118   US-Distributed  831 10,777,726 83,243
  119   Oregon State University  13 10,608,543 0
  120   Team Haiku  638 10,274,993 0
  121   /dev/null  627 10,234,646 0
  122   In it for the money 5018163  829 10,203,652 0
  123   Final Tear Z  832 9,568,697 1,529
  124   fcsm : fr.comp.sys.mac  788 9,173,678 0
  125   Sun  833 8,866,007 45,346
  126   The BBS  831 8,651,811 15,677
  127   Team Wurst  832 8,611,603 0
  128   Green Cats  833 8,600,854 12,682
```

Lets's cracking!!