ホーム

OFF-SOFT.net

OFF-SOFT.net

ウェブやソフトウェアに関するサポート&情報サイトです。サイト構築からソフトウェアの作成、利用まであなたの助けになるかも・・・・しれません。たぶん・・。

PHPで楽天 Web APIを使ってカテゴリツリー表示してみる

公開日| 2010年10月03日 | コメントはまだありません。
概要:

今回は、楽天 のWeb APIを使ってみたいと思います。以前に、Yahoo! , 価格.com , Amazon.co.jp についてのWEB APIを使った簡単な検索を実施してみました。
楽天 Web APIは、以前、記事にしましたYahoo! のWEB APIとほとんど変わりません。
基本的にWEB APIは、パラメータ名や基本的なアドレスこそ違いいますが、ほとんど考え方は同じなので、一つ理解しておくと後は、アドレス、パラメータ名ぐらいをみれば、それで、簡単なWebアプリを作成することは簡単です。
※Amazonは、認証の手順が少し異なりますが、URLでアクセスして、XMLのリアクションを貰うのは、WEB APIの基本です。

さあ、今回は、少し趣向を変えて、楽天のWEB APIで使うカテゴリID(※楽天では、ジャンルIDと言いますが、一般的にはカテゴリIDと言うことが多いので、ここでは、カテゴリIDで通します。)を出力する簡単なページを作ってみましょう。

参照ページ : http://webservice.rakuten.co.jp/
ここで使用したサンプルソースコード:


まず、準備をしましょう。

楽天デベロッパーIDを取得しましょう。
楽天のWEB API IDを利用する場合、デベロッパーIDが必須です。
楽天IDをすでに持っている場合は、楽天IDに対して1つだけ取得できます。
(楽天IDをお持ちでない方は、まずは、楽天 会員登録ページで取得しましょう。)

楽天IDを取得したら、先の楽天 WEB APIのトップページhttp://webservice.rakuten.co.jp/の画面左にデベロッパーID取得のリンクがありますから、 そこをクリックして、デベロッパーIDを取得します。


楽天デベロッパーIDを使って、簡単なWEB APIを使ってみましょう。
取得できたら、一応、ちゃんと使えるか確認しておきましょう。
http://api.rakuten.co.jp/rws/3.0/rest?developerId=[YOUR_developerID]&operation=ItemSearch&version=2010-09-15&keyword=%E7%A6%8F%E8%A2%8B&sort=%2BitemPrice
[YOUR_developerID]:あなたのデベロッパーID
実際に上記のURLをデベロッパーIDだけ変更して、WEBブラウザで直接URLを入力して、検索してみましょう。
以下のような検索結果が表示されることと思います。(※以下の画面イメージは、WEBブラウザがFirefoxでの検索結果イメージです。)

出力結果は、XML形式なので、Firefoxでは、上記のように表示されます。

ここで大事なのは、Statusタグが、Successとなっていることです。
もし失敗しているなら、以下のようにClientErrorのように別の文字列が表示されています。


ここがSuccessになっていないようなら、何らかの問題があるはずですので、まずは、その問題の解決をしましょう。
以降の作業を行っても、ここでエラー出力される場合は、正しく動作しません。

また、楽天アフィリエイトをやってみたい方は、楽天アフィリエイトIDも取得しておきましょう。


PHPの動作環境を確認しましょう。

PHPが動作可能か確認します。
以下は、Windowsのコマンドプロンプトで確認した例です。
UNIXでも同様のコマンドを入力して確認できます。

1
2
3
4
C:\> php -v
PHP 5.1.2 (cli) (built: Jan 11 2006 16:40:00)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies

今回の記事では、バージョンがPHP5以上でなければなりません。

これで準備が整いました。 次に、PHPのサンプルコードを元に、試してみましょう。


PHPのサンプルソースを使って、試してみましょう。

以下は、簡単なカテゴリIDのツリーページを作成するためのPHPのサンプルソースです。

[rakuten_sample.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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
<?php
 
//!	RFC3986 形式で URL エンコードする関数
//!	
//!	@param $str 変換前URL文字列
//!	@return sring 変換後URL文字列
function urlencode_rfc3986($str)
{
    return str_replace('%7E', '~', rawurlencode($str));
}
 
//!	URL(文字列)を編集する関数
//!	
//!	@param $params WEB APIに渡すパラメータリスト
//!	@param $base_param WEB APIに渡す基本パラメータ
//!	@param $baseurl WEB APIの基本URL
//!	@param $id カテゴリID
//!
//!	@return sring 編集後URL文字列
function getURL(&$params,$base_param,$baseurl,$id = -1)
{
	if(isset($id) && $id>=0){
		$params['category_id']    =$id;   // category (pc/software)
	}
	// sort $param by asc.
	ksort($params);
 
	// create canonical string.
	$canonical_string = $base_param;
	foreach ($params as $k => $v) {
	    $canonical_string .= '&'.urlencode_RFC3986($k).'='.urlencode_RFC3986($v);
	}
 
	// create URL strings.
	return $baseurl.'?'.$canonical_string;	//	service = itemSearch 
}
 
//	-----------------------------
//	main 
//	-----------------------------
//	パラメータをチェック
if(isset($_REQUEST['id']) && !empty($_REQUEST['id'])){
	$id = $_REQUEST['id'];
} else {
	$id = 0;
}
$URI = $_SERVER['REQUEST_URI'];
if(stripos($URI,'?')!==false){
	$URI = substr($URI,0,stripos($URI,'?'));
}
 
 
$baseurl = 'http://api.rakuten.co.jp/rws/3.0/rest';
$base_param = 'developerId='.'**********************';	//	あなたの WEB API ID を設定します。
 
$params = array();
 
//$params['affiliateId']   = '*****'; //	アフィリエイトIDを持っている方は、設定する。
$params['operation']        = 'GenreSearch';	//	
$params['version']          = '2007-04-11';	//	
$params['genrePath']        = 1;
$params['genreId']          = $id;
 
 
// create URL strings.
$url = getURL($params,$base_param,$baseurl);	//	service = itemSearch 
 
// request to amazon !!
$response = file_get_contents($url);
 
// response to strings.
$parsed_xml = null;
if(isset($response)){
	$response = str_replace('genreSearch:GenreSearch', 'GenreSearch', $response);
	$response = str_replace('header:Header', 'Header', $response);
 
	$parsed_xml = simplexml_load_string($response);
}
 
$cat_html = '';
if(isset($parsed_xml)  && isset($parsed_xml->Header) && isset($parsed_xml->Header->Status) && strpos($parsed_xml->Header->Status,'AccessForbidden')!==false){
	$cat_html = '******AccessForbidden*******<br />'."\n";
	$cat_html .= '処理が輻輳しているため、アクセスできません。<br />';
	$cat_html .= 'しばらく待って再度アクセスしてみてください。<br />';
	$cat_html .= $url.'<br />';
} else if( $response==false || !isset($parsed_xml) || !isset($parsed_xml->Body) || 
    !isset($parsed_xml->Header->Status) || 
    stripos($parsed_xml->Header->Status,'Success')===false 
    ){
	//	error
	//	none
	$cat_html = '**** ERROR ***<br />';
	$cat_html .= " 指定されたID = $id は、存在しないカテゴリのようです。<br />\n<br />\n";
	$cat_html .= '<br />';
	$cat_html .= '<a href="'.$URI.'?id=">TOPのカテゴリ一覧へ</a><br />';
	$cat_html .= '<br />';
	if(isset($parsed_xml->Header) && isset($parsed_xml->Header->Status)){
		$cat_html .= print_r($parsed_xml->Header->Status,true);
	}
	$cat_html .= print_r($parsed_xml,true);
 
} else {
	if(isset($parsed_xml->Body->GenreSearch) ){
		$current = $parsed_xml->Body->GenreSearch->current;
		if(isset($current)){
			$cat_html .= '<br />';
			$cat_html .= '<a href="'.$URI.'?id=">TOPのカテゴリ一覧へ</a><br />';
			$cat_html .= '<br />';
			$cat_html .= '現在のカテゴリ情報:<br />';
			$nCurrentId = (int)$current->genreId;
			$cat_html .= '<a href="'.$URI.'?id='.$current->genreId.'">'.($nCurrentId!=0 ? $current->genreName:'root').'</a> : '.$nCurrentId.'<br />';
 
			$cat_html .= '<br />';
			$cat_html .= 'カテゴリツリー:<br />';
 
			$c_count=0;
			$parents = $parsed_xml->Body->GenreSearch->parent;
 
			if($nCurrentId!=0){
				$cat_html .= '<ul>';
				$cat_html .= '<li>階層 - 0 : <a href="'.$URI.'?id=0">root</a> : 0</li>';
				$c_count++;
			}
			if(isset($parents)){
				foreach($parents as $parent){
					$cat_html .= '<ul>';
					$cat_html .= '<li>階層 - '.$parent->genreLevel.' : <a href="'.$URI.'?id='.$parent->genreId.'">'.$parent->genreName.'</a> : '.$parent->genreId.'</li>';
					$c_count++;
				}
			}
 
			$cat_html .= '<ul>';
			$cat_html .= '<li>階層 - '.($nCurrentId!=0 ? $current->genreLevel:'0').' : <a href="'.$URI.'?id='.$current->genreId.'">'.($nCurrentId!=0 ? $current->genreName:'root').'</a> : '.$nCurrentId.'<br />';
			$c_count++;
 
			$childs = $parsed_xml->Body->GenreSearch->child;
			$cat_html .= '<ul>';
			foreach($childs as $cate_child){
				$cat_html .= '<li><a href="'.$URI.'?id='.$cate_child->genreId.'">'.$cate_child->genreName.'</a> : '.$cate_child->genreId.'</li>';
			}
			$c_count++;
 
			for($ni=0;$ni<$c_count;$ni++){
				$cat_html .= '</ul>';
			}
			$cat_html .= '<br />';
 
		}
	} else {
		$cat_html = '**** DEBUG ***<br />';
		$cat_html .= print_r($parsed_xml,true);
	}
}
 
 
?>
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf8"> 
  <title>楽天 カテゴリID</title> 
</head>
<body>
<form action="<?php echo $URI; ?>" name="searchCategoryID" method="post">
<b>ID検索 :</b><input type="text" name="id" value="<?php echo ($id<0? '':$id); ?>" /><input type="submit" value="検索" />
</form>
<br clear="left" />
<?php
	echo $cat_html;
?>
</body>
</html>

もし、そのまま利用する場合は、以下の2項目を設定すれば、カテゴリIDリストを確認することができると思います。

54行目:あなたのデベロッパーIDを設定します。
58行目:あなたのアフィリエイトIDを設定します。


設定したphpファイルをあなたのWEBサーバ上でアクセスできるところへアップロードします。
WEBブラウザから、アップロードしたphpへアクセスしてみてください。
例えば、WEBサーバのカレントの直下へアップロードした場合は、以下のようなURLでアクセスします。

http://www.example.com/rakuten_sample.php


以下のような画面が表示されるはずです。



ソースコードの構成は、大きく以下の構成でならんでいます。
  1. php サブルーチン
  2. php メイン
  3. html
ちょっと、メインルーチンが、中央にあるので、わかりにくいかもしれません。
でも、やってることは、本当に簡単です。

メインで、画面から受け取ったパラメータを元にWEB APIのアドレス&パラメータでURLを編集し、 実際にアクセスし、返信情報(XML)を解析して、画面にカテゴリツリーを表示する。

こんな流れです。

唯一、注意すべき点は、楽天では、XMLのタグ名に':'を使っている箇所かあります。
これは、phpのsimplexml_load_stringでは、XMLからphpの配列へ正しく変換してくれません。

そのため、事前に74行目、75行目で、
74
75
	$response = str_replace('genreSearch:GenreSearch', 'GenreSearch', $response);
	$response = str_replace('header:Header', 'Header', $response);
のように文字列を置換してあげるとうまくいきます。

簡単な説明でしたが、こんな感じでカテゴリIDを調べることができます。
楽天に限らず、アマゾン、Yahoo!でも、WEB APIの検索の絞り込みを行う場合、このカテゴリIDを的確に指定してあげると、案外、うまく絞り込めることが多いです。
しかし、楽天、アマゾン、Yahoo!は、カテゴリが多いです。
いちいち、覚えるのは非常に困難ですから、このカテゴリページは、案外、役に立つかと思います。

上記のサンプルをそれなりに変更して作成したページを以下のアドレスに設けましたので、それも活用いただけたら嬉しく思います。
http://www.off-soft.net/categories/rakuten/



コメント

コメントをどうぞ







  • はてなブックマークへ追加する
  • Facebookでシェアする
  • twitter でつぶやく
  • Google Plusでシェアする
  • Pocketでシェアする
ページトップへ