スキーとネットとロードバイクと旅。

群馬で自由人からリーマンになった恋する男の趣味に生きるブログ。

Amazonのapiを叩いて商品情報を取得の備忘録

Amazonの商品情報を取得するapiProduct Advertising APIという名前なんですが、いつの間にか名前が変わったんですね。昔はAmazon Associates Web Serviceって名前だった気がするんですが、EC2とかのサービスと明確に分けたかったんでしょうか。

日本語のドキュメントもあるんですが、なんか読みにくい。というか、まとまっていない感じがします。楽天のapiとかのほうが、日本人としてはとっつきやすいですね。中身を理解してしまえば同じですが。

で、忘れないように俺的備忘録。この辺のサイトを参考にしました。
http://www.ajaxtower.jp/ecs/
https://images-na.ssl-images-amazon.com/images/G/09/associates/paapi/dg/index.html?UnderstandingImagesSuppliedbyA2S.html
http://ringoon.jp/2009/05/09/memo-amazon-product-advertisin.html

ソース(GETで検索キーワードを受け取ってapiでリクエスト、XMLをパースして画像とタイトルとリンクを取得)

<?php 

	if(isset($_GET["submit"])){
	
		$keyword=$_GET["keyword"];
		
	//access key id とsecret accesskey
	$access_key_id="自分のアクセスキー";
	$secret_access_key="シークレットアクセスキー";

	//RFC3986形式でURLエンコーディング
	function urlencode_rfc3986($str){
		return str_replace("%7E","~",rawurlencode($str));
	}
	
	//基本的なリクエストを作成
	$baseurl = 'http://ecs.amazonaws.jp/onca/xml';
	$params=array();
	$params["Service"]="AWSECommerceService";
	$params["AWSAccessKeyId"]="$access_key_id";
	$params["Version"]="2009-03-31";
	$params["Operation"]="ItemSearch";
	$params["SearchIndex"]="Books";
	$params["Keywords"]=$keyword;
	$params["AssociateTag"]="idealtypes-22";
        $params["ResponseGroup"]="ItemAttributes,Images";
	
	//タイムスタンプパラメータ追加
	//時間表記はISO8601形式、タイムゾーンはUTC(GNT)
	$params["Timestamp"]=gmdate("Y-m-d\TH:i:s\Z");
	
	//パラメータの順序を昇順に並び替え
	ksort($params);
	
	//canonical stringを作成
	$canonical_string="";
	foreach($params as $k => $v){
		$canonical_string.="&".urlencode_rfc3986($k)."=".urlencode_rfc3986($v);
	}
	$canonical_string=substr($canonical_string,1);
	
	//署名作成
	//規定の文字フォーマット作成
	//HMAC-SHA256 を計算
	//BASE64 エンコード
	
	$parsed_url=parse_url($baseurl);
	$string_to_sign="GET\n{$parsed_url["host"]}\n{$parsed_url["path"]}\n{$canonical_string}";
	$signature=base64_encode(hash_hmac("sha256",$string_to_sign,$secret_access_key,true));
	
	//URLを作成
	//リクエストの末尾に署名を追加
	$url=$baseurl."?".$canonical_string."&Signature=".urlencode_rfc3986($signature);

	//パースする
	$xml=simplexml_load_file($url);
	
	$html_table.="<table border='1'>";
	foreach($xml->Items->Item as $value){
		$html_table.='<tr><td><a href="'.$value->DetailPageURL.'"><img src="'.$value->SmallImage->URL.'"></a></td><td><a href="'.$value->DetailPageURL.'">'.$value->ItemAttributes->Title.'</a></td></tr>';
	}

	$html_table.="</table>";
	}
?>

注意点

2009年に仕様変更がありまして、リクエストURLの中にタイムスタンプと署名を追加しなければならなくなりました。タイムスタンプはそのままくっつけてますが、署名は所定の形式でエンコードする必要があります。また、署名自体がリクエストURLや指定したパラメータ、アクセスキーを元に作成されていますので、都度署名を生成する必要があります。
署名生成の際にリクエストURLを利用しますが、base64_encode関数に値を渡すときにAmazon所定の形式(改行コードを入れた形)で値を渡さないといけないんですね。

リクエストURLで取得したい情報グループ(ResponseGroup)をあらかじめ指定しないとxmlには含まれないで返ってくる

楽天の商品検索apiなどではリクエストして戻ってくるXMLはほぼ同じ構造ですが、Amazonの場合はリクエストで取得したい情報を指定してあげないとレスポンスのXMLに入ってきません。この情報の指定は、グループ単位(ResponseGroup)で行います。逆に言えば、何も指定しなければ、非常に基本的な情報のみ戻ってきます。必要に応じて最適なResponseGroupを指定することで、無駄なXMLの取得を避けられます。

ResponseGroupはこの辺を確認するといいですね。
http://www.ajaxtower.jp/ecs/responsegroup/

以上、備忘録でした。

phpでダブルコロンが含まれてるxmlをパースする

ダブルコロンが含まれていると、simplexml_load_fileではエラーが出るみたい。
その場合はget_file_contentsで内容を取得し、str_replaceとかで置き換えしてからsimplexml_load_stringでパースすると出力される。
もっといい方法があれば教えて下さい。

以下、楽天の商品検索apiでの場合。

$api_url="リクエストURL";

$tmpdata=file_get_contents($api_url);
$tmpdata = str_replace('header:Header', 'Header', $tmpdata);
$tmpdata = str_replace('itemSearch:ItemSearch', 'ItemSearch', $tmpdata);

$xml = simplexml_load_string($tmpdata);

追記:ダブルコロンではなくコロンでした。

googleの急上昇ワードランキングをapiを利用して取得。

<?php
	$url = "http://www.google.co.jp/m/services/trends/get";
	$rss = simplexml_load_file($url);
	$i=0;
	
	$html_word_ranking.="<ol>";
	
	foreach ($rss->item as $value) {
		$i++;
		if($i<=10){
		$html_word_ranking.="<li>".$value->query ."</li>";
		}
	}

	$html_word_ranking.="</ol>";

?>

		<h2>グーグル 急上昇ワードの取得</h2>
		<pre><?=$html_word_ranking?></pre>
		<p>
		グーグルの急上昇ワードを取得した結果。
			
		</p>

明日はこれを使ってマッシュアップ

yahooの画像検索apiを利用する。

<?php
	$request_url="http://search.yahooapis.jp/PremiumImageSearchService/V1/imageSearch?";
	$api_id="自分のアプリケーションID";
	

	if(isset($_GET["submit"])){		
		$query=$_GET["query"];
		$query=htmlspecialchars($query);
		$request=$request_url."appid=".$api_id."&query=".$query;
		
		$xml=simplexml_load_file($request);
		
		foreach($xml->Result as $value){
			$url=$value->Url;
			$title=$value->Title;
			$thumbnail_url=$value->Thumbnail->Url;
			
			$html_table.='<table border="1"><tr><td rowspan="2"><a href="'.$url.'"><img src="'.$thumbnail_url.'"></a></td><td>タイトル:'.$title.'</td></tr><tr><td>URL:'.$url.'</td></tr></table>';
			}
	}


?>

<html>
<body>
		<h2>ヤフー画像検索</h2>
		<p>
			下記に画像検索した文言を入力してください。
			
			<form action="<?php $_SERVER["PHP_SELF"]?>" method="get">
				検索したいワード<input type="text" name="query" value="<?=$query?>" size="30">
				<input type="submit" name="submit" value="検索">
			</form>
			<hr>
			<h3>検索結果</h3>
			<?=$html_table?>
		</p>
</body>
</html>

MacBook Airのケースに無印良品のフェルトケースがぴったり。

MacBook Airのケースにちょうどいいものをずっと探していたのですが、ネットで無印良品のフェルトケースがちょうどいいというエントリーがはてぶで話題になっていたので、僕もちょっと買ってみました。

MacBook Airを優しく守る無印良品のフェルト製封筒がシンプルで使える!

話題の品はこれですね。
再生フェルト丸留め付きケース グレー・大
ネットで買っても良かったのですが、やはり実物を見たくて最寄りの店舗へ。1500円也。

大きさはMacBook Airが余裕で入るサイズ。

厚さは1〜2mmというところでしょうか。フェルトなのでクッション性はそれほど期待できないかもしれませんが、バッグに一緒に入れたもので傷つけられることはなさそうです。



一番最初に、蓋を止めるボタンが外れてしまいそうな気がします。しかし、面倒なので、そもそも蓋をひもで締める事自体あまりなさそうな気もします。要は、バッグに入れる際に筐体を保護できれば良いので。

それにしても1500円というのはお値打ち。同類の商品が出ていますが、こちらはMacBook Air用ということもあり、結構なお値段。

ハンドメイドフェルトケース MacBook Air13インチ用 オレンジ

ハンドメイドフェルトケース MacBook Air13インチ用 オレンジ

ハンドメイドと謳ってますからね。触ったことは無いですが、たぶん質は良いのでしょう。ただし、扱い方によっては毛玉ができてしまうそうです。5000円だして毛玉ができてしまうのはちょっとショック。
そういう点ではこの無印良品のケースはお手頃。是非お試しあれ。

ある日突然、MacBook Airが充電できなくなった。

MacBook AirをMagSafe電源アダプタつないでも充電できなくなりました。アダプタにLEDがついているんですが、これが全く光らないんです。

ネットで調べてみると、充電できないという事象は結構あるみたい。だからその対処法もたくさん出てます。充電できない原因はいくつかあるようです。

MagSafe電源アダプタを一分間外してみる。

Appleのトラブルシューティングの中に、電源が入らないことについての対処が掲載されております。
Intel-Based Apple Portables:電源が入らないコンピュータのトラブルシューティング
いくつかありますが、見た目でどこかが壊れていないようであれば、まずは「電源アダプタをコンセントおよび MacBookMacBook Air、または MacBook Pro から外します。1 分間待機します。」を試してみると良いでしょう。
僕の場合、これでは治りませんでした。

SMC(システム管理コントローラー)リセットで治る場合

MacBook Airの電源管理をしている部分がSMC(システム管理コントローラー)というらしいのですが、ここが問題を起こして正常にmagsafe電源アダプタを認識できていない場合があります。対処方法としてはこのSMCをリセットすることで治ります。リセット方法はAppleのサポートページに記載してあります。

Intel-based Macs:SMC (システム管理コントローラ) のリセット

電源OFFの状態で、「shift-control-option」キーを押しながら電源ボタンを押すとSMCがリセットできます。上記のURLにはちゃんと書いてありませんが、Appleケアサポートに電話して聞いたところ、SMCリセットが成功するとLEDが一瞬点滅するそうです。SMC成功の後は通常通り、電源を立ち上げます。

もしSMCリセットをしてもmagsafe電源アダプタのLEDが光らなかったら、この電源アダプタかMacBook Air本体(ハードウェア)に問題があると考えた方が良いかもしれません。僕の場合はLEDが光らず、この対処方法では治りませんでした。

バッテリーが冷えているために充電できない場合

MacBook Airの本体(バッテリー)がかなり冷えてしまうと正常に充電できないことがあるようです。確かにバッテリーは冷えるとパフォーマンスが落ちます。そのために充電できなくなっていることが考えられるようですので、対処方法としては本体を暖めることになります。
温めると言っても、お湯をかける訳にも行かないので、室温を上げて本体が温まるのを待つしかありません。僕は日光に当ててみました。しかしこの方法でも治りませんでした。
ちなみに、この症状で悩まれている方は明け方に問題が起こることが多いようです。室温が下がっているからでしょうか。

ダックヘッド(ACウォールプラグ)が壊れている場合

SMCリセットで問題が解決しなかった場合、magsafe電源アダプタに問題がある可能性があります。magsafe電源アダプタは電源アダプタ本体と、ダックヘッド(ACウォールプラグ)および電源ケーブルに分けられます。

ダックヘッド(ACウォールプラグ)は電源アダプタのコンセント部分のアタッチメントですね。

アヒルの頭に似ているらしいんですが、そうは見えないのは僕だけでしょうか。ここが壊れている場合は通電しない可能性があります。もし付属の延長電源ケーブルをお持ちの場合は差し替えてみると良いでしょう。延長電源ケーブルで正常に充電できればダックヘッドに異常があるということになります。
また、このダックヘッドはiPad用の充電アダプタにも使用されていますので、周りにiPadの充電アダプタがあればダックヘッドを交換してみることで検証可能です。

僕の場合は結局この方法でも治りませんでした。

MagSafe電源アダプタに問題がある場合

ダックヘッドではなく、Magsafe電源アダプタ本体に問題がある場合があります。結果から言うと、僕の場合はこのアダプタが問題だったようです。Appleケアサポートとのやり取りによると、こういう事象はそれなりに報告されているようで、買って3ヶ月以内の僕の場合は取り急ぎ無償交換ということになりました。
昨日午前に電話でのサポートで発送の手続きを行ってもらい、予定では4、5日かかるというはずでしたが、なんと今日届きました。クロネコヤマトでの配達でしたが、発送元が「ADSC支店」。これはApple Delivery Support Center支店ということで、Appleの配達関係の日本拠点のようです。噂だと場所は品川。おそらく在庫があったんでしょうね。非常に迅速な対応で助かりました。調べたところ、たとえばMacをカスタマイズしてアップルストアなどで注文すると海外から発送されてきますが、その商品は日本ではこのADSC支店に一旦運ばれて、ここから日本全国に配送されるようです。

これでも治らない場合

上記の内容を試してみても改善しなければ、おそらくご自分で試せる方法はもう無いと思われます。アップルストアや正規サービスプロバイダに持ち込むか、本体を一度Appleケアサポートに送るしかなさそうですね。
いずれにしても、治ってよかったよかった。

まずはインストール。

しばらくの間はwordpressを使い倒してみます。こういったCMSMovableTypeならだいぶ前に使ってたんですが、もう触らなくなって久しい限り。

目標はとりあえず、トップページで各種情報をアグリゲーションして見れる感じで、特定の食材の情報サイトを作ってみようかと思います。何の食材かは秘密。でも、ドメインは2年ぐらい前から取得済みです。

で、インストールしたけど、なにこれ、簡単すぎる。

ロリポップだと、2,3回クリックして終了ですよ。movabletypeをインストールしたときは自分でデータベースの設定したりして、それなりにめんどくさかった気がしたんだが。簡単インストールってすばらしい。

次に考えるのはサイトの構成かな。テーマは決まっているわけだから、そのテーマに沿ったもので、内容に応じてカテゴライズしてアップ、という至極簡単な感じでまずはやってみる。



wordpressの入門書・解説書を買うべきだろうか。なんか大体触ってればわかってきそうな気もするけど。評価が高いのはこの辺かな。

WordPress レッスンブック 3.x対応

WordPress レッスンブック 3.x対応

WordPress 3 サイト構築スタイルブック

WordPress 3 サイト構築スタイルブック

うーん、中身をチラ身できないだろうか。そうすれば必要なのかどうかがわかるんだけど。悩むなぁ。