CiNii Books APIのJSON、クロスドメイン通信対応

2017/05/11 サンプルコードを少し修正


10月11日にCiNii Books の改修がリリースされました。
http://ci.nii.ac.jp/info/ja/index_2013.html#20131011-3
内容説明や目次の検索機能の提供や著者名ヨミの表示といった機能が追加されていますが、Li:d tech的に熱いのは、CiNii Books APIJSON対応やクロスドメイン通信への対応です。

クロスドメイン通信への対応

通常、Javascriptはセキュリティの問題から、異なるドメインのデータファイルへのアクセスは遮断されます。それを回避するためにこれまではデータの受け渡しをするためだけの別のプログラムを書くなどする必要がありました。今回の改修により、CiNii Books側でhttpヘッダに「Access-Control-Allow-Origin: *」という情報が追加されたことにより、そのような手間は不要になりました。

JSON対応

これまでデータの出力フォーマットはHTMLかRSSの2種類でしたが、JSON形式でも出力できるようになりました。JSONはHTMLやRSSに比べてよりプログラムで処理しやすいフォーマットです。そして、その中でもRDFのデータをJSONの文法に則って、Linked DataとするJSON-LDという形式で提供されています。*1
以下、CiNii Booksからタイトルに「高麗」というキーワードを含む図書のタイトルと所蔵館数を出力するサンプルです。

#coding:utf-8
import requests

baseurl="http://ci.nii.ac.jp/books/opensearch/search?"
query={"format":"json","title":"高麗","count":10}

r=requests.get(baseurl,params=query)
#for i in r.json()["@graph"][0]["items"]["rdf:li"]:#修正前
for i in r.json()["@graph"][0]["items"]:#レスポンスをJSONで受け取り、検索結果の一覧を取得
    print i["title"]+":"+i["cinii:ownerCount"]#検索結果の最初から順番にタイトルと所蔵館数を出力

#以下、出力結果
高麗:0
高麗野:4
高麗史:7
高麗史:52
高麗青瓷:2
高麗史:160
高麗史:5
高麗鏡 研究:4
高麗史節要:2
高麗犬:1

PythonのRequestsモジュールでCiNii Articlesのデータ取得 - よしなしごとをすこし修正したものです。このケースだと@graph要素直下が配列である必要はない気がしましたが…。

今回の改修でこれまでよりさらにCiNii Books APIを使用したプログラミング環境が整いました。ArticlesのAPIでも同様の実装を期待しています。

11月18日までCiNiiのアンケートが実施されていますので、是非日頃の感謝や要望を届けましょう。*2

https://portaltools.nii.ac.jp/cgi-bin/enquete/form/ciniiarticles_2013/
https://portaltools.nii.ac.jp/cgi-bin/enquete/form/ciniibooks_2013/

*1:JSON for Linking Data W3C勧告はまだ行われていませんが、一般に公開されています。JSON形式の上に@graphや@idなど語彙定義などが行われているようです。

*2:全件ダンプとか、ログの公開とか書きました…。可能な範囲で…