もしもAPIをphpで使ってみる -7ページ目

自分のサイトにある商品かチェック

メインのindex.phpに自分のサイトの商品かのチェックを加えます。
商品IDを取り出し、urllist.phpの配列で定義されているかで判断します。


<?php
mb_regex_encoding("UTF-8");
mb_internal_encoding("UTF-8");

require_once('config.php');
require_once('urllist.php');
require_once('getmoshiapi.php');

$p = 0;
$maxnum = 100;
$s = "sales";

if(($ArticleSearch = getmoshi_tag($authorization_code, $tag, $p, $maxnum, $s)) !== FALSE){
$ranking = 1;
foreach ($ArticleSearch->Articles->Article as $Article) {
$pid = (int)$Article->ArticleId;
if(isset($arr_pageurl[$pid])){
(自分のサイトのページ)
$ranking++;
if(ranking > $max_rank){ break;}
} else {

}
}
}
?>


ペタしてね

ぜひクリックしてね→人気ブログランキングへ にほんブログ村 IT技術ブログ プログラム・プログラマーへ

何のランキングをゲットする?

いよいよ、もしもAPIでランキングをゲットしようと思いますが、いくつか種類があります。
ランキングといっても、ある一定の条件の商品一覧を売り上げ順にソートしたものを使うだけなので、条件の設定で以下のようなものがあります。

・カテゴリ
 フード・ドリンクなどの10種類の親カテゴリの他に、スイーツなどもう少し細かいのもあります。そのカテゴリに属する商品一覧を取り出す。

・タグ
 もしも管理画面の商品一覧で下のほうにある「関連ワード: 」です。同じタグをもつ商品の一覧を取り出す。

・商品名
 商品名に一定の文字が入っているもの一覧を取り出す。

・グループ
 サイズや色違いなどの商品が独自にグルーピングされているので、同じグループの商品一覧を取り出す。

・価格設定済み商品
 価格設定済みの商品のみを対象にすることができるので、自分のサイトで扱っている商品は、価格設定しておくと、自分のサイトの商品の絞り込みに利用できる。

今回は、専門店サイトを想定して、タグを使って見ます。
getmoshiapi.phpにタグを扱うための関数を追加します。

<?php
function getmoshi_tag ($authorization_code, $tag, $page, $perpage, $sort, $option="") {
$_tag = urlencode($tag);
$options = "&tags=" . $_tag ."&list_per_page=".$perpage . "&page_index=" . $page . "&sort_order=" . $sort . $option;

if(($ArticleSearch = getmoshi_basic($authorization_code, $options)) !== FALSE){
return $ArticleSearch;
}
return false;
}

function getmoshi_basic ($authorization_code, $options="") {
~略~
}
?>

$perpageは、1回のリクエストでいくつの商品情報を得るかの指定で(1ぺージ分),$pageは、何ぺージ目の情報か、$sortは並び順を指定します。

config.phpでタグを指定するようにします。

<?php
$shop_id= "1"; //ショップID
$authorization_code="1234567890123456789"; //認証コード
$max_rank = 10; //ランキング何位まで表示
$tag = "焼肉";
$cache_dir= ""; //キャッシュディレクトリ
$cache_time = 24*3600; //キャッシュ有効時間(秒)
?>


呼び出す、メインのindex.phpは、とりあえずこんな感じ。
売り上げ順に並んだ商品の0ぺージ目(最初のぺージ)の100個を取り出します。
価格設定済み商品の絞り込みをするなら、$sの後に"&has_shop_price=registered"を加えます。

<?php
mb_regex_encoding("UTF-8");
mb_internal_encoding("UTF-8");

require_once('config.php');
require_once('urllist.php');
require_once('getmoshiapi.php');

$p = 0;
$maxnum = 100;
$s = "sales";

if(($ArticleSearch = getmoshi_tag($authorization_code, $tag, $p, $maxnum, $s)) !== FALSE){

}

?>


ペタしてね

キッシュ機能をつける

もしもAPIの仕様書に1認証コードにつき、1秒に1回程度のリクエストを受け付けられるとありますので、なるべく無駄なリクエストはださないように、キャッシュ機能を追加したいと思います。

PHPには、PEARライブラリにCache_Liteというクラスがありますので、これがインストールされているサーバーなら、これを使うのが簡単でいいと思います。しかし、私の使っているサーバーで使えないところがあったので、簡単なものを自分で組み込んでしましました。

前回のfunction getmoshi_basicを変更します。


< php
function getmoshi_basic ($authorization_code, $options="") {
global $cache_dir, $cache_time;
$search_url = "http://api.moshimo.com/article/search";
$request = $search_url . "?authorization_code=$authorization_code" . $options;

if ($cache_dir != '') {
$cache_file = $cache_dir . '/' . md5($request);
$timedif = @(time() - filemtime($cache_file));
if ($timedif < $cache_time) {
$filename = $cache_file;
$cacheok = 0;
} else {
$filename = $request;
$cacheok = 1;
cleanCache($cache_dir, $cache_time);
}
}else {
$filename = $request;
$cacheok = 0;
}

$response = file_get_contents($filename);
$ArticleSearch = simplexml_load_string($response);

if($ArticleSearch->Rows > 0){
if($cacheok){
if ($f = @fopen($cache_file, 'w')) {
fwrite ($f, $response, strlen($response));
fclose($f);
}
}
return $ArticleSearch;
}
return false;
}

function cleanCache($directory, $cache_time) {
$handle = opendir($directory);
while ($datei = readdir($handle))
{
if (($datei != '.') && ($datei != '..'))
{
$file = $directory.'/'.$datei;
if (!is_dir($file)) {
$timedif = @(time() - filemtime($file));
if ($timedif > $cache_time) {
unlink($file);
}
}
}
}
closedir($handle);
return true;
}
?>

ちょっと長くなってしまいましたね。
global $cache_dir, $cache_time;は、初期設定ファイルで設定したキャッシュディレクトリと有効時間をこの関数の中で利用出来るようにするおまじない。

キャッシュのファイル名はmd5()という関数でもしもAPIに出すリクエストを変換しています。md5()は暗号化とかに使うものなのですが、パラメータから一意に決まることを利用しています。
あとは、現在の時刻とファイル作成の時刻の差が有効時間内かチェック。
新たに有効な情報をもしもAPIで得た場合は、ファイルに書き込むようにします。

新たに、cleanCacheという関数を追加してます。これは、有効期限切れのキャッシュファイルを全部削除するものです。キャッシュの有効性をチェックして、無効であった場合に呼ばれます。

ペタしてね