Amazon Product Advertising APIが簡単に使えるようになっていて驚いた

Amazonアフィリエイトをしている人はもちろんのこと、そうでない人でもAmazonの膨大な商品情報にアクセスするために、Amazon Product Advertising APIを使っている人は多いと思うのです。

ぼくはAWSの時代から活用させて頂いていて、URLにパラメーター渡すだけで商品データベースが作れてしまうものだから、たいへん便利なものだなぁと感心しておりました。

その後、数年経ちAWSからProduct Advertising APIへ名称変更されたあたりだったでしょうか。URLにタイムスタンプとハッシュ値のSignatureを付けなければならなくなり、とたんにややこしくなりました。

わかってしまえばどうってことないんですけど、英語マニュアルしかありませんでしたし、サンプルも数少なかったので、よくわからないまま公開されているAmazon操作用のクラスライブラリとか使っていた記憶があります。

久しぶりにAPIが使いたくなった理由

最近外出が増えたせいか、モバイルバッテリーの利便性を感じています。それでちょっと新しいモバイルバッテリーに買い換えようかなぁと考えて、Amazon Product Advertising APIを触りはじめました。

お前は何を言っているんだ、普通にAmazonや楽天で検索すれば良いじゃないか、と言われればそのとおりです。でもなんかかゆいところに手が届かないんですよねえ。

今おすすめのモバイルバッテリー8選!2018年版!とかまとめているサイトもありますが、オススメが知りたいわけではなく、できればコダワリの条件で検索したい、みたいな。ほら、引っ越すときに駅近!バス・トイレ別!2部屋以上!とか条件付けるじゃないですか。

たかがモバイルバッテリーとはいえ、できるだけ薄く、軽く、かつ容量が多く、その中で一番安い、とか条件を付けて検索したくなりました。

要は価格ドットコムの検索システムですけど、あちらは有名メーカー製の商品ばかりで、ちょっとマイナーメーカーのモバイルバッテリーとかは掲載されていません。

ないなら作ろう、というのがプログラマー脳です。

そして結果的におすすめサイトのおすすめNo1を買うべきだったとわかったとしても、次に活かせるコーディングが出来たと思えば満足するのがプログラマーだと思っています。

公式サイトがすごい充実してた

それで過去にコーディングしたスクリプトはあるので、それをちょちょいと修正しておおよそ希望どおりに動くには動いたのですが、取れるデータが激減しているのが気になりました。

APIに渡しているVERSION番号のせいなのか、ほかのパラメーターのせいなのか、ちょっとわかりません。

なので、ここは公式サイトを眺めて、最近の作法を学びなおそうと思ったわけですが、なんかすごい便利になっていて驚きました。

Scratchpadっていう機能なんですけど、こんなの前からありましたっけ。

https://webservices.amazon.co.jp/paapi5/scratchpad/index.html

プログラムを組まなくてもScrathpadでテストができる

先ほどのURLで開いた先がこんなページなんですけど、
Amazon Product Advertising APIのScratchpad

Associate Tag、Access Key ID、Secret Access Keyを入力するだけでAPIのテストができちゃうんです。

Scratchpadでパラメータの確認もXMLの確認もできる

先ほどのAssociate Tag、Access Key ID、Secret Access Keyの3つを入力した後、SearchindexにElectronics(電化製品)を選び、BrowseNodeに2544551051を入力しました。BrowseNodeは要するに商品のカテゴリ番号で、2544551051はモバイルバッテリーを意味します。

普通にAmazonのページで買い物をしているとURLにnode=9999999999と10桁の番号が入っているので、カテゴリ番号はお買い物しながら調べるのが簡単です。

そして、[Run Request]ボタンをクリックするとこのとおり。

Amazon Product Advertising APIのScratchpad

入力した条件どおり、モバイルバッテリーの一覧が取得できました。

条件欄にはResponseGroupの設定や、Sortパラメーターもありますから、売り上げ順や発売日順で取るのも自由自在。

[XML response]のタブをクリックするとこのとおりXMLも確認できます。

Amazon Product Advertising APIのScratchpad

このおかげで、XMLの項目名とか簡単に確認できて助かりました。

ScratchpadではPHPのコードまで教えてくれる

ここまでなら、個人サイトで似たようなサービスを提供しているところも見かけたことはありますが、極めつけは[Code snippets]です。

下記のように、条件入力したとおりのPHPコードも出力してくれるんですよ。

<?php
// Your Access Key ID, as taken from the Your Account page
$access_key_id = "********************";

// Your Secret Key corresponding to the above ID, as taken from the Your Account page
$secret_key = "**********************************";

// The region you are interested in
$endpoint = "webservices.amazon.co.jp";

$uri = "/onca/xml";

$params = array(
    "Service" => "AWSECommerceService",
    "Operation" => "ItemSearch",
    "AWSAccessKeyId" => $access_key_id,
    "AssociateTag" => "blogver001-22",
    "SearchIndex" => "Electronics",
    "ResponseGroup" => "Images,ItemAttributes,Offers",
    "BrowseNode" => "2544551051"
);

// Set current timestamp if not set
if (!isset($params["Timestamp"])) {
    $params["Timestamp"] = gmdate('Y-m-d\TH:i:s\Z');
}

// Sort the parameters by key
ksort($params);

$pairs = array();

foreach ($params as $key => $value) {
    array_push($pairs, rawurlencode($key)."=".rawurlencode($value));
}

// Generate the canonical query
$canonical_query_string = join("&", $pairs);

// Generate the string to be signed
$string_to_sign = "GET\n".$endpoint."\n".$uri."\n".$canonical_query_string;

// Generate the signature required by the Product Advertising API
$signature = base64_encode(hash_hmac("sha256", $string_to_sign, $secret_key, true));

// Generate the signed URL
$request_url = 'https://'.$endpoint.$uri.'?'.$canonical_query_string.'&Signature='.rawurlencode($signature);

echo "Signed URL: \"".$request_url."\"";

?>

Amazon公式のコードなので安心感があります。

まとめ

何年かぶりにAmazon Product Advertising APIを触るので浦島太郎状態なのは覚悟していましたが、ここまで至れり尽くせりになっているとは本当に驚きました。

これなら有志が公開してくれているクラスライブラリに頼らずとも自前で簡単にAmazonの商品情報が取得できますね。

PHP3の頃はXMLのパースも自前でしたが、今ならPHP標準のsimplexml_load_stringでXMLのパースもできちゃいますし。

■AmazonのXMLを取得する例

$response = file_get_contents($request_url);
$xml = simplexml_load_string($response);
foreach ($xml->Items->Item as $item) {
	echo $item->ASIN;
}

ちなみに、取得できる情報が思ったよりも少ない件ですが、カスタマーレビューや商品説明欄のデータについては仕様変更でAPIで取得できなくなったっぽいですね。商品説明欄についてはAmazon自体が書いているものは取得できるらしいのですが、それだけだと少々物足りないかも。

マッシュアップサイト……はもう死語かな? 今風に言うとキュレーションサイトが増えた影響なんでしょうかねー。

adsbygoogle

フォロー