Amazon Product Advertising API はじめの一歩

Ajax

Amazon Product Advertising API はじめの一歩

Amazonの商品を検索して、販売するというアプリを作ろうとしています。
最初は
「APIのリファレンス読んでちゃちゃっとできるだろう!」
と思っていたら、意外と難しかったので、つまづいた点などをメモしておきます。

そもそも、RESTとか、証明書とか、リクエストを送って結果を受信する方法もわからないよ!という人向けです。

読むべきドキュメント

最初につまづいたポイントは、
「とにかくAmazonのドキュメントがわかりにくい!どこにおいてあるのかさえわかりにくい!!」
ということです。

たとえば、下記がProgramming Guideの目次となっていますが、コンセプトみたいな話も多く、いらない情報が多いのです。
http://docs.aws.amazon.com/AWSECommerceService/2011-08-01/DG/ProgrammingGuide.html

何がいらないかと言うと、下記のようなEコマースとはなんぞや?というドキュメントもあります。
http://docs.aws.amazon.com/AWSECommerceService/2011-08-01/DG/WhatisECommerce.html

要約すると、
「Eコマースとはアマゾンみたいなサイトのことだよん。
Eコマースについて知りたければ、アマゾンで買い物してよねっ。」
とか書いてあります。どういう商魂のたくましさでしょうか。
ってか、こんなのをProgramming Guideに入れるな!と大声で言いたいです。

とにかく、それぐらいAmazonが提供しているドキュメントが混乱しているということがわかって頂けたでしょうか?

また、Amazon Product Advertising API Best Practices というページもあります。2007年に書かれたもののようです。
しかし、役には立ちそうなので、一読しておいた方がいいでしょう。
http://aws.amazon.com/articles/Product-Advertising-API/1057

サンプルコードの一覧が下記にあります。腕に覚えありの人は、こういうの見たほうが早いでしょうか?
http://aws.amazon.com/code/Product-Advertising-API?browse=1

Amazonに商品検索のパラメーターを送って、結果を受信する

Amazonに商品検索のパラメーターを送って、結果を受信するには、Amazon Product Advertising APIでは、リクエストをRESTで送信し、結果を受信する、ということになります。

そもそも「RESTで送信」とは??なんぞや?
と言いますと、RESTとはとか言い出すと、WikiPediaを見てください、ということになりますが、簡単に言うと、ここで必要なのはHTTPでリクエストを送信することです。

下記のようなURLをブラウザで実行することも、HTTPで送信している、ということになります。

 http://webservices.amazon.com/onca/xml?Service=AWSECommerceService&Operation=ItemSearch&
 AWSAccessKeyId=[Access Key D]&AssociateTag=[ID]&SearchIndex=Apparel&
 Keywords=Shirt&Timestamp=[YYYY-MM-DDThh:mm:ssZ]&Signature=[Request Signature]

RESTでリクエストをする方法についての、Amazonのオフィシャルなドキュメントはこちら
http://docs.aws.amazon.com/AWSECommerceService/2011-08-01/DG/AnatomyOfaRESTRequest.html

そのために、AmazonのAmazon Product Advertising APIのアクセスキーというものが必要になります。

AmazonのAmazon Product Advertising APIのアクセスキーを取得する

下記のページの、
https://affiliate.amazon.co.jp/gp/advertising/api/detail/your-account.html

 こちらのリンクから、以下の処理が可能です:

の「こちらのリンク」をクリックしてください。
日本国内で、アフィリエイトのリンクを張りつけるだけのアカウントを持っている場合があると思いますが、これは別にIDを登録しないといけません。

情報を入力していくと、アカウントができます。

そのあと、アカウントを作り、再度上記の画面からサインインしますと、Amazon Web Serviceの管理画面に行けます。

いきなり、アラートが出て、今後はこの管理画面は使えなくなり、今後は、Your Security Credentialsという管理画面に映るそうです。

未来のために、Your Security Credentialsの説明を書いておきます。

下記のような画面ですが、確かにAccess Key IDとは書いてありますが、Secret Access Keyがありません。
え??( ゚Д゚)
と思いますよね。

赤マルで囲んだボタンをクリックします。
すると、新しいAccess Key IDとSecret Access Keyをダウンロードできます。

つまりは…このSecret Access Keyは一度ダウンロードしたら、同じものは二度とダウンロードできないのです!!!

もしSecret Access Keyがなくなってしまったら、新しいものを発行するしかないのです。

恐ろしすぎます…。Secret Access Keyは大事大事に保存しましょうね!!

ちなみに、現在利用できる日本語の管理画面では、画面上でSecret Access Keyを表示させることができます。

ふぅー
やっとアクセスキーとシークレットアクセスキーが取得できましたね。

そして再度RESTでリクエストを送ってみる

もう一度、RESTでリクエストをする方法についての、Amazonのオフィシャルなドキュメントはこちら
http://docs.aws.amazon.com/AWSECommerceService/2011-08-01/DG/AnatomyOfaRESTRequest.html

わかりにくいので解説ですが、そもそもリクエストを投げるパラメーターを含んだリクエストを、一旦解剖してからシークレットキーでハッシュ化し、最後にパラメーターとして付与することになります。
なんでこんな面倒なことするんですかね…
アマゾンの価格だけ調べて、利用しようとする人たちを一生懸命排除するためでしょうか。

つまり、下記のようなリクエストをHTTPで投げたいとして

 http://ecs.amazonaws.co.uk/onca/xml?Service=AWSECommerceService&A
 WSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Operation=ItemSearch&Actor=Joh
 nny%20Depp&ResponseGroup=ItemAttributes,Offers,Images,Reviews,Var
 iations&Version=2009-01-01&SearchIndex=DVD&Sort=salesrank&Associa
 teTag=mytag-20

上記をまず、下記の状態にします。

 GET
 ecs.amazonaws.co.uk
 /onca/xml
 AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Actor=Johnny%20Depp&Associate
 Tag=mytag-20&Operation=ItemSearch&ResponseGroup=ItemAttributes%2C
 Offers%2CImages%2CReviews%2CVariations&SearchIndex=DVD&Service=AW
 SECommerceService&Sort=salesrank&Timestamp=2009-01-01T12%3A00%3A0
 0Z&Version=2009-01-01

それを、HMACの SHA256で暗号化します。
PHPであれば、

 hash_hmac('sha256', $string_to_sign, $secret_access_key, true)

などとやります。別にこれは、自分のサーバーで行えばよいです。

で、暗号化された文字列が、下記のようにできますが、

 TuM6E5L9u%2FuNqOX09ET03BXVmHLVFfJIna5cxXuHxiU%3D

これを

 Signature=TuM6E5L9u%2FuNqOX09ET03BXVmHLVFfJIna5cxXuHxiU%3D

として、先ほどのHTTPリクエストに混ぜてやります。
全体のHTTPリクエストは、下記のようになります。

 http://ecs.amazonaws.co.uk/onca/xml?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE
 &Actor=Johnny%20Depp&AssociateTag=mytag-20&Operation=ItemSe
 arch&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews%2CV
 ariations&SearchIndex=DVD&Service=AWSECommerceService&Signature=T
 uM6E5L9u%2FuNqOX09ET03BXVmHLVFfJIna5cxXuHxiU%3D&Sort=salesrank&Ti
 mestamp=2009-01-01T12%3A00%3A00Z&Version=2009-01-01

と、長々と書きましたが、なかなか書くのは面倒ですね…
少し間違うと、すぐ下記のようなメッセージが帰ってきてしまいます。

 The request signature we calculated does not match the signature you provided. 

下記にて、上記の流れのサンプルコードを公開されている方がいらっしゃいました。
ありがとうございます!!
https://gist.github.com/DQNEO/6231929

これで、AmazonからXMLが帰ってくれば、成功です★

後日段

後日、file_get_contents()ではなく、ソケット通信 fsockopen()でやろうとしましたが、Request Not Supported と返されてしまいました。(^_^;
残念。

Allowed memory size of 8388608 bytes exhausted

PHP

Allowed memory size of 8388608 bytes exhausted

というエラーが出る場合、PHPのリソース制限が原因です。
PHPのmemory_limitを変更することでこのエラーを解消できます。

php.iniファイルのmemory_limitを増やすには、memory_limitと書いてあるところを検索し、”8M”から”16M”などに変更してください。

レンタルサーバーなどでphp.iniが編集できない場合、.htaccessでもPHPの設定を変更できます。

.htaccess ファイルを作成し、

 php_value memory_limit "16M"

と記述しましょう。

.htaccess で行う場合は、次のようにします。

 次の一文を追加
 php_value memory_limit 16M
  • 上記エラーですが、memory_limit “16M”を色々、32M、64M、128M、400Mなどと変えてみましたが結果は同じです。何か他に原因が有るのでしょうか ?以下のメッセージがインストール時に表示されています。# pecl install imagickdownloading imagick-2.3.0.tgz …Starting to download imagick-2.3.0.tgz (86,976 bytes)…………………done: 86,976 bytesFatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 23040 bytes) in /usr/share/pear/PEAR/PackageFile/v2/Validator.php on line 53 — りょう {2010-06-29 (火) 13:33:25}
  • phpのバージョンによるかもしれませんが、peclコマンドはphp.iniの設定を無視するようです。試していませんが、/usr/share/pear/pearcmd.phpの先頭にini_set(‘memory_limit’, ’32M’);を追加すると解決できるかもしれません。[参考]http://pecl.php.net/bugs/bug.php?id=7390 — OnlineConsultant {2010-06-29 (火) 18:58:42}

All in one SEOでタイトルの変更が効かない場合の対処方法

WordPress

All in one SEOでタイトルの変更が効かない場合の対処方法

All in one SEOは、WordPressにおいて、ページや投稿ごとにキーワードやDescriptionやタイトルをダッシュボードから変更ができる便利なプラグインです。

しかし、時々タイトルの反映などがうまくいかない場合があります。
その場合は、次の点を試してみましょう!

  1. 設定→All in one SEOで表示される、All in one SEOの設定画面にて、Post Title Formatの項目が、「%post_title% | %blog_title%」になっている。

ちなみに、これはフォーマットの方法で、

 投稿のタイトル|ブログのタイトル

というフォーマットでタイトルが表示されるよ、という設定方法です。
ブログのタイトルなんて表示されなくていいんじゃー!、という人は%blog_title%を削ってください。

  1. テンプレートにおいて、タイトルタグ出力部分が
  2.  <title><?php wp_title('',true); ?>
     <?php if(wp_title('',false)) { ?> | <?php } ?>
     <?php bloginfo('name'); ?></title>
    

    となっている

    1. wp_head();より前に、上記のタイトル出力部分のプログラムがあるかどうか

Akiko Goto

雑談場

このサイトの管理をしている、株式会社オンラインコンサルタントの社長をしております。

こんなブログもやってます。
Summer Snow
http://summer-snow.sakura.ne.jp/wordpress/

遊びに来て下さいね![smile]