こんばんは。2009年8月15日からアマゾンのリンク作成用API(Product Advertising API, 旧称:AmazonアソシエイトWebサービス)が署名認証を含まないリクエストを一切処理しなくなりました。この影響で、ppBlogでの既存のアマゾンタグやアマゾン検索が動かなくなっています。なので、それに対応させるための書き換えを遂行しました。
 具体的な処理の流れは、もやし日記 やIMHO
 やIMHO が大変参考になりました。アマゾンサイトにある説明
 が大変参考になりました。アマゾンサイトにある説明 を一度読んで理解できる人はそういないだろうなぁ。
 を一度読んで理解できる人はそういないだろうなぁ。
このアマゾンのProduct Advertising APIですが、PHPのみで対応させるとなるとサーバー環境によっては実装が難しいかもしれません。基本的には、PHP5の環境でないと気軽に動きません。今や、PHP4の公式サポートも終了し、多くのレンタルサーバーではPHP5を提供していると思うので、さほど問題になることはないかも、とは思いますが。
 どうしてPHP5が必要かというと、アマゾンのこのサービスは、sha256Wアルゴリズムのハッシュを生成する必要があるからです。PHP5なら、hash_hmac関数 が使えます。じゃ、PHP4な環境ではどうするか?もし、PHP4の環境でmhashライブラリーを組み込んでいるならOKです。このmhashライブラリー、非ウィンドウズなサーバー環境なら、最初から実装している気はします。ちなみに、自分のノートに構築したWindows下のXAMPPG環境では、mhashはデフォルトでは有効でなかったです(libmhash.dllを有効にすれば良いんでしょうけど)。
 が使えます。じゃ、PHP4な環境ではどうするか?もし、PHP4の環境でmhashライブラリーを組み込んでいるならOKです。このmhashライブラリー、非ウィンドウズなサーバー環境なら、最初から実装している気はします。ちなみに、自分のノートに構築したWindows下のXAMPPG環境では、mhashはデフォルトでは有効でなかったです(libmhash.dllを有効にすれば良いんでしょうけど)。
この部分の処理は以下のようにしています。
 /* 
      PHP4でsha256ハッシュを生成するための処理。mhashが必須。
      RFC 2104 HMAC implementation for php.
      source:: http://www.php.net/manual/en/function.mhash.php
 */
if(!function_exists('hash_hmac')){ // hash_hmac()関数はPHP4にはない
 if(function_exists('mhash')){
  function sha256($data = ''){
   return bin2hex(mhash(MHASH_SHA256, $data));
  }
 } else $out .= '<p class="alert">mhashライブラリーのサポートがないようです。サーバーの管理者にお問い合わせを。</p>';
 function hash_hmac($algo, $key, $data, $raw_output = FALSE){
  $b = 64; // byte length for sha256
  if(strlen($key) > $b){
   $key = pack("H*", $algo($key));
  }
  $key  = str_pad($key, $b, chr(0x00));
  $ipad = str_pad('', $b, chr(0x36)); $ipad ^= $key;
  $opad = str_pad('', $b, chr(0x5c)); $opad ^= $key;
  $hmac = $algo($opad . pack("H*", $algo($ipad . $data)));
  if($raw_output){
   return pack("H*", $hmac);
  } else return $hmac;
 }
}
 ppBlog独自の既存のアマゾンタグを修正しないといけないかなぁという懸念もあったのですが(そうすると過去のログを修正する必要がある)、その必要なかったです この新しいAPIに対応させるには、これから添付するamazon_associate.phpとmodules/amazon.inc.phpとutils.phpとで既存のやつを上書きすれば良いです。その後、管理画面の「各種ツール」→「アマゾンアソシエイト」で、新たに取得したアクセスキーとシークレットキーなどの設定をします。最初は、「変数が設定されていないよー」といったppBlog Noticeが出るかもしれませんが、設定をすすめていけばOKです。そのスクリーンショットを載せときますね。
 この新しいAPIに対応させるには、これから添付するamazon_associate.phpとmodules/amazon.inc.phpとutils.phpとで既存のやつを上書きすれば良いです。その後、管理画面の「各種ツール」→「アマゾンアソシエイト」で、新たに取得したアクセスキーとシークレットキーなどの設定をします。最初は、「変数が設定されていないよー」といったppBlog Noticeが出るかもしれませんが、設定をすすめていけばOKです。そのスクリーンショットを載せときますね。

 この画面にもあるように、従来のアソシエイトタグ(ppblog-22とか。トラッキングID)だけでは、もはや動きません。アマゾンAPIを利用されたい方は、アマゾンのサイト で、このAPIを利用するための2つのキーを入手して下さい。
 で、このAPIを利用するための2つのキーを入手して下さい。
ちなみに、この新しいAPIに対応したデモサイトを作りました。基本的には、amazon_associate.phpでやってる処理と同じです。
 →Amazon Product Advertising APIのデモ http://p2b.jp/demo/aws.php 
 
動作確認も兼ねて、この記事でアマゾンの商品を紹介しておきます。Nespressoのエスプレッソマシーンは、日本にいるときも使っていたのですが、フランスに来て暫くして、よりコンパクトなこれを買いました。ユーロだと安かったなぁ。使っているのはワインレッド色のやつですが。カプセル方式は、楽チンで良いです。
 
 

















 ALL:
 ALL:









Comments