プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
Amazon Product Advertising API、検索結果からkindleを除外できた
結論から書けば

リクエストパラメータの「Power」に「binding:not kindle」を付ける

でOKでした。

実は以前「Amazon Product Advertising API、検索結果からkindleを除外したい(暫定対処中)」の記事で、
電子媒体を除外して書籍の検索をしたい的なことを書いたのですが、
その後、すっかり放置していましてね。

ふと気になったので再度調べたらあっさり見つかりました。
「Power=binding:not kindle」を付けろだそーです。
ここに載ってたφ(--)

https://forums.aws.amazon.com/thread.jspa?messageID=218127#

前に「Amazon Product Advertising API(TIPS):売上ランキングを取得する」の記事で書いた
売上ランキングを取得するコードを例に取ると

■Util.php
class Util {
    static public function urlencode_rfc3986($str) {
        return str_replace('%7E', '~', rawurlencode($str));
    }
}

■BookInfo.php
class BookInfo{
    public $ISBN;
    public $ASIN;
    public $Title;
    public $Author;
    public $Publisher;
    public $PublicationDate;
    public $DetailPageURL;

    /**
     * コンストラクタ
     *
     */
    public function __construct() {
        $this->ISBN = "";
        $this->ASIN = "";
        $this->Title = "";
        $this->Author = "";
        $this->Publisher = "";
        $this->PublicationDate = "";
        $this->DetailPageURL = "";
    }
}

■test.php
define("AWS_BASE_URL", "http://ecs.amazonaws.jp/onca/xml");
define("AWS_ACCESS_KEY", ご自分のアクセスキーをどーぞ);
define("AWS_SECRET_ACCESS_KEY", ご自分のシークレットアクセスキーをどーぞ);
define("AWS_OPTION_SERVICE", "AWSECommerceService");
define("AWS_OPTION_VERSION", "2011-08-02");
define("AWS_OPTION_ASSOCIATETAG", ご自分のアソシエイトIDをどーぞ);
define("AWS_OPTION_SEARCHINDEX", "Books");
define("AWS_OPTION_BROWSENODE", "466282");
define("AWS_OPTION_RESPONSEGROUP", "Medium");

require_once(dirname(__FILE__) ."/Util.php");
require_once(dirname(__FILE__) ."/BookInfo.php");

$baseurl = AWS_BASE_URL;
$params = array();
$params['Service'] = AWS_OPTION_SERVICE;
$params['AWSAccessKeyId'] = AWS_ACCESS_KEY;
$params['Version'] = AWS_OPTION_VERSION;
$params['AssociateTag'] = AWS_OPTION_ASSOCIATETAG;
$params['SearchIndex'] = AWS_OPTION_SEARCHINDEX;
$params['BrowseNode'] = AWS_OPTION_BROWSENODE;
$params['ResponseGroup'] = AWS_OPTION_RESPONSEGROUP;
$params['Operation'] = 'ItemSearch';
$params['ItemPage'] = 1;
$params['Sort'] = 'salesrank';
$params['Timestamp'] = gmdate('Y-m-d\TH:i:s\Z');
//add
$params['Power'] = 'binding:not kindle';


ksort($params);

$caStr = '';
foreach ($params as $k => $v) {
    $caStr .= '&'.Util::urlencode_rfc3986($k).'='.Util::urlencode_rfc3986($v);
}
$caStr = substr($caStr, 1);

// 署名を作成します
// - 規定の文字列フォーマットを作成
// - HMAC-SHA256 を計算
// - BASE64 エンコード
$parsedUrl = parse_url($baseurl);
$strToSign = "GET\n{$parsedUrl['host']}\n{$parsedUrl['path']}\n{$caStr}";
$signature = base64_encode(hash_hmac('sha256', $strToSign, AWS_SECRET_ACCESS_KEY, true));

// URL を作成します
// - リクエストの末尾に署名を追加
$url = $baseurl.'?'.$caStr.'&Signature='.Util::urlencode_rfc3986($signature);

//XMLで情報を取得。
$xml = @simplexml_load_file($url);

$dataList = array();
//検索結果データ展開
foreach ($xml->Items->Item as $item) {
    $data = new BookInfo();

    $data->ISBN = (string) $item->ItemAttributes->ISBN;
    $data->ASIN = (string) $item->ASIN;
    $data->Title = (string) $item->ItemAttributes->Title;
    $data->Author = (string) $item->ItemAttributes->Author;
    $data->Publisher = (string) $item->ItemAttributes->Publisher;
    $data->PublicationDate = (string) $item->ItemAttributes->PublicationDate;
    $data->DetailPageURL = (string) $item->DetailPageURL;

    $dataList[] = $data;
}

var_dump($dataList);

とかすればOKです。

ちなみに「Power」パラメータを既に指定していて複数になる場合は、例えば

$params['Power'] = 'binding:not kindle and pubdate:during 12-2013';

のように「and」で繋いであげてください。
最終的にはURLエンコードされて

Power=binding%3Anot%20kindle%20and%20pubdate%3Aduring%2012-2013

のようなパラメータになりますけどね。
Powerパラメータに関する細かいことは

https://images-na.ssl-images-amazon.com/images/G/09/associates/paapi/dg/index.html?PowerSearchSyntax.html

をご覧ください。

取りあえずこれでkindleが除外できたのでスッキリです。

これにて完了\(--)/
 
このエントリーをはてなブックマークに追加 

category:Amazon Product Advertising API  thema:パソコンな日々 - genre:コンピュータ  Posted by ササキマコト 

  関連記事