2004.10.11 (月)

Nintendo DSのAmazon予約開始を逃すな

Nintendo DS

Nintendo DSのソフトはどれも楽しそうですね。タッチパネルを使った面白さを存分に味あわせてくれそうです。値段も手頃ですし、かなりの人気になると予想されます。こうなると発売日に入手するのは難しそうです。Amazonで予約するにしても、予約を開始したらあっという間に品切れになりそう。

そこで、AmazonでNintendo DSが予約可能になったら、即座にメールで通知するスクリプトを書いてみました。まずはまっとうにAmazon Web Service (AWS)でやってみましょう。以前書いた方法を応用すればできるはずです。ところが、この方法だと次のように返ってきます。まだ予約可能じゃないのに予約可だなんて、あてにならない答えです。

  <Availability>近日発売 予約可</Availability>

しょうがないので、Webページを解析して判定する方法をとります。以下のスクリプトはとってもアドホックで汎用性はまるでありませんし、信頼性もありません。あくまで使い捨てスクリプトです。スクリプトの中身が理解できない人は実行しないでください。

#!/usr/bin/perl
my $usage = "usage: $0 ASIN-No mail-addresses";

use strict;
use LWP::UserAgent;
use Jcode;

# Amazon商品ページのURL
my $amazon_url = "http://www.amazon.co.jp/exec/obidos/ASIN/";

# HTTP用
my $proxy;  # proxyが必要な場合はここで設定

# コマンドのパス
my $sendmail = "/usr/lib/sendmail";
my $nkf      = "/usr/local/bin/nkf";

# 引数としてASIN、送信先アドレスを受け取る
die "$usage\n" if (@ARGV <= 1);
my $asin      = $ARGV[0];
my $recipient = $ARGV[1];

# 商品ページのURLを組み立てる
my $request_url = $amazon_url . $asin;

# HTTPでページを取得する
my $ua = LWP::UserAgent->new;
$ua->proxy('http', $proxy) if ($proxy); # proxyを設定
my $res = $ua->get($request_url);

# SJISで記述されているので、EUCに変換。
my $doc = Jcode->new($res->content,'sjis')->euc;

# タイトルを取得する
my $title;
if ($doc =~ m|<title>(.*?)</title>|is) {
    $title = $1;
}

# 予約注文可能かどうかを判定する
my $preorder = 0;
$preorder = 1 if ($doc =~ m/予約注文できます/);
$preorder = 1 if ($doc =~ m/pre-order-notched\.gif/);

# メールの内容
my $message = << "EOF";
Subject: Amazon予約可能通知
To: $recipient

$titleが予約可能です。
EOF

# 予約注文可能ならメッセージを表示する
if ($preorder) {
    # 1度だけ送るようにするため、/var/tmp/[ASIN]にファイルを作る
    my $filename = "/var/tmp/$asin";
    if (! -e $filename)  {
        # メール送信
        open F, "|$nkf|$sendmail $recipient";
        print F $message;
        print $message;
        close F;

        # 1度だけ送るようにするため、/var/tmp/[ASIN]にファイルを作る
        system("touch $filename");
    }
}

これをamazon-preorder.plという名前で保存して次のように起動すると、ASINのアイテムが予約可能であった場合に、指定したメールアドレスにメールを送信します。予約可能でなかった場合には何もしません。一度メールを送信したら、もう一度起動しても何もしません。

perl amazon-preorder.pl ASIN mail@address,k-tai@address

これをcrontabに入れて、適当な間隔で定期的に実行すると、予約可能になった時点でメールが来るというわけです。あまり頻繁に実行しないようにしましょう。また、用が済んだら手動でcrontabから削除し、/var/tmp にできたファイルを削除することを忘れないでください。

追記: ニンテンドー DS Lite の販売開始にも対応するように修正しました。

   

トラックバック(0)

トラックバックURL: http://blog.bibinko.com/mt-bin/mt-tb.cgi/333

コメントする

アーカイブ

Photo Calendar

最近のコメント

最近のトラックバック