2014年4月10日

カラーミーAPI実践編1 データ抽出

【仕事サイトにカラーミーショップAPI関連記事を書きました】
カラーミーショップAPIの使い方を丁寧に解説します

ご依頼があってあれこれ作っていると、こまごましたネタが貯まってきました。
それとは別に、需要の多い(よく検索される)、Smarty、jQuery、カテゴリーの話も、新記事として更新できればなぁと。

さて、カラーミーショップの最近のトピックは、カラーミーAPI。
カラーミーAPIとPHPを使った、よくある一連の流れを模式的に書くとこんな風。

「データ(カラーミー)」→「処理(PHP)」→「結果表示(カラーミー)」

はじめて触れる方には、知っておくべきことが山のようにあります。
・どうやってデータを生成するのか(HTMLの入力フォーム)
・どうやって処理するのか(カラーミーAPIとのやりとり、データ処理・整型)
・どうやってデータの受け渡しをするのか(クエリストリングス、Ajax、JSONPなど)
・どうやって結果表示するのか(JavaScript)

特に結果表示の方法については、用途によっていくつかの方法のなかから選択することになり、PHP初学者には??とになります(PHPという言語の特徴でもあります)。
「カラーミーいじりたおし」的には、実際に一番使いそうな結果表示方法にしぼって、解説することにしています(これは次回、実践編2で)。

今回は、最初としてとっかかりやすい「処理の部分」に焦点を当てて、ワンポイントを。
サンプルは、カラーミーAPIで商品データを検索し、PHPで処理し、メルマガ用のリンクを作るアプリケーションです。

1.メールマガジン用のデータ抽出アプリケーション
<?php
    header("Content-Type:text/html; charset=UTF-8");// 文字化け対策
    $request_options = array(
        'http' => array(
            'method'  => 'GET',
            'header'=> "Authorization: Bearer xxxxxxxxxxxxxxx\r\n"
        )
    );
    $context = stream_context_create($request_options);
    $url = 'https://api.shop-pro.jp/v1/products.json?category_id_big=0123456&limit=50&fields=name,sales_price,id,simple_expl,update_date&update_date_min=' . date('Y-m-d');
    $response_body = file_get_contents($url, false, $context);
    $response_json = json_decode($response_body, true);// 連想配列に
    //print_r($response_json);// 配列の構造と中身が見られます

    //商品名(昇順)& 価格(降順)
    foreach ($response_json['products'] as $key => $row) {
        $name[$key]  = $row['name'];
        $sales_price[$key] = $row['sales_price'];
    }
    array_multisort($name, SORT_ASC, $sales_price, SORT_NUMERIC, SORT_DESC, $response_json['products']);
    /*
    //更新日時順(降順)
    foreach ($response_json['products'] as $key => $row) {
        $update_date[$key]  = $row['update_date'];
    }
    array_multisort($update_date, SORT_NUMERIC, SORT_DESC, $response_json['products']);
    */
   
    for($i=0; $i<count($response_json['products']); $i++) {
        echo $response_json['products'][$i]['name'];//商品名
        echo " ";
        echo number_format($response_json['products'][$i]['sales_price']);// カンマ
        echo "円";
        echo "<br />";
        echo "http://www.hogehoge.com/?pid=";// 商品URL
        echo $response_json['products'][$i]['id'];
        echo "<br />";
        echo $response_json['products'][$i]['simple_expl'];// 商品の簡易説明
        echo "<br />";
        echo "<br />";
    }

2.簡単な説明
header("Content-Type:text/html; charset=UTF-8");
私の使用しているヘテムル PHP5.4という環境では、明示しなくても、UTF-8になっているようです(なので、なくても問題ありませんでした)。XAMPPはデフォルト EUC-JPだそうです。
作成したphpファイルも、もちろんUTF-8で保存します。
カラーミーAPIが返す日本語(2バイト文字)も、UTF-8です。
文字コードをEUC-JPにする場合は、↑この点、注意が必要です。
サンプルで文字コードをミスっていると、商品の簡易説明と、echoの”全角スペース”や”円”が文字化けします。

'header'=> "Authorization: Bearer xxxxxxxxxxxxxxx\r\n"
青色箇所はアクセストークンを埋め込むところ。前回の「カラーミーAPIを試してみた 2」を参照。
ちなみに、Authorization以下の文字列をダブルクォーテションで括っていますが、シングルクォーテーションにすると動きません。
PHPにおいて、シングルクォーテーションとの違いはご存知でしょうか?

カラーミーAPIでショップ・データを参照する一連のコード(サンプルの前半部分)は、前回とほとんど変わりませんが、今回は「リクエストパラメータ」がすこし凝っています。
$url = 'https://api.shop-pro.jp/v1/products.json?category_id_big=0123456&limit=50&fields=name,sales_price,id,simple_expl,update_date&update_date_min=' . date('Y-m-d');
公式ページにある、カラーミーAPIインターフェイス v1の「GET /v1/products.json」を読むと、参照できる商品データについて記載されています。
その下に「リクエストパラメータ」の記述があり、カラーミーAPIに渡すパラメータの説明があります。

今回は、検索キーに大カテゴリーと更新日付。
「limit=50」として、カラーミーAPIに対して、(一度に)最大50件まで返すように求めています。指定しない場合は、デフォルト=10件ですので、この点は注意。
「offset=50」とすると、51件目からとってきます。ということで、複数回リクエストすれば、50件超えたデータも、問題なく受け取れるということです。
「fields=~」は、必要な項目を絞ります。設定しない場合は、参照できる商品データの全項目を受け取ることになります。
「.」は、PHPにおける文字列連結演算子です。

サンプルの後半部分が、PHPによる処理にあたります。
JSON形式で受け取り、デコードし、連想配列に入れて、ソートして、出力しています。
PHPの文法については大したことをしてませんので、ネットのリファレンスや入門書などに丸投げさせていただきます。へぼいコーディングの質問とツッコミは、ご容赦いただければと存じます。
忙しくなければ、、、書籍を一冊くらい読んだほうが良いな、と思います。

3.おわりに
メルマガ用データ抽出というサンプルを作りました。条件を変えれば、色々データ抽出できますよね。例外処理(件数0の場合など)をすこし加えるべきでしょうが、こんなところでご勘弁を。

次回は「カラーミーAPI 実践編2」。
どうやってデータの受け渡しをするのか(+表示を少し)、というお話。
サンプル見れば使えちゃうけど、細かいところまで気にするとややこしいです。