w2uiを使ったサンプルを作成したいと思い、楽天市場のランキングを表示することにしました。

楽天市場が提供している「楽天市場ランキングAPI」を利用すれば作成できると思います。

 

楽天商品ランキングAPIの仕様を確認すると、楽天市場のジャンルIDが必要になりそうです。

楽天商品ランキングAPIの詳細ページはこちら

 

楽天APIを利用するためアプリIDを発行

Rakuten Developersを開きます。

ページ上部に「+アプリID発行」とありますので、クリックします。

 

楽天会員であれば、会員情報を入力して「ログイン」ボタンをクリックします。

会員では無い方は、新規無料登録が必要です。

 

新規アプリ登録ページが表示されますので、アプリ名、アプリURLなど必要な項目を入力し「規約に同意して新規アプリを作成」ボタンをクリックします。

 

問題なければ、すぐにアプリIDが発行されます。

 

楽天ジャンルIDを取得しMySQLに登録するPHP

楽天ジャンル検索APIの詳細は下記ページで確認することができます。

楽天ジャンル検索API詳細ページ

 

そして作成したPHPのソースが下記になります。

<?php
 
define('DB_HOST', 'MySQLホスト');
define('DB_NAME', 'データベース名');
define('DB_USER', 'ユーザー名');
define('DB_PASS', 'パスワード');
define('DB_TABLE', '登録するテーブル名');
define('R_APID', '楽天アプリID');

//処理時間無制限に設定
set_time_limit(0);
ini_set('max_execution_time', 0);

//HTTP出力文字コードの設定
mb_http_output('UTF-8');
date_default_timezone_set('Asia/Tokyo');
header('Content-Type: text/html; charset=UTF-8');

$tableName = DB_TABLE;
$r_id=R_APID;
$dsn = 'mysql:dbname=' . DB_NAME . ';host=' . DB_HOST . ';charset=utf8;';
$pdo = null;

try {
	$pdo = new PDO($dsn, DB_USER, DB_PASS);
	$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);          
	$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

}
catch (PDOException $e) {
	die($e->getMessage());
}	

//テーブルの存在チェック
$row=null;
$stmt = $pdo->query("SHOW TABLES LIKE '{$tableName}' ");
while($result = $stmt->fetch(PDO::FETCH_ASSOC)){
	$row[] = $result;
}
$stmt->closeCursor();
$stmt = NULL;

//テーブルが存在しない場合
if($row == null) {
$sql=<<<EOF
CREATE TABLE `{$tableName}` (
  `ID` varchar(10) NOT NULL,
  `Name` varchar(255) NOT NULL,
  `ParentID` varchar(10) NOT NULL,
  `GenreLevel` int(11) NOT NULL,
  `Disp` int(11) NOT NULL,
  `LastUpdate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
EOF;

$pdo->exec($sql);
$pdo->exec("ALTER TABLE `{$tableName}` ADD PRIMARY KEY (`ID`),ADD KEY `ParentID` (`ParentID`);");
}

$sql = <<<EOF
	REPLACE INTO {$tableName} (`ID`, `Name`, `ParentID`, `GenreLevel`, `Disp`)
	VALUES (:ID, :Name, :ParentID,:GenreLevel,:Disp) 	
EOF;

$d = function($a,$k) {
	$rec = '';
	if($a==null) return $rec;
	if(is_array($a)) {
		if(array_key_exists((string)$k,(array)$a)){
			$rec = mb_convert_encoding($a[$k], 'UTF-8');
		}
	}
	return $rec;
};

$s=0;
$URL = "https://app.rakuten.co.jp/services/api/IchibaGenre/Search/20140222?applicationId={$r_id}&genreId=";
$json = json_decode(file_get_contents($URL.'0'),true);
$gid = array();
$cnt=1;
do{
	$rows = $d($json,'children');
	if(is_array($rows)) {
		$ParentID = $d($d($json,'current'),'genreId');
		for($i=0;count($rows) > $i;$i++) {
			$child = $d($rows[$i],'child');
			$stmt = $pdo->prepare($sql);
			$stmt->bindValue(':ID',$d($child,'genreId'),PDO::PARAM_STR);
			$stmt->bindValue(':Name',$d($child,'genreName'),PDO::PARAM_STR);
			$stmt->bindValue(':ParentID',$ParentID,PDO::PARAM_STR);
			$stmt->bindValue(':GenreLevel',$d($child,'genreLevel'),PDO::PARAM_INT);
			$stmt->bindValue(':Disp',$i,PDO::PARAM_INT);
			if($d($child,'genreLevel') != '5') {
				$gid[$d($child,'genreId')] = true;
			}
			$stmt->execute();
		}
	}
	
	//0.5秒待機
	usleep(500000);
	$json = array();
	foreach ($gid as $k=>$v) {
		if($v) {
			$gid[$k] = false;
			$json = json_decode(file_get_contents($URL.$k),true);
			break;
		}
	}

	$cnt++;
	echo $cnt ."/".count($gid)."<br>";
	@ob_flush();
	@flush();
}while(count($json) > 0);

echo '完了<br>';
?>

 

上部のdefineに環境毎の設定に修正してください。

define('DB_HOST', 'MySQLホスト');
define('DB_NAME', 'データベース名');
define('DB_USER', 'ユーザー名');
define('DB_PASS', 'パスワード');
define('DB_TABLE', '登録するテーブル名');
define('R_APID', '楽天アプリID');

 

登録するテーブル名がデーターベース内に存在しない場合は、PHP内で作成するようにしてあります。

また短い時間で何度もAPIを利用すると、ロックされることがあるため0.5秒待機する処理を入れてあります。

//0.5秒待機
usleep(500000);

問題がある場合はこちらの数値を修正し、ロックされないように調整してみてください。

 

まとめ

今回楽天ランキングで利用しそうなジャンルIDを取得しMySQLに登録する処理を作成しました。

処理的には非効率な部分が多々あるかと思いますが、そう変更も無いだろうと思いますので、楽天のジャンルが更新されたら再度実行する程度で運用していきます。

 

[wpdm_package id=’718′]

 

 

By にど寝

もともと名古屋でシステムエンジニアをしてましたが、現在は地元に帰省してネットショップの社内システムエンジニアをしてます。  

コメントを残す

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