2004.05.30 (日)

Amazonリンク生成スクリプト

Perlの勉強もしたことだし、何か作ってみようということで、amazonのアフィリエイトリンクを生成するプログラムを書いてみた。同様のものは多くの人が作っているので今さら新しくはないのだが、勉強がてらに自分でやってみる。

Amazon Web Service(AWS)を使うとプログラムからamazonの検索機能を呼び出すことができる。試しにやってみるなら、プログラムを書かなくてもこんなフォームを書けば呼び出すことができる。

<form action="http://xml.amazon.co.jp/onca/xml3"
  method="GET" name="aws">
  ISBN:
  <input type="text" name="AsinSearch" value=""/>

  <input type="hidden" name="dev-t" value="デベロッパ・トークン"/>
  <input type="hidden" name="t" value="アソシエイトID"/>
  <input type="hidden" name="f" value="xml"/>
  <input type="hidden" name="locale" value="jp"/>
  <input type="hidden" name="type" value="lite"/>
  <input value="送信" type="submit"/>
</form>

これはISBN番号を入力して呼び出すと、書籍の情報が帰ってくるというものだ。ISBN番号は書籍の裏表紙に定価の近くあたりに「ISBN4-XXXX-XXXX-X」と記してある番号のことだ。4以降の数字を4も含めて、ハイフンを抜いて入力すればよい。自分への覚書として下のフォームで呼び出せるようにしておいた。手元にある本のISBN番号を入力して試してみるとよい。

ISBN:

このフォームを送信して返ってくるのは、XML形式で書籍情報を表したものだ。タグの羅列に埋め込まれるように書籍の題名や著者名が並んでいる。URLはこんな感じになっている。

http://xml.amazon.co.jp/onca/xml3?dev-t=デベロッパ・トークン&t=アソシエイトID&f=xml&AsinSearch=ISBN番号&locale=jp&type=lite

こういうURLを生成して呼び出せば、XML形式で書籍の情報が返ってくるということだ。これがRESTと呼ばれる呼び出し方法の基本的なしくみだ。AWSではRESTの他にSOAPという方式で呼び出すこともできるのだが、この程度の使い方には冗長過ぎる方式かもしれない。それに、SOAPでは文字コード周りで少々工夫が必要らしい。

では、このURLをperlで生成しよう。これは簡単だ。

sub amazon_query_url_isbn {
    my $isbn = shift;

    "$amazon_query_url?"
    . "dev-t=$amazon_dev_token&"
    . "t=$amazon_affiliate_id&"
    . "f=xml&"
    . "locale=jp&"
    . "type=lite&"
    . "AsinSearch=$isbn";
}

これを呼び出して結果を受け取るには、LWP::Simpleを使ってこうやればよい。

use LWP::Simple;
my $xml = get(amazon_query_url_isbn($isbn));

さて、帰ってきたXML形式の情報は、XML::Simpleを使って分解してみよう。

use XML::Simple;
my $tree = XMLin($xml, ForceArray=>1, KeyAttr=>[]);
my $book = $tree->{"Details"}->[0];

XMLがperlのハッシュと配列でツリー状に展開される。データ構造としては非常に複雑だが、それこそこの本で勉強したかいがあるというものだ。ここから個々の情報を取り出すにはこんなふうにすればよい。

sub getValue {
    my ($tree,  $tag) = @_;
    return join(', ', @{$tree->{$tag}});
}

要素が複数個ある場合には「,」で繋げて並べるようにしている。著者名は階層が1段深いので下記のようにする。書籍ではなくCDやDVDの場合にも使えるようにしてみた。

sub getAuthors {
    my $detail = shift;
    if ($detail->{"Authors"} != undef) {
        return getValue($detail->{"Authors"}->[0], "Author");
    } elsif ($detail->{"Artists"} != undef) {
        return getValue($detail->{"Artists"}->[0], "Artist");
    } else {
        return ;
    }
}

これらを使うと、個々の書籍情報はこんなふうに取り出せる。

my $title        = getValue  ($book, "ProductName");
my $author       = getAuthors($book, "Author");
my $manufacturer = getValue  ($book, "Manufacturer");
my $imageUrl     = getValue  ($book, "ImageUrlMedium");
my $price        = getValue  ($book, "OurPrice");
my $asin         = getValue  ($book, "Asin");
my $releaseDate  = getValue  ($book, "ReleaseDate");
my $imageUrl     = getValue  ($book, "ImageUrlMedium");

あとは、これを好きなように加工して使えばよい。アソシエイトID付きのリンク付き書籍情報として表示してみる。下のフォームから呼び出せるようにしておいた。手元の書籍のISBN番号を入力してみるとよい。

ISBN:

表示されたHTMLタグをblogなり、webページなりにコピー&ペーストすれば画像付きアソシエイトリンクのできあがりだ。さっそく作ってみたのがこれだ。

Amazon Hacks 世界最大のショッピングサイト完全活用テクニック100選
ポール・ボシュ, 篠原 稔和, ウェブ・ユーザビリティ研究会


オライリー・ジャパン (2004/04/24)
¥ 3,045
ISBN: 4873111811

フォームにいちいちISBN番号を入力するのは面倒くさい。そこで、javascriptで自動化してみよう。amazonの商品ページを開いている状態で上記フォームを呼び出すスクリプトはこうなる。

javascript:var%20id='アソシエイトID';var%20u=document.location.href;var%20i=u.indexOf('ASIN');var%20asin=u.substring(i+5,i+15);void(window.open('http://blog.bibinko.com/cgi-bin/amazon-isbn.cgi?asin='+asin+'&t='+id))

このスクリプトを実行するには、まずこのAmazonリンク作成リンクを、リンクバーにドラグ&ドロップする。そして、Amazonの商品ページを開いた状態でリンクバーからこのリンクを呼び出すとフォームを送信するのと同じ処理が実行される。こういうスクリプトをbookmarkletと呼ぶらしい。リンクのプロパティを開くと、URLのところにスクリプト本体が入っている。先頭の方にアソシエイトIDが入っているので、自分のIDに修正して使えばよい。

AWSでは、XSLTというXMLの処理系を使うことができ、Perlなどでプログラムを書かなくても同じことができる。XSLTでXMLからHTMLへの変換規則を記述し、そのファイルのURLをAWS呼び出し時に渡しておけばよいのだ。この方法もそのうち勉強がてら試して見よう。

Amazonのアソシエイトプログラムでは、リンク作成のページで商品へのリンクを作成することができる。そのページの中で、イメージのコピーもできるようになっている。画像をローカルにコピーしてしまえば、amazon側の負荷を減らせるのでできればコピーしてしまいたい。ところが、 Amazon.comWebサービス 使用許諾条件には下記のように記述されている。

Amazon.comWebサービス 使用許諾条件

貴方は、24 時間までの間、貯蔵(キャッシュ)目的でAmazon.com の知的財産を格納することができます。

AWSを使ったサービスでは画像を24時間までしかローカルに保持できないのだ。これでは画像どころか、書名や著者名さえもローカルに保持することができなくなってしまう。これに関しては次のように考えることにした。AWSによる書籍情報表示サービスと、それを活用してアフィリエイトリンクを提示することをそれぞれ独立な行為と考えるのだ。前者は情報をその場で表示するだけで、保持し続けることはない。後者では前者で得た情報をアフィリエイトリンク作成のために使用する。実際、前者と後者は別な人が提供することができるので、分離して考えることは合理的であろう。その意味でも、blogのエントリまで自動生成したりせず人手によるコピー&ペーストを介しておくのがよさそうだ。

それでは、この考え方で画像もコピーできるのだろうか。前述のリンク作成のページでのイメージコピーのところでは、商品によって商品の画像が提示されるものとされないものとがある。いくつか試してみたところでは、書籍では提示されず、CDやDVDでは提示されるようだ。wadさんによると和書とXbox本体以外に関してはamazonがアソシエイト先に画像をサブライセンスする権利を持っているらしい。

wad's更新記録

amazon.co.jpに問い合わせたところ、「和書およびXbox本体」以外の画像については、アソシエイトが自分のサイト上で自由に表示できるという答えをもらいました。 これ以降の記述には、私の解釈が入っている部分があります。 「和書およびXbox本体」以外の取り扱い品目については、amazonは、アソシエイトに画像の使用をサブライセンスするライセンスを、それらの画像の著作権者から得ているということです。また、amazonのサイト上にある「画像ファイル」そのものは、amazonが作成したか使用許諾を受けたものなので、amazonのサイトからコピーして使っても問題はありません。 「和書およびXbox本体」の商品については、各発売元の許諾を得る必要があります。実際、amazon.co.jpのリンク・ジェネレータでは、和書とXbox本体については、イメージ・リンクに使用する画像として、「Amazon.co.jpで買える」というジェネリックな画像が表示されます(すべて調べたわけではありませんが)。

今現在でもこの条件のままだとすると、洋書やCD/DVDならイメージのコピーができるが、和書ではできないということになる。実際にコピーする際には、Amazonのリンク作成ページで確認するか、Amazonに条件を問い合わせてから行うべきだろう。

画像をコピーできるものに関しては、次のようなコードでコピーすることができる。

my $MTImagePath   = "画像ファイルの置き場所";
my $filename = $imageUrl;
$filename =~ s#.*/##;
my $path = $MTImagePath . "/" . $filename;
getstore($imageUrl, $path);

今のところコピー可能な画像かどうかを自動的に判別する方法がわからないので、前述の確認を行った上で使い分けるしかないだろう。今回作成したスクリプトからは、画像のコピー機能ははずしてある。コピーしなくとも、イメージを参照して自分のサイトに埋め込んで表示することはグレーゾーンだと思われる。世間ではこのような表示が普及しつつあるようなのでそれに従ってみるが、問題があるようならすぐにはずしたい。

ISBN番号での検索以外にもキーワード検索や著者名での検索などいろいろな検索ができる。そうした検索にも必要が出てきたら対応しよう。今のところAmazonのサイトで検索して、書籍情報をクリップしてこのサイトにアフィリエイトリンクを張る程度なのでこのスクリプトくらいで十分だ。できあがったPerlスクリプトをここに置いておく。デベロッパ・トークンのところを自分のものに修正すればそのまま使えるはずだ。自由に改変して使ってもらってかまわない。表示形式をなどを自分好みにカスタマイズするとよいだろう。

せっかく作ったので、過去のエントリのアフィリエイトリンクも作り直しておこうかな。

   

トラックバック(0)

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

コメント(1)

輸入版CDの時に画像が出なかったんで、輸入版CDでも画像を表示できるAmazonリンク生成スクリプトに修正版を載せました。

コメントする

アーカイブ

Photo Calendar

最近のコメント

Amazonリンク生成スクリプト
 └ 07.19  tama 輸入版CD

最近のトラックバック