ふゆにどっこい

phpを使って国立図書館APIとAmazonの画像URLを利用した書籍検索

とりあえず今回やりたいのは書籍検索なので「OpenSearch」というプロトコルを使用

目次

OpenSearchの使い方について調べる
PHPで様々な書籍情報を取得
ISBNを取得する
ISBNを使用してAmazonの画像URLを取得

OpenSearchの使い方について調べる

・探したいキーワードでの部分一致検索(以下URLの結果はこちら)

http://iss.ndl.go.jp/api/opensearch?title=となりの怪物くん

・ISBNを利用して検索(以下URLの結果はこちら)

http://iss.ndl.go.jp/api/opensearch?isbn=9784063655407

・著者名で検索(以下URLの結果はこちら)

http://iss.ndl.go.jp/api/opensearch?creator=ろびこ

・著者名+出版日で検索(以下URLの結果はこちら)

http://iss.ndl.go.jp/api/opensearch?creator=ろびこ&from=2017

もっと詳しく知りたい方は国立図書館が提供しているAPI仕様書(PDF)を確認してみてくださいな(このページの下にスクロールしていくとあるよ)
各リンクをクリックしていただくと分かりますが、XML形式の結果が返ってきます。

PHPで様々な書籍情報を取得

SimpleXMLElementクラスを利用して色々取得してみましょう。
XML形式のデータを取得するサンプルはこちら↓

$url = 'http://iss.ndl.go.jp/api/opensearch?isbn=9784063655407';
$xml = new SimpleXMLElement($url, 0, true);

この場合はオブジェクトとして返ってくるので、「->」という魔法の記述で各タグの様々な情報を取得することが可能です。サンプルコードを載せるので好きにやってみてくださいな(^ω^)

本のタイトルや著者等を取得するには、に囲まれた要素を見る必要があります。
しかしここで問題があります、、、<title>ではなく<dc:title>となっているのです。
これを子ノードというのですが、取得する際はSimpleXMLElementクラスのchildrenメソッドを使うと簡単に取得できちゃいます。

・本のタイトルを取得する

echo $xml->channel->item[0]->children('dc', true)->title;

・本の著者を取得する

echo $xml->channel->item[0]->children('dc', true)->creator;

・本の巻数(漫画とかの情報を取得する時に使うよ)を取得する

echo $xml->channel->item[0]->children('dcndl', true)->volume;

簡単な情報だとこんな感じです。
ただISBNではなくキーワード等で取得した際は本の情報が複数取得することになると思います。
そういった時はループ文で回しちゃいましょう

$url = 'http://iss.ndl.go.jp/api/opensearch?title=となりの怪物くん';
$xml = new SimpleXMLElement($url, 0, true);
$items = $xml->channel->item;

foreach( $items as $item ) {
// なんかいろんな処理
echo $item->children('dc', true)->title;
echo $item->children('dc', true)->creator;
}

ISBNを取得する

<dc:identifier xsi:type="dcndl:ISBN">9784063655407</dc:identifier>

え、これどうやって取得すんの??
childrenメソッドを使用して取得しようとしても dc:identifier という要素が複数あるため確実にISBNを取得できるとは言えません。
そこで必要となる関数が、getDocNamespaces()attributes()の二つです。
xpath()という関数を使用したやり方もあるようなのですが今回はこちらを使用しましょう。
こちらのYahoo!知恵袋の回答一覧にあったコードを使わせて頂いてます(゚人゚)

if ((string)$item->attributes($item->getDocNamespaces(true)['xsi'])['type'] === 'dcndl:ISBN') {
$isbn = (string)$item;
}

これでISBNの取得、ウェーイ

ISBNを使用してAmazonの画像URLを取得

それではISBNを使って画像を取得しましょう!
さすがAmazonと言うべきでしょうか、あるURLを叩くことで簡単に画像を取得できてしまいます。

・「となりの怪物くん第1巻」の画像を取得する

http://images-jp.amazon.com/images/P/9784063655407.09.MZZZZZZZ

URLの構成を詳しく見てみましょう
「http://images-jp.amazon.com/images/P/」以降の「.」区切りで指定されている英数字が肝です。

・ISBNの指定
先ほど取得したISBNを以下のように指定してください。
今回は触れませんが、こちらにはISBN以外にもASINコードの指定が可能です。詳しいことは調べてちょ

http://images-jp.amazon.com/images/P/[ISBN]

・国コードの指定
日本は「09」です

http://images-jp.amazon.com/images/P/[ISBN].09

・取得する画像のサイズ指定
取得できる画像サイズは全部で四種類あります。

指定する値 意味
THUMBZZZ 長辺が75pxのサムネイル画像を取得
TZZZZZZZ 長辺が110pxの画像を取得
MZZZZZZZ 長辺が160pxの画像を取得
LZZZZZZZ 長辺が500pxの画像を取得
http://images-jp.amazon.com/images/P/[ISBN].09.[サイズ指定]

お好きな指定方法で画像を取得してみてくださいな〜
ただ、一部画像URLはISBNコードを指定しても取得できなかったりします。Amazonアソシエイトに参加することで使用できる他のAPIが必要だったりするのかもしれません

おまけ

となりの怪物くんは神。

Posted in PHP