宮川達彦、 伊藤直也 著 『Blog Hacks - プロが教えるテクニック & ツール100選』 に寄稿した記事の元の原稿です。
要約: asamasid というツールを使って Amazon アソシエイトの紹介料と Google AdSense の広告収入のレポートを毎日メールでチェックします。
Amazon のアソシエイトプログラム
*1
や
Google の AdSense プログラム
*2
に参加しているブログが増えてきています。
本ハックでは、これらの収入レポートを毎
日メールで送ってくれるツール
asamasid
を紹介します。
asamasid とは
asamasid は Amazon アソシエイトと Google AdSense のレポー トを毎日メールで送ってくるツールです。本書の著者の一人であ る宮川達彦が ブログに載せたコード が元となっています。
Amazon アソシエイト用には今期の売上合計と前日に売れた品物が レポートとして送られてきます。Google AdSense 用には最近一週 間の広告料と、これまでの総計がレポートして送られてきます。
Amazon 用レポートメールの例
Traffic by Item - Orders Report From Date 2004/04/01 To Date 2004/04/01 トラッキンングID Item Name ASIN Product Edition Items Ordered your-associate-id Blog Hacks 4873111749 本 Other 1 Earnings Summary Report From Date 2004/04/01 To Date 2004/04/01 トラッキンングID Items Dispatched Dispatched Items Revenue Your Referral Fees Total Earnings your-associate-id 1 ¥2,800 ¥140 ¥140(このレポートは架空のものです)
AdSense 用レポートメールの例
2004年4月1日 (月曜日) - 2004年4月7日 (水曜日) 平均値 1,000,000 10,000 $10,000.00 合計 7,000,000 70,000 1.0% $70,000.00 2004年4月7日 (水曜日) 1,000,000 10,000 1.0% $10,000.00 2004年4月6日 (火曜日) 1,000,000 10,000 1.0% $10,000.00 2004年4月5日 (月曜日) 1,000,000 10,000 1.0% $10,000.00 2004年4月4日 (日曜日) 1,000,000 10,000 1.0% $10,000.00 2004年4月3日 (土曜日) 1,000,000 10,000 1.0% $10,000.00 2004年4月2日 (金曜日) 1,000,000 10,000 1.0% $10,000.00 2004年4月1日 (木曜日) 1,000,000 10,000 1.0% $10,000.00(このレポートは架空のものです)
asamasid の使い方
まず Perl 5.8.0 以上が必要です。また、追加のライブラリとして MIME::Lite, WWW::Mechanize, Crypt::SSLeay, Term::ReadPassword が必要です。これらは perl -MCPAN -eshell でそれぞれインストールするといいでしょう。 asamasid の動作確認は Red Hat Linux 9 上で行っていますが、 Unix系ならば他のOSでも動くと思います。常駐化する際に /dev/null を開くため、Windows では当該部分のコードをコメント アウトする必要があるかもしれません。
asamasid を Amazon アソシエイト用に起動するには次のように実行します。
% asamasid --amazon
すると、メールアドレスとパスワードを訊いてくるので、それぞれ Amazon アソシエイトに登録しているものを入力します。
email: your-account@example.com passowrd:
その後、asamasid はバックグラウンドのプロセスと常駐して、さ きほど入力したメールアドレスにレポートのメールを定期的に送り はじめます。 レポートのメールは起動時に1通送られ、あとは Amazon アソシエイト用は毎朝8時、Google AdSense 用は毎夕 20時に送ら れます。それぞれのレポートの集計時刻に合わせたためです。
Google AdSense 用に起動するときは --amazon の代わりに --adsense を指定します。 amazon と adsense で共通のメールアドレス、パスワードを使っ ている場合は次のように起動することができます。
% asamasid --amazon --adsense
Amazon アソシエイトと Google AdSense で異なるメールアドレス あるいはパスワードを使っている場合は
% asamasid --amazon % asamasid --adsense
のように別々に起動します。
asamasid の仕組み
追記: この部分の記述は若干古くなっています。 最近の asamasid では Perl のオブジェクト指向の機能を使って、 コードが整理されています。
asamasid は WWW::Mechanize という Perl モジュールを用いて、 Webサイトからのレポートの収集を自動化しています。下のコード は www.amazon.co.jp のアソシエイトプログラムにログインして、 レポートセンターへアクセスするためのものです。 WWW::Mechanize の使い方は 参考文献 に詳しく解説されています。
sub amazon_go_to_report_page {
my ($email, $password) = @_;
dprint("amazon_go_to_report_page");
my $mech = WWW::Mechanize->new();
$mech->agent_alias('Windows IE 6');
my $start = "http://www.amazon.co.jp/";
$mech->get($start);
safe_follow_link($mech, qr/associates\.html/);
safe_follow_link($mech, qr!panama/associates/resources!);
$mech->form_number(1);
$mech->field(login_id => $email);
$mech->field(login_password => $password);
$mech->click();
safe_follow_link($mech, qr!/resources/reporting/reports.html!);
return $mech;
}
レポートの送信は下のような無限ループで行っています。 引数の $send_report_func という変数で渡された関数を &$send_report_func で呼び出してメールの送信を行い、 calc_interval 関数で次のメール送信時刻までの秒数を計算して、 sleep します。$send_report_func 変数には amazon_send_report または adsense_send_report 関数への参照が渡されます。
sub reporter {
my ($email, $password, $report_time, $send_report_func) = @_;
while (1) {
eval { &$send_report_func($email, $password) }; # to capture errors
dprint($@) if $@;
my $interval = calc_interval($report_time);
sleep($interval);
}
}
main 関数の中では reporter 関数を次のように、Amazon アソシエ イト用のレポートを送信するスレッドとGoogle AdSense 用のレポー トを送信するスレッドに分けて呼び出しています。これにより、そ れぞれのレポートを異なった送信時刻に非同期で送信する処理を実 現しています。
sub main {
...
be_daemon() unless $DEBUG;
if ($amazon) {
threads->new(\&reporter, $email, $password,
$AMAZON_REPORT_TIME, \&amazon_send_report);
}
if ($adsense) {
threads->new(\&reporter, $email, $password,
$ADSENSE_REPORT_TIME, \&adsense_send_report);
}
sleep; # メインスレッドは永遠に sleep
...
}
わざわざマルチスレッドにするまでもない処理ではありますが、あえ て無駄にスレッドを使うところが本ハックの味噌です。
遊びのために新しい技術を覚えておくと、後でまじめな場面で役立 つときがあります。
Hacking the Hack
asamasid の名前は「ブログであさましく収入を得る」という揶揄 から由来しています。しかし、広辞苑第5版で「あさましい」を引 いてみると
あさまし・い【浅ましい】
【形】あさま・し(シク)
(動詞アサムの形容詞形。意外なことに驚く意が原義で、善いときにも悪いときにも用いる)
1. 意外である。驚くべきさまである。竹取物語「取りがたき物をかく―・しくもてきたることをねたく思ひ」。源氏物語桐壺「かかる人も世に出でおはするものなりけりと、―・しきまで目を驚かし給ふ」
2. 興ざめである。あまりのことにあきれる。枕草子97「―・しきもの、さし櫛すりて磨く程に、ものにつきさへて折りたる心地」
3. (あきれるほど)甚だしい。今昔物語集23「大学の衆は―・しく力ある者かな」
4. なさけない。みじめである。見苦しい。徒然草「もののあはれも知らずなりゆくなん―・しき」。「―・い姿になり果てる」
5. さもしい。心がいやしい。「根性が―・い」
とあり、最初の意味は「意外である。驚くべきさまである」でるこ とがわかりました。ということは、「ブログであさましく収入を得 る」というのは「ブログで (意外な驚くべきやり方で) 収入を得る」 という意味と解釈してもいいかもしれません (?)。
参考文献
- Kevin Hemenway: Spidering Hacks, オライリー・ジャパン, 2004.
脚注
*1
Amazon の商品を紹介することで紹介料を得るプログラム
*2
Google が提供するサイトの内容に適した広告を掲載することで広告料を得るプログラム