電子署名添付のAmazon APIを用いた書籍検索ツール

August 14, 2009 – 5:55 pm

随分前になるが「アマゾン書籍DB検索をAjaxでやってみた」を書いた。ここで、アマゾンAPIを使って、ISBNを入力すると書籍データが出力される検索ツールを紹介しておいた。明日、8月15日からアマゾンAPIは電子署名を添付しないと動作しなくなる。ということで、この検索ツールも電子署名を添付したものに修正しておいた。このエントリーでは、修正版のソースを示しておいた。

ISBNからの書籍データの検索: 以前のエントリーと重複するが、ISBN値を(半角で)入力し、[Search]ボタンをクリックすると、該当する書籍のイメージとタイトル、著者などの書籍情報が出力される検索ツールを以下に掲げる。(たとえば、ISBN値として、4334751067を入力してみよう。



修正版のphpソース: 以下に、修正版のphpソース、SetBookByAmazon.phpを示す。動作に必要なJavaScriptなどについては「アマゾン書籍DB検索をAjaxでやってみた」を参照して欲しい。なお、SetBookByAmazon.phpには、電子署名添付に必要な二つの関数 canonical_Str()、get_Signature()が含まれている。これらの解説については、「アマゾンAPIの電子署名添付:日本語文字をURL-Encodeしておくことが必須」に記述している。

<?php
SetBookByAmazon($BookId,$BookCode ) {
     require_once("./Book.php");
     require_once("./Author.php");
     define('KEYID','Your Key-ID placed here');
     define('AssocTag','Your Associate-Tag placed here');
     $aws_host = "ecs.amazonaws.jp";
     $request = ''Service=AWSECommerceService'
     . '&AWSAccessKeyId='.KEYID.'&Operation=ItemLookup'
     . '&ResponseGroup=Large&Version=2008-08-19';
    $request    .= '&IdType=' . $BookCode . '&ItemId=' . $BookId;
    $request    .= "&Timestamp=" . str_replace('GMT','T',gmdate("Y-m-dTH:i:s")) . "Z";
    $request    = canonical_Str( $request );
    $signature = get_Signature( $request, $aws_host );
    $request = "http://" . $aws_host . "/onca/xml?" . $request . "&Signature=" . $signature;
    $response   = file_get_contents($request);
    $parsed_xml = simplexml_load_string($response);
// Get AWS 判定

    if( $IsValid != 'True' ) return -1;
//
    $Item       = $parsed_xml->Items->Item;
// Get Image URL
    $Image_URL  = $Item->MediumImage->URL;
// Get ASIN
    $ASIN       = $Item->ASIN;
// Get Book_Data
    $Attributes = $Item->ItemAttributes;
       $Binding      = $Attributes->Binding;
       $EAN          = $Attributes->EAN;
       $ISBN         = $Attributes->ISBN;
       $Pub_Date     = $Attributes->PublicationDate;
       $Price        = $Attributes->ListPrice->Amount;
       $Currency_cd  = $Attributes->ListPrice->CurrencyCode;
       $Publisher    = $Attributes->Publisher;
       $Title        = $Attributes->Title;
       $Pages        = $Attributes->NumberOfPages;
       if      ( strlen($Pub_Date) == 7 ) $Pub_Date=$Pub_Date . '-00';
       else if ( strlen($Pub_Date) == 4 ) $Pub_Date=$Pub_Date . '-00-00';
       else if ( strlen($Pub_Date) < 4  ) $Pub_Date='0000-00-00';

       $book = new Book();
       $book->setIsbn($ISBN);
       $book->setAsin($ASIN);
       $book->setEan($EAN);
       $book->setTitle($Title);
       $book->setImage_url($Image_URL);
       $book->setPubdate($Pub_Date);
       $book->setPrice($Price);
       $book->setPages($Pages);
       $book->setPublisher($Publisher);
       $book->setBinding($Binding);
       $book->setCurrency_cd($Currency_cd);
       $book->setPosition($BookId);

    $author_name = array();
    $ncr = 0;
    foreach( $Attributes->Author as $Author_name ) {
       $author_name[$ncr] = $Author_name;
     //   echo "author = " . $author . "\n";
       $ncr = $ncr + 1;
    }
    foreach( $Attributes->Creator as $Creator ) {
       $author_name[$ncr] = $Creator;
       $ncr = $ncr + 1;
    }

    $author_array = array();
    for ( $i=0; $i<sizeof($author_name); $i++ ) {
       $author->setAuthor($author_name[$i]);
       $author->setRole($author_name[$i]['Role']);
       $author_array[] = $author;
    }

    $return_arguments = array();
       $return_arguments[] = $book;
       $return_arguments[] = $author_array;

    return $return_arguments;
}

function canonical_Str( $request ) {
   $req_split = array();
   $req_split = split("&", $request);
   for( $i=0; $i

  1. 5 Responses to “電子署名添付のAmazon APIを用いた書籍検索ツール”

  2. 最近amazonAPIを使うことになって調べていたらこちらのページを見つけたものです。今回このISBNを使った書籍検索が自分が導入したいものとドンピシャしてさっそくコピペさせていただきました!PHP初心者なのですが自分なりに理解していたところ、Sample_ajax.phpで12行あたりの$book->getIsbn()など、$book->get~()関連からCall to a member function getIsbn()と関数が存在しないとエラーが出てしまいました。このサイトはyamaさんが自分のために書いているのであって質問するのはもってのほかですが、失礼を承知で聞ききます。できれば解答お願いしたいです。

    By tokumeisan on Mar 12, 2013

  3. 愛読感謝!

    コメント文からの想像だけですが、次のように考えます。

    Sample_ajax.phpにおいてSetBookByAmazon.phpを参照。さらに、このSetBookByAmazon.phpでは、Book.php、Author.phpを参照しています。
    参照されるBook.php、Author.phpが作られてない、あるいはうまく参照されていないのでは、と思います。

    当ブログのAmazonAPI関連のエントリを通してご覧になれば上記は理解できるのではと考えます。

    何分、ずいぶん前にコーディングしたこと、そして、エントリに書かれていることが断片的な情報であることなどで、読みにくくなっていると思います。全体像がわかるように、整理し直す必要があるのかもしれません。

    Good Luck!

    By yama on Mar 12, 2013

  4. 解答ありがとうございます!時間を割いてしまって本当に申し訳ないです。貰ったコメントをアドバイスに色々いじくってみたところamazonのxmlのURLが若干変わっていてうまく情報が引き出せていなかったみたいです。うまく動かせてよかったです!この素晴らしいプログラムから自分なりに変えていこうとおもいます。今回は本当にありがとうございました!これからもこのブログを楽しみに見させてもらいます!頑張ってください!

    By tokumeisan on Mar 12, 2013

  5. お役にたてて幸いです。

    By yama on Mar 12, 2013

  1. 1 Trackback(s)

  2. Oct 28, 2011: 自宅サーバー構築・覚書きリスト | Yama's Memorandum

Post a Comment