読者です 読者をやめる 読者になる 読者になる

本の情報をISBNを使ってアマゾンから取得する方法


アマゾンで本の情報をISBNを使って取得する方法の紹介です。
先日画像からISBNの検出を行いましたが、今回はそのISBNコードを使用して、実際のアイテム情報をアマゾンから取得します。

ソースコードはこちら

下記ページのRubyで書かれたものをPHPに書きなおした感じです。
Amazon Product Advertising APIでISBN検索してみた - idesaku blog
index.php

<?php
//パラメータ amazon web service よりAPIKEYを取得しておきます
define(AWS_ACCESS_KEY_ID,     'XXXXXXXXXXXXXXXXXXXX');
define(AWS_SECRET_ACCESS_KEY, 'XXXXXXXXXXXXXXXXXXXX');
define(AWS_REQUEST_DOMAIN,    'webservices.amazon.co.jp');
define(AWS_REQUEST_PATH,      '/onca/xml');
//ISBN13⇒10の変換
$isbn10 = ISBNTran( 9784777515783 );
//投げる変数類設定
$request_param = array(
                       'Service'        => 'AWSECommerceService' ,
                       'AWSAccessKeyId' => AWS_ACCESS_KEY_ID     ,
                       'Operation'      => 'ItemLookup'          ,
                       'ItemId'         => $isbn10               ,
                       'IdType'         => 'ISBN'                ,
                       'SearchIndex'    => "Books"               ,
                       'Timestamp'      => date('Y-m-d'). 'T'. date('H:i:s'). 'Z',
                       'ResponseGroup'  => 'Small'
                       );
//クエリをURLエンコードして、変数名でソート
$request_param = array_map ('rawurlencode', $request_param);
ksort($request_param);
//1行のクエリに加工
$request_queries = array();
foreach ($request_param as $k => $v){
    $request_queries[] = "{$k}={$v}";
}
$request_query = implode('&', $request_queries);
//Signatureの作成
$aws_signature_base  = "GET\n";
$aws_signature_base .= AWS_REQUEST_DOMAIN. "\n";
$aws_signature_base .= AWS_REQUEST_PATH. "\n";
$aws_signature_base .= $request_query;
$aws_signature = urlencode(base64_encode(hash_hmac('sha256', $aws_signature_base, AWS_SECRET_ACCESS_KEY, TRUE)));
//リクエストURLの作成
$aws_signed_url = 'http://'. AWS_REQUEST_DOMAIN. AWS_REQUEST_PATH. "?{$request_query}&Signature={$aws_signature}";
//アマゾンへリクエスト
header ("Content-Type: text/xml; charset=UTF-8");
echo file_get_contents( $aws_signed_url );
exit;
?>

ISBN13⇒10の変換は「太のうぇぶでぶ » Blog Archive » PHPでISBN13とISBN10の相互変換をする。」を使用させていただきました。

function ISBNTran ($ISBN) {
    if (strlen($ISBN) == 10) {
        //ISBN10からISBN13への変換
        $ISBNtmp = "978" . $ISBN;
        $sum = 0;
        for ($i = 0; $i < 12; $i++) {
            $weight = ($i % 2 == 0 ? 1 : 3);
            $sum += (int)substr($ISBNtmp, $i, 1) * (int)$weight;
        }
        //チェックディジットの計算
        $checkDgt = (10 - $sum % 10) == 10 ? 0 : (10 - $sum % 10);
        return "978" . substr($ISBN, 0, 9) . $checkDgt;
    } elseif (strlen($ISBN) == 13) {
        //ISBN13からISBN10への変換
        $ISBNtmp = substr($ISBN, 3, 9);
        $weight = 10;
        $sum = 0;
        for ($i = 0; $i < 9; $i++) {
            $sum += (int)substr($ISBNtmp, $i, 1) * $weight;
            $weight--;
        }
        //チェックディジットの計算
        if ((11 - $sum % 11) == 11) {
            $checkDgt = 0;
        } elseif ((11 - $sum % 11) == 10) {
            $checkDgt = "X";
        } else {
            $checkDgt = (11 - $sum % 11);
        }
        return substr($ISBN, 3, 9) . $checkDgt;
    }
}

解析

取得したxmlファイルの解析はpearの「XML/Unserializer.php」が大変便利です。
下記の様にしてインストールを行います。

$ pear channel-update pear.php.net
$ pear upgrade-all
$ pear install -f XML_Serializer

使い方は以下を参照してくださいませ。
PHPを便利にする10個のPEARライブラリ - PHP,MySQL,Flexな日々+イラストとか
xmlを配列に変換できますので、あとはMySQLと連携したり、電子書籍化したPDFファイルをフォルダ管理したりできるかと思います。

参考書

PHPによるWebアプリケーションスーパーサンプル活用編 第2版

PHPによるWebアプリケーションスーパーサンプル活用編 第2版

いろいろなサービスを試すことができます。