マーケットプレイスを携帯電話から検索するPerlスクリプトのAmazon ISBN検索を作成しました。Amazon Web Services3.0を利用して、検索商品の中古の出品価格3件分取得するプログラムです。
どういった場合に使うプログラムかというと、ブックオフなどの中古販売店に行ったときに処分価格で100円とか250円とかで安く売っている商品があると思います。その商品がAmazonマーケットプレイスで売れそうかどうかというのを調べるものです。マーケットプレイスで出品されていなければ売れるかもしれないですし、出品されている価格より安ければ売れる確立も高くなります。携帯から調べることによって手間を減らそうぜというプログラムのつもり。。
ようは安く仕入れて高くAmazonマーケットプレイスで売ってウハウハしようといったことかな。俺は面倒だからやってへんけど。。。
現在検索できる商品は、本、CD、DVDになります。商品名からの検索ではなくて商品コードからの検索です。本はISBNコードより。本の裏にISBN4-06-334404-5といったコードが印刷されていると思います。このコードを4063344045と入力します。
CD・DVDもコードがあります。なんていうコードか分かりませんが裏にSRCS 8435といったコードが印刷してあります。このコードを入力してください。SRCS8435とすると検索できなかったり違う商品が検索されてしまうこともあるようなので、キチンとスペースで区切るかSRCS-8435ハイフンで区切るようにして下さい。2枚組みだとBVCR-9303-04てな感じで印刷されていますが、検索するときはBVCR-9303という感じで検索してください。
今のところはコードでしか検索できません。次はキーワード検索をつけてゲームも検索できるようにしたいなぁと思ってます。
一応ソースコードも公開していたりします。動作環境はPerl5.8。仕様モジュールはEncode、LWP::Simple、CGIなどです。動作確認はActive Perl5.8+AN HTTPの環境とXREAのS101鯖です。
#!/usr/bin/perl
# Amazon 本&CDマーケットプレイス検索
# 正規表現使用版
# 2005/02/05 - 101@asano [kani_san@hotmail.com]
use strict;
use warnings;
use Encode;
use LWP::Simple;
use CGI;
$CGI::POST_MAX=1024 * 1; # max 1K posts
$CGI::DISABLE_UPLOADS = 1; # no uploads
our $devt = 'デベロッパトークン';
our $t = 'アソシエイトID';
my (%FORM, @items);
&form_decode;
&get_xml if ($FORM{ISBN});
&output;
exit;
sub form_decode {
my $q = CGI->new;
$FORM{ISBN} = $q->param('ISBN');
if (defined $FORM{ISBN}) {
if (!($FORM{ISBN} =~ /\w/)) {
print "Content-type: text/html\n\n";
print "入力エラー";
exit;
}
}
$FORM{mode} = $q->param('mode');
}
sub get_xml {
my $url = "";
if ($FORM{mode} eq 'Book') {
$url = "http://xml-jp.amznxslt.com/onca/xml3?dev-t=".$devt."&AsinSearch=".$FORM{ISBN}."&t=".$t."&type=heavy&offer=All&locale=jp&f=xml";
} elsif ($FORM{mode} eq 'CD') {
$url = "http://xml-jp.amznxslt.com/onca/xml3?dev-t=".$devt."&KeywordSearch=".$FORM{ISBN}."&t=".$t."&mode=music-jp&type=heavy&offer=All&locale=jp&f=xml";
} elsif ($FORM{mode} eq 'DVD') {
$url = "http://xml-jp.amznxslt.com/onca/xml3?dev-t=".$devt."&KeywordSearch=".$FORM{ISBN}."&t=".$t."&mode=dvd-jp&type=heavy&offer=All&locale=jp&f=xml";
}
my $xml = get($url);
$xml = Encode::decode("utf8", $xml);
$xml = Encode::encode("shift_jis", $xml);
@items = split/<Details\s/, $xml;
if (scalar @items eq "1") {
print "Content-type: text/html\n\n";
print "商品が見つかりません";
exit;
}
shift @items;
}
sub output {
&output_HEADER;
&search_list if ($FORM{ISBN});
&output_FOOTER;
}
sub search_list {
my $item = $items[0];
my ($title, $ISBN, $useCnt, $Availability) = ("", "", "0", "");
$title = $1 if ($item =~ /<ProductName>(.*)<\/ProductName>/);
$ISBN = $1 if ($item =~ /<Isbn>(.*)<\/Isbn>/);
$useCnt = $1 if ($item =~ /<UsedCount>(.*)<\/UsedCount>/);
$Availability = $1 if ($item =~ /<Availability>(.*)<\/Availability>/);
my $offer = &get_offer($item);
&output_HTML($ISBN, $title, $Availability, $offer, $useCnt);
}
sub get_offer {
my $item = shift;
my $tmp = "";
my @tmp_items = ();
@tmp_items = split/<ThirdPartyProductDetails/, $item;
shift @tmp_items;
foreach my $tmp_item (@tmp_items) {
my ($cond, $OfferType, $Condition, $OfferPrice) = ('', '', '', '');
$OfferType = $1 if ($tmp_item =~ /<OfferingType>(.*)<\/OfferingType>/);
$Condition = $1 if ($tmp_item =~ /<Condition>(.*)<\/Condition>/);
$OfferPrice = $1 if ($tmp_item =~ /<OfferingPrice>(.*)<\/OfferingPrice>/);
if ($tmp_item =~ /<SellerNickname>(.*)<\/SellerNickname>/) {
$OfferType = "Amazon" if $1 eq "";
}
if ($OfferType eq 'new') {
$cond = '新品';
} else {
if ($Condition eq 'mint') { $cond = 'ほぼ新品'; }
if ($Condition eq 'verygood') { $cond = '非常に良い'; }
if ($Condition eq 'good') { $cond = '良い'; }
if ($Condition eq 'acceptable') { $cond = '可'; }
}
$tmp .= "$OfferType: $OfferPrice $cond<br>\n";
}
$tmp;
}
sub output_HEADER {
print "Content-type: text/html\n\n";
print qq(<html lang="ja"><head><meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />);
print qq(<title>Amazon ISBN検索</title></head><body>);
}
sub output_FOOTER {
print qq(<form action="./search.cgi" method="get"><input type="text" name="ISBN" value="" size="11"><br>);
print qq(<input type="radio" name="mode" value="Book" checked="checked">本<input type="radio" name="mode" value="CD">CD<input type="radio" name="mode" value="DVD">DVD<br>);
print qq(<input type="submit" value="検索"><br></form></body></html>);
}
sub output_HTML {
my ($ISBN, $title, $Availability, $offer, $useCnt) = @_;
printf qq(%s<br>[%s]<br><br>USED件数: %s<br>%s<br>),
$title,$Availability,$useCnt,$offer;
}
コピペしてShift_JISで保存してください。