2010年03月

第一回:AmazonのProduct Advertising APIを使ってみた(その1)
第二回:AmazonのProduct Advertising APIを使ってみた(その2)商品情報の取得
第三回:AmazonのProduct Advertising APIを使ってみた(その3)商品情報の表示
第四回:AmazonのProduct Advertising APIを使ってみた(その4)複数検索条件への対応

今回は商品情報をリクエストするURLを構成する共通パラメータについて書いてみたいと思います。通常、リクエストURLは以下のような形をしています。「?」より後ろにはKey=Valueの形でいくつものパラメータが&で繋がれおり、このパラメータの中には必須のものとそうでないものがあります。また、デフォルトと書いたものは明示的に指定しなくてもその値が自動的に適用されます。



http://webservices.amazon.com/onca/xml?AWSAccessKeyId=00000000000000000000&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z&Version=2009-01-06&Signature=Nace%2BU3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg%3D


■必須項目
必須パラメータは次の表の通りです。
[table id=table id=1 /]

オプションパラメータは以下の通りです。
[table id=table id=2 /]

なお、ResponseGroupに「Request」を指定すると、セットした全てのパラメータの値などデバッグに有用な情報を返してくれるため、セットすることが推奨されている。
このエントリーをはてなブックマークに追加

第一回:AmazonのProduct Advertising APIを使ってみた(その1)
第二回:AmazonのProduct Advertising APIを使ってみた(その2)商品情報の取得
第三回:AmazonのProduct Advertising APIを使ってみた(その3)商品情報の表示

四回目となる今回は複数検索条件への対応をしてみたいと思います。前回のサンプルソースでは「ruby rails」のようにキーワードを半角スペースで区切って検索ができませんでした。原因としては下のコードのように画面から入力された文字列をurlencode関数を使用してエンコードしてるのが原因です。


[php light="true"]
foreach($params as $key=>$value) {
$paramStr .= "&" . urlencode($key) . "=" . urlencode($value);
}
[/php]一方で、エンコードを行う関数にはrawurlencodeという関数もあります。urlencodeと何が違うのかというと半角スペースをrawurlencodeでは「%20」に変換するのに対し、urlencodeでは「+」に変換します。AmazonのProduct Advertising APIではURLの中に「+」記号が入るのを許していませんので「%20」に変換する必要があります。なので、前回のサンプルソースの35行目にあるurlencode関数をrawurlencode関数に置き換えるだけで検索ワードを半角スペースで区切って複数入れてもちゃんと検索できるようになります。
[php light="true"]
$paramStr .= "&" . rawurlencode($key) . "=" . rawurlencode($value);
[/php]実行結果:検索条件を「ruby」として検索した結果
実行結果:検索条件を「ruby rails」として検索した結果

今回は時間があまりなかったので短くなってしまいました。今、amazon.comの公式マニュアルを必死こいて読んでるところなので次回はがんばりますf(^ ^)

このエントリーをはてなブックマークに追加

第一回:AmazonのProduct Advertising APIを使ってみた(その1)
第二回:AmazonのProduct Advertising APIを使ってみた(その2)商品情報の取得

AmazonのProduct Advertising APIシリーズ第三弾は第二回で取得した商品情報データを実際に画面に表示してみようと思います。処理の流れとしては


①入力画面から検索条件を受け取る。
②受け取った検索条件を元にAmazonにリクエストするためのURLを構成する。
③Amazonにリクエストを送り、商品情報(XML)を受け取る。
④SimpleXMLで商品情報(XML)をパースしオブジェクト(下のサンプルソースで言う$parsed_xml)として保持する。
⑤画面に表示する。

となります。

[php]
//アクセスキーとアソシエイトID
define("Access_Key_ID", "アクセスキーを入力");
define("Associate_tag", "アソシエイトIDを入力");

$SearchIndex = $_GET['SearchIndex'];
$Keywords = $_GET['Keywords'];

ItemSearch($SearchIndex, $Keywords);

//Set up the operation in the request
function ItemSearch($SearchIndex, $Keywords){
//Set the values for some of the parameters.
$Operation = "ItemSearch";
$Version = "2008-08-19";
$ResponseGroup = "ItemAttributes,Offers,Images";

$awsUrl = "http://ecs.amazonaws.jp/onca/xml";
//URLにつけるパラメータを連想配列に入れる
$params = array();
$params["Service"] = "AWSECommerceService";
$params["AssociateTag"] = Associate_tag;
$params["AWSAccessKeyId"] = Access_Key_ID;
$params["Operation"] = $Operation;
$params["Version"] = $Version;
$params["SearchIndex"] = $SearchIndex;
$params["Keywords"] = $Keywords;
$params["ResponseGroup"] = $ResponseGroup;
$params["Timestamp"] = gmdate("Y-m-d\TH:i:s\Z");

ksort($params);

$paramStr = "";
foreach($params as $key=>$value) {
 $paramStr .= "&" . urlencode($key) . "=" . urlencode($value);
}
//一番前の&を削除
$paramStr = substr($paramStr, 1);

$parseUrl = parse_url($awsUrl);
$baseStr = "GET\n{$parseUrl['host']}\n{$parseUrl['path']}\n{$paramStr}";
$signature = base64_encode(hash_hmac("sha256", $baseStr, "シークレットキーを入力", true));
$url = $awsUrl . "?" . $paramStr . "&Signature=" . urlencode($signature);

//Catch the response in the $response object
$response = file_get_contents($url);
$parsed_xml = simplexml_load_string($response);

for ($i = 0; $i < 10; $i++) {
 if (empty($parsed_xml->Items->Item[$i])) {
 break;
 }
 echo '
';
 echo '
';
 echo $parsed_xml->Items->Item[$i]->ItemAttributes->Title;
 echo '

';
}
}
?>
[/php]47行目までは前回までと同じです。表示する項目としては「商品画像」と「商品名」の二つを取り出して表示しています(49~57行目)。商品情報の取出しにはPHP5から導入されたSimpleXMLを使います。これは要素や属性をオブジェクトとして扱うことができるのでDOMを使うよりもはるかに簡単で便利です。使わない手はないでしょう。

上記ソースの動作サンプル
⇒SearchIndex:books、Keywords:phpとして条件を指定しています。
アイテムが10個しか表示されないのは、1回のリクエストで10アイテム分しか情報を返さないような(Amazonの)仕様になっているためです。

次のようなXMLがあった場合、上記の46-47行目のようにsimplexml_load_string(もしくはsimplexml_load_file)関数でパースし、$xml->要素名->要素名....といった形式でオブジェクトのように自由に要素や属性を取り出せます。属性を取り出したい時は$xml->要素名['属性名']とします。このXMLは繰り返し要素がないですが、繰り返し要素があってi番目の要素を取り出したいときには$xml->要素名[i]とすることでi番目の要素を取得することが可能です。

example.xml
[xml light="true"]

  
    142
    803
    163
    724
  

  Book
  ABIS_BOOK
  2005-12-02
  オライリージャパン
  オライリージャパン
  Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本

[/xml][php]
$content = file_get_contents('example.xml');
$parsed_xml = simplexml_load_string($content);

echo $parsed_xml->ItemAttributes->Publisher //"オライリージャパン"と表示される。
echo $parsed_xml->ItemAttributes->PackageDimensions->Height //"142"と表示される
echo $parsed_xml->ItemAttributes->PachageDimensions['Units'] //"hundredths-inches"と表示される。
[/php]

今回は1ページ分の情報しか取得しませんでしたが、次回は指定したページを取得するようなものを作ってみたいと思います。と、思ったのですが、今回のサンプルソースでは日本語やスペースを処理できない(二つ以上の検索ワードを処理できない)ので次回はそれらに対応したものを作りたいと思います。
このエントリーをはてなブックマークに追加

前回、AmazonのProduct Advertising APIを使ってみた(その1)ではProduct Advertising API Signed Requests Helperを利用してXMLという形で商品データを取得しました。今回は画面からカテゴリー(本とかCDなど)とキーワードを入力できるようにして、それを元に商品情報を取得してみます。


これが検索条件入力画面のリスト。
[php]


amazon api request



print("





");
?>

Choose a Category


Enter Keywords
size='40'/>



[/php]
そしてこれが商品情報を取得するリスト。画面から入力されたSearchIndexKeywordsを受け取り処理を行います。
[php]
//アクセスキーとアソシエイトIDを定義
define("Access_Key_ID", "アクセスキーを入力");
define("Associate_tag", "アソシエイトIDを入力");

$SearchIndex = $_GET['SearchIndex'];
$Keywords = $_GET['Keywords'];

ItemSearch($SearchIndex, $Keywords);

//Set up the operation in the request
function ItemSearch($SearchIndex, $Keywords){
//Set the values for some of the parameters.
$Operation = "ItemSearch";
$Version = "2008-08-19";
$ResponseGroup = "ItemAttributes,Offers";

$awsUrl = "http://ecs.amazonaws.jp/onca/xml";

//URLにつけるパラメータを連想配列に入れる
$params = array();
$params["Service"] = "AWSECommerceService";
$params["AssociateTag"] = Associate_tag;
$params["AWSAccessKeyId"] = Access_Key_ID;
$params["Operation"] = $Operation;
$params["Version"] = $Version;
$params["SearchIndex"] = $SearchIndex;
$params["Keywords"] = $Keywords;
$params["ResponseGroup"] = $ResponseGroup;
$params["Timestamp"] = gmdate("Y-m-d\TH:i:s\Z");

//ソートする
ksort($params);

//URLにするため、配列に入れたパラメータを&と=で繋げる
$paramStr = "";
foreach($params as $key=>$value) {
$paramStr .= "&" . urlencode($key) . "=" . urlencode($value);
}
//一番前の&を削除
$paramStr = substr($paramStr, 1);

$parseUrl = parse_url($awsUrl);
$baseStr = "GET\n{$parseUrl['host']}\n{$parseUrl['path']}\n{$paramStr}";
$signature = base64_encode(hash_hmac("sha256", $baseStr, "シークレットアクセスキーを入力", true));
$url = $awsUrl . "?" . $paramStr . "&Signature=" . urlencode($signature);

echo $url . "
";

//Catch the response in the $response object
$response = file_get_contents($url);
$parsed_xml = simplexml_load_string($response);
echo "
";
print_r($parsed_xml);
echo "
";
}
?>
[/php]

33行目で連想配列に入れたパラメータをソートしていますが、これはAmazonのマニュアルページに次のような一文があるためソートを行っています。

パラメータと値のペアをバイト順(アルファベット順とは異なり、大文字のパラメータは小文字のパラメータの前に並ぶ形式です)に並べ替えます。


44行目でGETや\nを文字列として結合していますが、これもマニュアルページに次のように書かれているのでこのような処理を行っています。「改行をそのまま使用してください」というのが\nを使っている理由です。

以下の3行(改行はそのまま使用してください)を正規化されたリクエストの前に追加します。

GET

webservices.amazon.com

/onca/xml


45行目では署名文字列を得るためにHMAC-SHA256ハッシュアルゴリズムを使用してハッシュ値を計算しています(ちなみにこの署名は2009年8月15日以前は必要ありませんでした)。hash_hmac関数の第三引数にはAmazonより発行されたシークレットアクセスキー(Secret Access Key)を指定します。また、このハッシュ値にはプラス(+)やイコール(=)が含まれるため、次の行でurlencode関数を使ってエンコードを行います。あとはfile_get_contents関数でリクエスト内容(XML)を取得して、パースし配列として画面に出力します。

ここではXMLを配列しましたが、取得した情報をXMLのまま扱いたいということであれば52~55行目は必要ありません。配列でやるかXMLでやるかは好みじゃないでしょうか。次回は取得した情報を使ってECサイト風に画面を作りこんでみる予定です。
このエントリーをはてなブックマークに追加


ビジュアル英文解釈 (Part1) (駿台レクチャーシリーズ)を二ヶ月かかってようやく読み終えました。読み方としては1回通して読んだ後、さらにもう一回読んでます。基本的には朝の通勤時間(電車)を利用して読んでいたので、一日に読む時間は大体30分~40分程。気力があれば帰りにも読んでました。休日は他のこともしたかったので基本的には手を付けていません。読むのにかかった時間は次のような感じ。


1回目:12時間12分 1/18~2/15
2回目:10時間11分 2/17~3/18


読んでみての感想は、大学受験の時にこの本に出会っていれば受験できる大学の選択肢も広がったんじゃないかなと感じるくらい力がついたと思います。ちなみに高校時代の私の英語の偏差値は50を切ったり切らなかったりという感じです(笑)数学と物理はかなり良かったんですよ!(言い訳です。すみません)

あんなに英語嫌いだった私をここまで英語好きにしてくれた著者には感謝感謝です!

この本の良いところは先人に語り尽くされていると思うので多くは語りませんが、一つ挙げるとすれば『学習したことが繰り返し学習させる』ことだと思います。大事なことは何回も何回も出てきます。読んでいるだけで復習までできる本に私は出会ったことがありません。

また、長いセンテンスを途中で止まること無く一息で読むことができるようになってきました。以前は1センテンスが長いと、文を小分けにして理解するような読み方をしていたのですが、そういった不自然な読み方をすることが少なくなったと感じます。これは英語に慣れてきたというのも一因だと思います。

もちろん、日本語に訳しながらは読んでません。英語のまま理解し、必要であれば日本語にするというスタンスで読みました。著者の言う『訳せるから読めてるんじゃない。読めているから必要な時に訳せるんだ』を頭に叩き込んで読んでました。

ですが、全部理解したかと言われると自信を持って理解した!とは言えないので、Ⅱを読みながらⅠをもう一回読んでみようかと思ってます。
このエントリーをはてなブックマークに追加

↑このページのトップヘ