Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

Amazon Web Servicesを使ってISBN-13からASINを取得するPHPプログラム


2007-01-23Perl版を書いていらっしゃったので、PEAR::Services_Amazon 0.7.0を使ってざっと作ってみました。ISBNの値以外、やっていることはPerl版と同じです。最後の表示部分がダメダメです(^^;が、「PEAR::Service_Amazonの使い方の簡単な例」ということで。一応、PHP4.4.4、5.2.0で動作します。

<?php
ini_set('mbstring.internal_encoding', 'utf-8');
ini_set('mbstring.script_encoding', 'utf-8');
error_reporting(E_ALL);

require_once 'Services/AmazonECS4.php';
define('ACCESS_KEY_ID', 'xxxxxxxxxxxxxxxxx');
define('ASSOC_ID', 'xxxxxxxxx');
?>
<?php
/**
 * 2009年8月15日以降、全てのリクエストに対して Secret Access Key を使った
 * 署名認証が必要になります
 * @see http://d.hatena.ne.jp/p4life/20090510/1241954889
 */
$service = new Services_AmazonECS4(ACCESS_KEY_ID, ASSOC_ID);
$service->setLocale('JP');
$service->setVersion('2007-01-17');

$id = '978-4798015163';
$options = array();
$options['IdType'] = 'ISBN';
$options['SearchIndex'] = 'Books';
$response = $service->ItemLookup(str_replace('-', '', $id), $options);

if (PEAR::isError($response)) {
    die('データの取得に失敗しました:' . $response->getMessage());
}
if (!isset($response['Item'][0])) {
    die('データがありません');
}
$item = $response['Item'][0];
?>
ISBN: <?php echo $id; ?><br>
ASIN: <?php echo $item['ASIN']; ?><br>
Title: <?php echo $item['ItemAttributes']['Title']; ?><br>
Author: <?php echo join(' ', $item['ItemAttributes']['Author']); ?>

「簡単だろう」とタカをくくっていましたが、2007-01-23で使われているAPIのバージョンがPEAR::Services_Amasonと異なっていたため、setVersionメソッドを使ってバージョンを変更しないとIdTypeに'ISBN'を指定できませんでした。PEAR::Services_Amason 0.7.0のデフォルトは「2005-10-05」です。使っているAPIについてはhttp://developer.amazonwebservices.com/connect/entry.jspa?externalID=614&categoryID=19を当たってください。
あと、ISBN-13に指定する値は「ハイフン抜き」でないとダメです。今回はstr_replace関数で置換してます。これにしばらく悩んだことは秘密です ;-)

追記(2009/06/17 12:20)

2009年8月15日以降、全てのリクエストに対して Secret Access Key を使った署名認証が必要になります。


名称変更にともない、Product Advertising API にリクエストを送信いただく都度、認証のための電子署名を含めていただくことが必要になります。この変更は、2009年5月11日より3ヶ月の間の移行期間の後、2009年8月15日には、Product Advertising API へ送信されるリクエストは全て認証されることとなり、認証されない場合、リクエストは処理されなくなります。

これの対応については、id:p4lifeさんのエントリが非常に参考になります。