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タグを除去する処理が入りますけれど。単純にテキスト化するとヘッダ、フッタ、ナビゲーションも入ってくるので、これらは除去しています。順位上下のマークが画像なのでその置換処理も入っていたり。
#!/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!!