14.モール別ランキングのAmazon Product Advertising API関数(amazon_function.php)のソース内容

「モール別ランキング」アプリのソース解説14回目です。前回は「楽天市場API関数」のプログラムの流れについて解説しました。今回は「amazon_function.php(Amazon Product Advertising API関数)」のプログラムソースの流れを簡単に解説します。

 

前回の記事

13.モール別ランキングの楽天市場API関数(rakuten_function.php)のソース内容

アプリURL
モール別ランキング – 大手通販サイトのランキングを比較

 

amazon_function.php(Amazon Product Advertising API関数)

 

ソース内容

<?php

    //----------------------------------------------------------------------
    //Amazon Product Advertising APIを呼び出し、取得したデータをXML形式から配列に変換する
    //
    //パラメータ($type)呼び出すAPIの種類
    //パラメータ($options)APIに渡すパラメータ
    //----------------------------------------------------------------------
    function amazonFind($type = 'first', $options = array()) {

        //APIに渡すID情報
        $secret_key='シークレットキー';
        $keys = array(
            'AWSAccessKeyId'=>'aws認証キー',
            'AssociateTag'=>'アソシエイトID'
        );


        //ProductGroupパラメータが指定されている場合、SearchIndexに変換
        if(isset($options['ProductGroup'])){
            switch ($options['ProductGroup']) {
            case 'Automotive Parts and Accessories':
                $options['SearchIndex']='Automotive';
                break;
            case 'Baby Product':
                $options['SearchIndex']='Baby';
                break;
            case 'Book':
                $options['SearchIndex']='Books';
                break;
            case 'CE':
            case 'Personal Computer':
                $options['SearchIndex']='Electronics';
                break;
            case 'Health and Beauty':
                $options['SearchIndex']='HealthPersonalCare';
                break;
            case 'Home Improvement':
                $options['SearchIndex']='HomeImprovement';
                break;
            case 'Movie':
                $options['SearchIndex']='Video';
                break;
            case 'Office Product':
                $options['SearchIndex']='OfficeProducts';
                break;
            case 'Sports':
                $options['SearchIndex']='SportingGoods';
                break;
            case 'Toy':
                $options['SearchIndex']='Toys';
                break;
            case 'Video':
                $options['SearchIndex']='VHS';
                break;
            case 'Video Games':
                $options['SearchIndex']='VideoGames';
                break;
            case 'Watch':
                $options['SearchIndex']='Watches';
                break;
            default:
                $options['SearchIndex']=$options['ProductGroup'];
                break;
            }
            unset($options['ProductGroup']);
        }

        //キーワード検索用パラメータの設定
        if(isset($options['q'])){
            $options['Keywords']=$options['q'];
            unset($options['q']);
        }


        //取得する検索結果数の設定
        if(isset($options['page'])){
            $options['ItemPage']=$options['page'];
            unset($options['page']);
        }



        //取得するカテゴリの設定
        if(!empty($options['category_id'])){
            $options['BrowseNode']=$options['category_id'];
            unset($options['category_id']);
        }

        switch ($type) {
            case 'first':
                //------------------------------------------------------------
                //商品ID(ItemID)パラメータで商品検索を行い商品情報を取得
                //------------------------------------------------------------

                //取得可能なデータを全て取得
                $options['ResponseGroup']='Large';

                //ItemLookupのリクエストURL
                $req = 'http://ecs.amazonaws.jp/onca/xml?Service=AWSECommerceService&Operation=ItemLookup&';

                //APIに渡すパラメータとID配列をマージ
                $api_params = array_merge($options,$keys);

                //配列形式のパラメータをURL エンコードされたクエリ文字列に変換
                $req .= http_build_query($api_params);

                //Amazon Product Advertising APIの署名認証
                $url=getAmazonURL($req,$secret_key);

                //APIからXMLを取得
                $xml = simplexml_load_string(file_get_contents($url));

                //配列に変換
                $json = json_encode($xml);
                $amazons = json_decode($json,TRUE);

                return $amazons['Items']['Item'];

            case 'all':
                //------------------------------------------------------------
                //指定したパラメータで商品検索を行い商品情報を取得
                //------------------------------------------------------------

                //SearchIndex、BrowseNodeパラメータが指定されていない場合、SearchindexにAllを設定
                if(empty($options['SearchIndex']) and empty($options['BrowseNode'])){
                    $options['SearchIndex']='All';
                }

                //取得可能なデータを全て取得
                $options['ResponseGroup']='Large';

                //ItemSearchのリクエストURL
                $req = 'http://ecs.amazonaws.jp/onca/xml?Service=AWSECommerceService&Operation=ItemSearch&';

                //APIに渡すパラメータとID配列をマージ
                $api_params = array_merge($options,$keys);

                //配列形式のパラメータをURL エンコードされたクエリ文字列に変換
                $req .= http_build_query($api_params);

                //Amazon Product Advertising APIの署名認証
                $url=getAmazonURL($req,$secret_key);

                //APIからXMLを取得
                $xml = simplexml_load_string(file_get_contents($url));

                //配列に変換
                $json = json_encode($xml);
                $amazons = json_decode($json,TRUE);

                //検索結果の設定。検索結果が1件の場合、配列化する
                if (isset($amazons['Items']['Item'][0])){
                    $retData=$amazons['Items']['Item'];
                }elseif (isset($amazons['Items']['Item'])){
                    $retData[]=$amazons['Items']['Item'];
                }else{
                    $retData=[];
                }
                return $retData;
            case 'ranking':
                //------------------------------------------------------------
                //商品ランキング情報を取得
                //------------------------------------------------------------

                //10件のベストセラーを取得
                $options['ResponseGroup']='TopSellers';

                //BrowseNodeLookupのリクエストURL
                $req = 'http://ecs.amazonaws.jp/onca/xml?Service=AWSECommerceService&Operation=BrowseNodeLookup&';

                //APIに渡すパラメータとID配列をマージ
                $api_params = array_merge($options,$keys);

                //配列形式のパラメータをURL エンコードされたクエリ文字列に変換
                $req .= http_build_query($api_params);

                //Amazon Product Advertising APIの署名認証
                $url=getAmazonURL($req,$secret_key);

                //APIからXMLを取得
                $xml = simplexml_load_string(file_get_contents($url));

                //配列に変換
                $json = json_encode($xml);
                $amazons = json_decode($json,TRUE);

                return $amazons['BrowseNodes'];

            case 'relate':
                //------------------------------------------------------------
                //パラメータで指定した商品の関連商品情報を取得
                //------------------------------------------------------------

                //取得可能なデータを全て取得
                $options['ResponseGroup']='Large';

                //SimilarityLookupのリクエストURL
                $req = 'http://ecs.amazonaws.jp/onca/xml?Service=AWSECommerceService&Operation=SimilarityLookup&';

                //APIに渡すパラメータとID配列をマージ
                $api_params = array_merge($options,$keys);

                //配列形式のパラメータをURL エンコードされたクエリ文字列に変換
                $req .= http_build_query($api_params);

                //Amazon Product Advertising APIの署名認証
                $url=getAmazonURL($req,$secret_key);

                //APIからXMLを取得
                $xml = simplexml_load_string(file_get_contents($url));

                //配列に変換
                $json = json_encode($xml);
                $amazons = json_decode($json,TRUE);

                return $amazons['SimilarityLookupResponse']['Items'];

            case 'category':
                //------------------------------------------------------------
                //商品のカテゴリ情報を取得
                //------------------------------------------------------------

                //BrowseNodeLookupのリクエストURL
                $req = 'http://ecs.amazonaws.jp/onca/xml?Service=AWSECommerceService&Operation=BrowseNodeLookup&';

                //APIに渡すパラメータとID配列をマージ
                $api_params = array_merge($options,$keys);

                //配列形式のパラメータをURL エンコードされたクエリ文字列に変換
                $req .= http_build_query($api_params);

                //Amazon Product Advertising APIの署名認証
                $url=getAmazonURL($req,$secret_key);

                //APIからXMLを取得
                $xml = simplexml_load_string(file_get_contents($url));

                //配列に変換
                $json = json_encode($xml);
                $amazons = json_decode($json,TRUE);
                return $amazons['BrowseNodes'];

        }
    }

    //----------------------------------------------------------------------
    //Amazon Product Advertising APIの署名認証
    //
    //パラメータ($url)署名認証を行うURL
    //パラメータ($secret_key)署名認証に必要なシークレットキー
    //----------------------------------------------------------------------
    function getAmazonURL($url,$secret_key){
        $param_array=array();

        //URLの構成要素を取得
        $url_array = parse_url($url);

        //クエリパラメータを取得
        parse_str($url_array['query'], $param_array);

        // タイムスタンプを追加
        $param_array['Timestamp'] = gmdate('Y-m-d\TH:i:s\Z');

        // キーを基準にパラメータをソート
        ksort($param_array);

        //----------------------------
        // canonical string 作成
        // ---------------------------
        $canonical_string = '';

        // パラメータを key=value の形式に編集
        // 同時にURLエンコード
        foreach ($param_array as $k => $v) {
            $canonical_string .= '&'.urlencode_RFC3986($k).'='.urlencode_RFC3986($v);
        }

        //1文字目以降の文字列を取得
        $canonical_string = substr($canonical_string, 1);

        // 署名作成 - 規定の文字列フォーマットを作成 - HMAC-SHA256 を計算 - BASE64 エンコード
        $string_to_sign = "GET\n{$url_array['host']}\n{$url_array['path']}\n{$canonical_string}";

        // RFC2104準拠のHMAC-SHA256ハッシュアルゴリズムの計算
        // これがSignatureの値になる。
        $signature = base64_encode(hash_hmac('sha256', $string_to_sign, $secret_key, true));

        // URL作成 - リクエストの末尾に署名を追加
        $url = 'http://'.$url_array['host'].$url_array['path'].'?'.
            $canonical_string.'&Signature='.urlencode_RFC3986($signature);

        return $url;


    }


    //----------------------------------------------------------------------
    //URLのエンコード
    //
    //パラメータ($str)エンコードを行う文字列
    //----------------------------------------------------------------------
    function urlencode_RFC3986($str){
        return str_replace('%7E', '~', rawurlencode($str));
    }

 

プログラムの流れ

9行目:

Amazon Product Advertising の各APIを呼び出す関数です

Product Advertising APIの開発者ガイド

 

11行目〜16行目:

ID情報の設定を行います。

アプリIDの発行

 

19〜81行目:

楽天やyahooAPI使用でも使用する検索キーワード(「q」)などは共通のパラメータ名にしているので、APIのパラメータに合わせて変換しています。

 

91〜245行目:

Amazon APIのリクエストと取得処理(詳細はソースのコメント参照)。

Product Advertising APIの開発者ガイド

 

 

247〜296行目:

署名認証の関数。Amazon Product Advertising APIではリクエストの認証のためTimestamp、Signatureが必要になります。

リクエストの署名認証について

 

299〜306行目:

URLのエンコード関数

 

 

次回はbase.css(css)のソース内容を紹介します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です