w2uiを使ったサンプルを作成したいと思い、楽天市場のランキングを表示することにしました。
楽天市場が提供している「楽天市場ランキングAPI」を利用すれば作成できると思います。
楽天商品ランキングAPIの仕様を確認すると、楽天市場のジャンルIDが必要になりそうです。
楽天APIを利用するためアプリIDを発行
ページ上部に「+アプリID発行」とありますので、クリックします。
楽天会員であれば、会員情報を入力して「ログイン」ボタンをクリックします。
会員では無い方は、新規無料登録が必要です。
新規アプリ登録ページが表示されますので、アプリ名、アプリURLなど必要な項目を入力し「規約に同意して新規アプリを作成」ボタンをクリックします。
問題なければ、すぐにアプリIDが発行されます。
楽天ジャンルIDを取得しMySQLに登録するPHP
楽天ジャンル検索APIの詳細は下記ページで確認することができます。
そして作成したPHPのソースが下記になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
<?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に環境毎の設定に修正してください。
1 2 3 4 5 6 |
define('DB_HOST', 'MySQLホスト'); define('DB_NAME', 'データベース名'); define('DB_USER', 'ユーザー名'); define('DB_PASS', 'パスワード'); define('DB_TABLE', '登録するテーブル名'); define('R_APID', '楽天アプリID'); |
登録するテーブル名がデーターベース内に存在しない場合は、PHP内で作成するようにしてあります。
また短い時間で何度もAPIを利用すると、ロックされることがあるため0.5秒待機する処理を入れてあります。
1 2 |
//0.5秒待機 usleep(500000); |
問題がある場合はこちらの数値を修正し、ロックされないように調整してみてください。
まとめ
今回楽天ランキングで利用しそうなジャンルIDを取得しMySQLに登録する処理を作成しました。
処理的には非効率な部分が多々あるかと思いますが、そう変更も無いだろうと思いますので、楽天のジャンルが更新されたら再度実行する程度で運用していきます。