アマゾンの書籍データベースにphpでアクセスしてみた

September 30, 2008 – 10:37 pm

php、MySQLの学習の一環として、2週間ほど前に「蔵書管理システム」を試作した。当然のことながら、システムの作成はできても蔵書データの入力は大変だ。1000冊程度まではデータを入力したものの、この先、このあたりをどうするか考えなければならない。いろいろ調べてみると、AmazonのDBからISBNを与えると書籍データが、容易に、取得できそうだ。実際に試してみた。

AmazonのDB公開サービス: 書籍データの取得が可能なサービス、Amazon Associates Web Servicesと呼ばれている。データ取得のためのAPIについて、詳細なテクニカルドキュメントが公開されている

このサービス、基本的には、Amazon製品を販売する(言い換えるとAmazonの「小売店」として)Webサイトを構築する際に利用できるサポートと言える。このWebサービスを通じて、さまざまの商品情報を「小売店」が取得可能というわけだ。誰でも、Amazonの「小売店」登録さえすれば、書籍に限らず、Amazonで扱っている商品情報を全て取得できる。(この説明、少し単純化している。詳しくは、Amazonのサイトで確認を・・・・。)

Amazon DBにアクセスする手順: 私自身がAmazonDBにアクセスした手順をまとめると、次のようになる:

  • AWS Access Key Id の登録・取得(AmazonDBにアクセスするために必須)
  • REST APIを通じて商品(書籍)情報をXML形式でAmaozonのECSサイトから取得
  • XMLデータをパースしアプリケーションからの読み取り

AWS Access Key Id の登録・取得: AmazonWebサイトからIDを即座に登録することができる。登録すると、時間をおかず登録したメールアドレス宛にIDが送られてくる。実に簡単だ。このAWS Access Key Idは、Amazon Web Serviceを利用を可能にするものである。アマゾン商品を扱うWebサイトを開設する場合には、Amazon Associate Idも取得しておくことが必要だ。これで、上で述べたAmazonの「小売店」登録が完了するわけだ。

REST APIを通じたデータの取得: Amazon Web Serviceは、RESTとSOAPの両方をサポートしている。私自身、SOAPについては何の知識をもっていない。以下、REST APIを通じたデータの取得方法について説明しよう。

まず、本題に入る前に、REST(Representational State Transfer)とは何かというところについて記述することが必要だろう。このあたりの説明、「PerlでWeb APIを使いたおす 第4回アーキテクチャスタイル『REST』とは何か」を参照させてもらった。この解説記事によると、

RESTとはREpresentational State Transfer の略で、Web APIの仕様を決めるうえでのアーキテクチャスタイル、つまり基本的な考え方ということができる。RESTの本来の意味は、リソース(ここでは、ブログ記事、アップロードした写真、WEBページ全体のコンテンツなどのひとかたまりの情報)を扱うための考え方で、夫々のリソースに固有のURIを持たせ、これらURIにアクセスすることでリソースをHTTPの「操作」する。
AmazonECS(など)においてRESTというとき、これを、単に、HTTPとXMLを利用してリソースの操作を行うもとのとし、「全てのパラメータをURLに含めてGETメソッドで呼び出しを行い、結果を独自仕様のXMLデータとして返す」。ここでは、GETメソッドがHTTPの本来の定義では、本来、リソースに変化を加えないものとされているが、AmazonECSでは、ショッピングカートの内容の変更などもこのGETメソッドを利用して行う。(以上の記述、私の理解に基づいて、若干、編集している。正確な表現は、参照記事を、直接、見て頂きたい)

となっている。要は、このサービス、HTTPの形式に沿って、要求に応じたXMLデータを取得可能な形式になっていると理解していいと思う。

説明のなかで「全てのパラメータをURLに含めてGETメソッドで呼び出す」と述べられている。この記述、Amazonの該当するサイトのURL(日本の場合、ecs.amazonaws.jp/onca/xml)に、情報取得のために必要なパラメータ値をクエリーストリングスとして加えることにより、求める情報がXMLデータとして返されるという理解でいいだろう。

情報取得のために必要なパラメータは、Amazonの扱う商品が厖大な種類におよぶこともあって、非常に複雑な構成になっている。詳細なパラメータの記述方法は、Amazonの技術ドキュメントから得ることができる。

XMLデータ取得の具体例: 具体的に書籍データの取得がどのように行われるか、私の本棚にあった書籍リチャード・ドーキンスの「盲目の時計職人」(ISBN:4152085576)を例に、みてみよう。

まず、Amazon ECS へのURLとパラメータからなるクエリーストリングスを以下のようにする:

     http://ecs.amazonaws.jp/onca/xml?
                   Service=AWSECommerceService&
                   AWSAccessKeyId=xxxxxxxxxxxx&
                   Version=2008-08-19&
                   Operation=ItemLookup&
                   SearchIndex=Books&
                   IdType=ISBN&
                   ItemId=4152085576&
                   ResponseGroup=Medium,Offeres&
                   ItemPage=1
        

これをブラウザのURLボックスに入力すると(注:改行せず、またスペースをいれてはいけない)、XMLデータが返されてくる。返されたデータは、ブラウザ画面上に表示される。ブラウザ上に現れたXMLデータを書籍データの主要な部分のみに限定(多くの部分は省略)して示すと以下のようなものだ。XMLデータの全体は、是非、自らAWSAccessKeyId取得することにより確認してほしい。

<?xml version="1.0" ?>
<ItemLookupResponse xmlns=”http://webserices. ----- >
<Items>
<Item>
     <ASIN>4152085576</ASIN>
<MediumImage>
   <URL>http://ecx.images-amazon.com/images/I/51TRM5TEPAL._SL160_.jpg</URL>
        <Height Units="pixels">160</Height>
        <Width Units="pixels">108</Width>
       </MediumImage>
<ItemAttributes>
        <Author>リチャード・ドーキンス</Author>
        <Binding>単行本</Binding>
        <Creator Role="翻訳">日高 敏隆</Creator>
        <EAN>9784152085573</EAN>
        <ISBN>4152085576</ISBN>
        <Label>早川書房</Label>
        <PublicationDate>2004-03-24</PublicationDate>
        <Publisher>早川書房</Publisher>
        <Studio>早川書房</Studio>
        <Title>盲目の時計職人</Title>
      </ItemAttributes>
    </Item>
  </Items>
</ItemLookupResponse>
        

phpスクリプトの作成例: 上記したXMLデータの取得、著者名、出版社などを取得するための、phpスクリプトを書いてみた(php-5が必要)。なお、下記で用いている関数file_get_contents()は、php.iniの設定でURLをファイルとして取り扱うことを許可する必要がある(allow_url_fopen=on)。

<?php
     $request=”http://ecs.amazonaws.jp/onca/xml? ---(省略)---  “;
     $response = file_get_contents($request);
          // 関数file_get_contentsはURLストリング(変数:$request)を与えることにより
     // URL先の中身が文字列として返される。この場合、上記したブラウザ上に現れ
          // たXMLデータ(文字列)が返り値となる。
     $parsed_xml = simplexml_load_string($response);
      // 関数simplexml_load_stringにより、XML文字列はパースされ、これ以降、
      // 書籍データは、$pased_xml->Items->Item-> ・・・・ という形式でアクセス
      // することができる。

    $Image_URL  =$parsed_xml->Items->Item->MediumImage->URL;
    $Title        = $parsed_xml->Items->Item->ItemAttributes->Title;
    $Author      = $parsed_xml->Items->Item->ItemAttributes->Author;
    $Creator      = $parsed_xml->Items->Item->ItemAttributes->Creator;
    $Creator_Role = $parsed_xml->Items->Item->ItemAttributes->Creator[‘Role’];
    $Publ_date   = $parsed_xml->Items->Item->ItemAttributes->PublicationDate;
    $Publisher   = $parsed_xml->Items->Item->ItemAttributes->Publisher;
     echo $Title . "written by " . $Author . "\n";
     echo "              translated by " . $Creator . "/" . $Creator['Role'] . "\n";
     echo "              publised on " . $Publ_date . "\n";
?>
        

ここで示した例はphpで、簡単に、書籍データが取得できることを示したに過ぎない。より効果的なプログラミングを可能にするライブラリーパッケージもいろいろあるようだ(例:PEAR)。

実際にAmazonのデータベースにアクセスした印象。厖大なデータベースに無料でアクセスできるというのには驚きだ。単に、IBSNから書籍データを取得するというだけではもったいない。もっと有効な活用方法がある。それにしても凄いサービスだ。


  1. 6 Responses to “アマゾンの書籍データベースにphpでアクセスしてみた”

  2. XMLデータ取得の具体例にアクセスキーIDをいれてURLボックスに入力したのですが「Web ページが見つかりません」のメッセージが出るだけでリクエストが帰ってきません。どうしたらよいのでしょうか。ちなみにアクセスキーIDを消して入力すると以下のメッセージが出ます。図書利用システムを作ろうと思っています。よいアドバイスがあればよろしくお願いします。

    MissingClientTokenIdRequest must contain AWSAccessKeyId or X.509 certificate.c1869059-2d87-4d86-9b15-b255d426205f

    By 井上 輝昭 on Jun 25, 2013

  3. 愛読感謝。

    このエントリを書いたのは、ほぼ5年前で、それからアマゾンAPIの仕様がかなり変わりました。

    変更されたなかには、Requestに電子署名を必要にするなども含まれています。

    「蔵書管理システムとアマゾンAPI」について一連のエントリを「自宅サーバー構築・覚書リスト 」のなかにまとめていますので、変更のいきさつなどを見ていただければよろしいのでは、と思います。

    By yama on Jun 25, 2013

  1. 4 Trackback(s)

  2. Nov 16, 2008: アマゾンAPIを活用した蔵書管理システム(1) | Yama's Memorandum
  3. Jun 24, 2009: Amazon APIのRequestへの電子署名添付(PHP版) | Yama's Memorandum
  4. Oct 13, 2009: PHPのセキュリティを高めるための個人的メモ(補足) | Yama's Memorandum
  5. Oct 28, 2011: 自宅サーバー構築・覚書きリスト | Yama's Memorandum

Post a Comment