<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>PHP - イチゾーのブログ</title>
	<atom:link href="https://ichizo.biz/tag/php/feed" rel="self" type="application/rss+xml" />
	<link>https://ichizo.biz</link>
	<description>システム開発やWordPressについてなど</description>
	<lastBuildDate>Mon, 20 Mar 2017 15:32:48 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.1</generator>
<site xmlns="com-wordpress:feed-additions:1">120380898</site>	<item>
		<title>Kindle Unlimitedの対象本を検索できるページをPHPで作ってみた</title>
		<link>https://ichizo.biz/2017/03/21/kindle-unlimited-php.html</link>
					<comments>https://ichizo.biz/2017/03/21/kindle-unlimited-php.html?noamp=mobile#comments</comments>
		
		<dc:creator><![CDATA[一蔵]]></dc:creator>
		<pubDate>Mon, 20 Mar 2017 15:32:48 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Amazon Product Advertising API]]></category>
		<category><![CDATA[Kindle Unlimited]]></category>
		<guid isPermaLink="false">http://ichizo.biz/?p=226</guid>

					<description><![CDATA[<p>Kindle Unlimitedの対象本を検索できるページを [&#8230;]</p>
<p>The post <a href="https://ichizo.biz/2017/03/21/kindle-unlimited-php.html">Kindle Unlimitedの対象本を検索できるページをPHPで作ってみた</a> first appeared on <a href="https://ichizo.biz">イチゾーのブログ</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2>Kindle Unlimitedの対象本を検索できるページをPHPで作ってみた</h2>
<p>Kindle Unlimitedを契約して使っていますが、<br />
いまいち検索が使いずらいのが玉にキズです。</p>
<p>Amazonで「Kindle本」のカテゴリページを開くと<br />
Kindle Unlimited対象本の一覧を見ることはできます。</p>
<p>ただ、対象件数が非常に多いので、<br />
１ページずつ見ていくのは現実的ではありません。</p>
<p>洋書（英語の本）も多いので、<br />
英語多読用にKindle Unlimitedで良い本を探したいと<br />
思っているのですが、ペンギンリーダーズやラダーシリーズなど<br />
多読用に向いている本は意外にKindle Unlimitedで<br />
対象になっていなかったりします。</p>
<p>英語多読に使いたい本は、絵本などの簡単な英語の本なのですが、<br />
そういう本でKindle Unlimitedの対象本から探すのが<br />
結構めんどくさかったりします。</p>
<p>ペンギンリーダーズやラダーシリーズがいいと思って<br />
Kindle本カテゴリで検索してみますが、<br />
Kindleでは読めますが、読み放題にはなっていません。</p>
<p>Kindle Unlimiteの対象本を探したいということで<br />
「Kindle Unlimited」をキーワードに検索しても、<br />
「Kindle Unlimited」についての解説をしている本<br />
（タイトルに「Kindle Unlimited」が入っているような本）<br />
しか検索リストに出てきません。</p>
<p>カテゴリを「Kindle Unlimited」のみに絞って<br />
その中から入力したキーワードにマッチした<br />
検索を行いたいのですが、Amazonページ上では<br />
なかなかそれができません。</p>
<p>できないならAmazon Product Advertising APIを<br />
使って検索ページを作ってしまえということで、<br />
ちゃちゃっと作ってみました。</p>
<p>とりあえず、キーワードを入力して<br />
Kindle Unlimitedで一致する結果を<br />
一覧で表示させるという簡便な検索システムを<br />
実装してみました。</p>
<h3>サイトデザインどうしよう？</h3>
<p>とりあえずで作るサイトですが、<br />
あまりにもダサいデザインにはしたくない、<br />
とはいってもデザイナーではないので<br />
自分でちゃちゃっとWEBデザインが<br />
出来るわけではありません。</p>
<p>手軽にできてそれなりの見た目にしたいということで、<br />
Bootstrapを利用しようと思いつきます。</p>
<p>Bootstrapもテーマを利用すると<br />
より手軽に使えるだろうと<br />
Bootstrapテーマを探してみました。</p>
<p>日本語も美しく表示できるという<br />
<a href="http://honokak.osaka/" target="_blank">Honoka</a><br />
というBootstrapテーマがよさそうなので<br />
これを使ってみることにしました。</p>
<h3>プログラムの実装</h3>
<p>最初に<a href="http://honokak.osaka/" target="_blank">Honoka</a>をダウンロードします。</p>
<p>ダウンロードしたファイルを解凍すると、<br />
「honoka」フォルダができるので、<br />
このhonokaフォルダ上に以下の<br />
index.phpとrequest.phpを作ります。</p>
<h4>index.php</h4>
<p>画面表示用のPHPファイルです。</p>
<pre class="lang:php decode:true " title="index.php" >
&lt;?php
if (!empty($_POST['keyword'])) {
    include_once('request.php');
}
?&gt;
&lt;!DOCTYPE html&gt;
&lt;html lang="ja"&gt;
&lt;head&gt;
&lt;meta charset="utf-8"&gt;
&lt;meta http-equiv="X-UA-Compatible" content="IE=edge"&gt;
&lt;meta name="viewport" content="width=device-width, initial-scale=1"&gt;
&lt;!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags --&gt;
&lt;title&gt;Kindle Unlimited検索ページ&lt;/title&gt;

&lt;!-- Bootstrap --&gt;
&lt;link href="css/bootstrap.min.css" rel="stylesheet"&gt;
  &lt;style type="text/css"&gt;
  .col-lg-4 {
    width: 100%;
  }
  .list-group-item-image {
    float: left;
    padding-right: 10px;
  }
  .list-group-item-image img {
    height: 200px;
  }
  @media ( min-width: 568px ) {
  }
  &lt;/style&gt;


&lt;!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries --&gt;
&lt;!-- WARNING: Respond.js doesn't work if you view the page via file:// --&gt;
&lt;!--[if lt IE 9]&gt;
&lt;script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"&gt;&lt;/script&gt;
&lt;script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"&gt;&lt;/script&gt;
&lt;![endif]--&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div class="container"&gt;
  &lt;div class="bs-docs-section clearfix"&gt;

    &lt;div class="row"&gt;
      &lt;div class="col-lg-12"&gt;
        &lt;div class="page-header"&gt;
          &lt;h1 id="navbar"&gt;Kindle Unlimited検索&lt;/h1&gt;
        &lt;/div&gt;

        &lt;div class="bs-component"&gt;
          &lt;nav class="navbar navbar-default"&gt;
            &lt;div class="container-fluid"&gt;

              &lt;div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"&gt;
                &lt;form class="navbar-form navbar-left" role="search" action="index.php" method="POST"&gt;
                  &lt;div class="form-group"&gt;
                    &lt;input type="text" class="form-control" placeholder="Search" name="keyword"&gt;
                  &lt;/div&gt;
                  &lt;button type="submit" class="btn btn-default"&gt;検索&lt;/button&gt;
                &lt;/form&gt;
              &lt;/div&gt;
            &lt;/div&gt;
          &lt;/nav&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;

&lt;?php
if (!empty($_POST['keyword'])) {
?&gt;
    &lt;div class="row"&gt;
      &lt;div class="col-lg-12"&gt;
        &lt;h2&gt;検索結果&lt;/h2&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="row"&gt;
      &lt;div class="col-lg-4"&gt;
        &lt;div class="bs-component"&gt;
          &lt;div class="list-group"&gt;
&lt;?php
    foreach ($item_tags as $item) {
        echo $item;
    }
?&gt;
          &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;?php
}
?&gt;
  &lt;/div&gt;
&lt;/div&gt;

    &lt;!-- jQuery (necessary for Bootstrap's JavaScript plugins) --&gt;
    &lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"&gt;&lt;/script&gt;
    &lt;!-- Include all compiled plugins (below), or include individual files as needed --&gt;
    &lt;script src="js/bootstrap.min.js"&gt;&lt;/script&gt;
  &lt;/body&gt;
&lt;/html&gt;
</pre>
<p>検索を行うと、自分自身にPOSTでキーワードを投げます。<br />
POSTがあると、request.phpを呼び出し、<br />
検索結果を表示するとしています。</p>
<h4>request.php</h4>
<p>続いてはrequest.phpです。<br />
このファイルでは、入力したキーワードに対して<br />
Amazon Product Advertising APIを実行し、<br />
検索結果を一覧に表示します。</p>
<pre class="lang:php decode:true " title="request.php" >
&lt;?php
define("BaseUrl", "https://webservices.amazon.co.jp/onca/xml");

// Amazon APIのアクセスキーとシークレットキーを入力
define("Access_Key_ID", "アクセスキー");
define("Secret_Access_Key", "シークレットアクセスキー");
// アソシエイトIDの入力
define("Associate_tag", "アソシエイトID");

define("KINDLE_UMLIMITED_BROWSE_NODE_ID", "4486610051");

// リクエストのパラメータ作成
$params = array();
$params["Service"]          = "AWSECommerceService";
$params["AWSAccessKeyId"]   = Access_Key_ID;
$params["Version"]          = "2013-08-01";
$params["Operation"]        = "ItemSearch";
$params["SearchIndex"]      = "KindleStore";
$params["Keywords"]         = $_POST['keyword'];
$params["AssociateTag"]     = Associate_tag;
$params["ResponseGroup"]    = "ItemAttributes,Offers, Images";
$params["MinimumPrice"]     = "100";
$params["ItemPage"]         = "1";
$params["BrowseNode"]         = KINDLE_UMLIMITED_BROWSE_NODE_ID;


$base_request = "";
foreach ($params as $k =&gt; $v) { $base_request .= "&amp;" . $k . "=" . $v; }
$base_request = BaseUrl . "?" . substr($base_request, 1);

$params["Timestamp"] = gmdate("Y-m-d\TH:i:s\Z");
$base_request .= "&amp;Timestamp=" . $params['Timestamp'];

$base_request = "";
foreach ($params as $k =&gt; $v) {
	$base_request .= '&amp;' . $k . '=' . rawurlencode($v);
	$params[$k] = rawurlencode($v);
}
$base_request = BaseUrl . "?" . substr($base_request, 1);

$base_request = preg_replace("/.*\?/", "", $base_request);
$base_request = str_replace("&amp;", "\n", $base_request);

ksort($params);
$base_request = "";
foreach ($params as $k =&gt; $v) { $base_request .= "&amp;" . $k . "=" . $v; }
$base_request = substr($base_request, 1);
$base_request = str_replace("&amp;", "\n", $base_request);

$base_request = str_replace("\n", "&amp;", $base_request);

$parsed_url = parse_url(BaseUrl);
$base_request = "GET\n" . $parsed_url['host'] . "\n" . $parsed_url['path'] . "\n" . $base_request;

$signature = base64_encode(hash_hmac('sha256', $base_request, Secret_Access_Key, true));
$signature = rawurlencode($signature);

$base_request = "";
foreach ($params as $k =&gt; $v) { $base_request .= "&amp;" . $k . "=" . $v; }
$base_request = BaseUrl . "?" . substr($base_request, 1) . "&amp;Signature=" . $signature;

$item_tags = ItemSearch($base_request);

function ItemSearch($base_request) {
    $amazon_xml = simplexml_load_string(file_get_contents($base_request));
    $item_tags = array();
    
	foreach($amazon_xml-&gt;Items-&gt;Item as $item) {
		$item_title = $item-&gt;ItemAttributes-&gt;Title; // 商品名
		$item_author = $item-&gt;ItemAttributes-&gt;Author; // 著者
		$item_publicationdate = $item-&gt;ItemAttributes-&gt;PublicationDate; // 発売日
		$item_publisher = $item-&gt;ItemAttributes-&gt;Publisher; // 出版社
		$item_url = $item-&gt;DetailPageURL; // 商品のURL
		$item_image	 = $item-&gt;LargeImage-&gt;URL; // 商品の画像
		
		$item_tags[] = '            &lt;a class="list-group-item clearfix" href="'.$item_url.'" target="_blank"&gt;
                &lt;div class="list-group-item-image"&gt;
                    &lt;img src="'.$item_image.'" /&gt;
                &lt;/div&gt;
                &lt;p class="list-group-item-title"&gt;
                    '.$item_title.'
                &lt;/p&gt;
            &lt;/a&gt;';
	}
	return $item_tags;
}
</pre>
<p>request.phpはGithubの<br />
<a href="https://github.com/manabubannai/amazon-api-test-blog" target="_blank">manabubannai/amazon-api-test-blog</a>を参考にさせていただきました。</p>
<h3>サーバーにアップして公開</h3>
<p>index.phpとrequest.phpができたら<br />
honokaフォルダごとサーバーにアップします。</p>
<p>試しに作ってみたサイトがこれです。<br />
<a href="http://kindle.ichizo.biz/" target="_blank">Kindle Unlimited検索</a></p>
<p>とりあえず作ったサイトは味も素っ気もありませんが、<br />
ここから英語多読用に使えそうな本など<br />
ピックアップできればと考えています。</p><p>The post <a href="https://ichizo.biz/2017/03/21/kindle-unlimited-php.html">Kindle Unlimitedの対象本を検索できるページをPHPで作ってみた</a> first appeared on <a href="https://ichizo.biz">イチゾーのブログ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://ichizo.biz/2017/03/21/kindle-unlimited-php.html/feed</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">226</post-id>	</item>
	</channel>
</rss>
