Go 言語用青空文庫 API クライアント・パッケージ
本パッケージは青空文庫 API へアクセスできる Go 言語用クライアント・パッケージだ。 API を通じて青空文庫に収録されている作品情報等を取得できる。
なお goark/aozora-api パッケージは Go 1.16 以上を要求する。 ご注意を。
インポート
import "github.com/goark/aozora-api"
簡単な使い方
作品情報の取得
たとえばタイトル名「天に積む宝」著者名「富田倫生」を検索キーとして青空文庫 API から作品情報を取得してみる。
package main
import (
"bytes"
"fmt"
"io"
"os"
"github.com/goark/aozora-api"
)
func main() {
b, err := aozora.DefaultClient().SearchBooksRaw(
aozora.WithBookTitle("/天に積む宝/"),
aozora.WithBookAuthor("富田倫生"),
)
if err != nil {
fmt.Println(err)
return
}
io.Copy(os.Stdout, bytes.NewReader(b))
}
検索オプションは以下の関数と連動している。
これらの関数をaozora
.Client.SearchBooksRaw()
関数の引数に指定する。
オプション名 | 対応する関数 |
---|---|
title |
aozora .WithBookTitle(string) |
author |
aozora .WithBookAuthor(string) |
fields |
aozora .WithBookFields(string) 1 |
limit |
aozora .WithBookLimit(int) |
skip |
aozora .WithBookSkip(int) |
after |
aozora .WithBookAfter(time.Time) |
aozora
.Client.SearchBooksRaw()
関数は API を通じて取得した結果(JSON 形式)をそのまま返す。
$ go run sample.go | jq .
[
{
"book_id": 59489,
"title": "「天に積む宝」のふやし方、へらし方",
"title_yomi": "「てんにつむたから」のふやしかた、へらしかた",
"title_sort": "てんにつむたからのふやしかたへらしかた",
"subtitle": "著作権保護期間延長が青空文庫にもたらすもの",
"subtitle_yomi": "ちょさくけんほごきかんえんちょうがあおぞらぶんこにもたらすもの",
"original_title": "",
"first_appearance": "",
"ndc_code": "",
"font_kana_type": "新字新仮名",
"copyright": true,
"release_date": "2019-01-01T00:00:00.000Z",
"last_modified": "2018-12-24T00:00:00.000Z",
"card_url": "https://www.aozora.gr.jp/cards/000055/card59489.html",
"base_book_1": "インターネット図書館 青空文庫",
"base_book_1_publisher": "はる書房",
"base_book_1_1st_edition": "2005(平成17)年11月15日",
"base_book_1_edition_input": "2005(平成17)年11月15日初版第1刷",
"base_book_1_edition_proofing": "2005(平成17)年11月15日初版第1刷",
"base_book_1_parent": "",
"base_book_1_parent_publisher": "",
"base_book_1_parent_1st_edition": "",
"base_book_2": "",
"base_book_2_publisher": "",
"base_book_2_1st_edition": "",
"base_book_2_edition_input": "",
"base_book_2_edition_proofing": "",
"base_book_2_parent": "",
"base_book_2_parent_publisher": "",
"base_book_2_parent_1st_edition": "",
"input": "富田晶子",
"proofing": "雪森",
"text_url": "https://www.aozora.gr.jp/cards/000055/files/59489_txt_66663.zip",
"text_last_modified": "2018-12-24T00:00:00.000Z",
"text_encoding": "ShiftJIS",
"text_charset": "JIS X 0208",
"text_updated": 0,
"html_url": "https://www.aozora.gr.jp/cards/000055/files/59489_66714.html",
"html_last_modified": "2018-12-24T00:00:00.000Z",
"html_encoding": "ShiftJIS",
"html_charset": "JIS X 0208",
"html_updated": 0,
"authors": [
{
"person_id": 55,
"last_name": "富田",
"first_name": "倫生"
}
]
}
]
図書カード No. が分かっている場合は aozora
.Client.LookupBookRaw()
関数で作品情報を取得できる。
func main() {
b, err := aozora.DefaultClient().LookupBookRaw(59489)
if err != nil {
fmt.Println(err)
return
}
io.Copy(os.Stdout, bytes.NewReader(b))
}
aozora
.Client.SearchBooks()
または aozora
.Client.LookupBook()
関数を使うと結果を aozora
.Book
構造体で返す。
book, err := aozora.DefaultClient().LookupBook(59489)
aozora
.Book
構造体の構成は以下の通り。
//Author is entity class of author and translator info.
type Author struct {
PersonID int `json:"person_id"`
LastName string `json:"last_name"`
FirstName string `json:"first_name"`
}
//Book is entity class of book info.
type Book struct {
BookID int `json:"book_id"`
Title string `json:"title"`
TitleYomi string `json:"title_yomi"`
TitleSort string `json:"title_sort"`
Subtitle string `json:"subtitle"`
SubtitleYomi string `json:"subtitle_yomi"`
OriginalTitle string `json:"original_title"`
FirstAppearance string `json:"first_appearance"`
NDCCode string `json:"ndc_code"`
FontKanaType string `json:"font_kana_type"`
Copyright bool `json:"copyright"`
ReleaseDate Date `json:"release_date"`
LastModified Date `json:"last_modified"`
CardURL string `json:"card_url"`
BaseBook1 string `json:"base_book_1"`
BaseBookPublisher1 string `json:"base_book_1_publisher"`
BaseBookFirstEdition1 string `json:"base_book_1_1st_edition"`
BaseBookEditionInput1 string `json:"base_book_1_edition_input"`
BaseBookEditionProofing1 string `json:"base_book_1_edition_proofing"`
BaseBookParent1 string `json:"base_book_1_parent"`
BaseBookParentPublisher1 string `json:"base_book_1_parent_publisher"`
BaseBookParentFirstEdition1 string `json:"base_book_1_parent_1st_edition"`
BaseBook2 string `json:"base_book_2"`
BaseBookPublisher2 string `json:"base_book_2_publisher"`
BaseBookFirstEdition2 string `json:"base_book_2_1st_edition"`
BaseBookEditionInput2 string `json:"base_book_2_edition_input"`
BaseBookEditionProofing2 string `json:"base_book_2_edition_proofing"`
BaseBookParent2 string `json:"base_book_2_parent"`
BaseBookParentPublisher2 string `json:"base_book_2_parent_publisher"`
BaseBookParentFirstEdition2 string `json:"base_book_2_parent_1st_edition"`
Input string `json:"input"`
Proofing string `json:"proofing"`
TextURL string `json:"text_url"`
TextLastModified Date `json:"text_last_modified"`
TextEncoding string `json:"text_encoding"`
TextCharset string `json:"text_charset"`
TextUpdated int `json:"text_updated"`
HTMLURL string `json:"html_url"`
HTMLLastModified Date `json:"html_last_modified"`
HTMLEncoding string `json:"html_encoding"`
HTMLCharset string `json:"html_charset"`
HTMLUpdated int `json:"html_updated"`
Translators []Author `json:"translators"`
Authors []Author `json:"authors"`
}
作家情報の取得
今度は作家名「富田倫生」を検索キーとして青空文庫 API から作家情報を取得してみる。
func main() {
b, err := aozora.DefaultClient().SearchPersonsRaw(
aozora.WithPersonName("富田倫生"),
)
if err != nil {
fmt.Println(err)
return
}
io.Copy(os.Stdout, bytes.NewReader(b))
}
実行結果は以下の通り。
$ go run sample.go | jq .
[
{
"person_id": 55,
"last_name": "富田",
"first_name": "倫生",
"last_name_yomi": "とみた",
"first_name_yomi": "みちお",
"last_name_sort": "とみた",
"first_name_sort": "みちお",
"last_name_roman": "Tomita",
"first_name_roman": "Michio",
"date_of_birth": "1952-04-20",
"date_of_death": "2013-08-16",
"author_copyright": true
}
]
作家 No. が分かっている場合は aozora
.Client.LookupPersonRaw()
関数で作品情報を取得できる。
func main() {
b, err := aozora.DefaultClient().LookupPersonRaw(55)
if err != nil {
fmt.Println(err)
return
}
io.Copy(os.Stdout, bytes.NewReader(b))
}
aozora
.Client.SearchPersons()
または aozora
.Client.LookupPerson()
関数を使うと結果を aozora
.Person
構造体で返す。
person, err := aozora.DefaultClient().LookupPerson(55)
aozora
.Person
構造体の構成は以下の通り。
//Person is entity class of person info.
type Person struct {
PersonID int `json:"person_id"`
LastName string `json:"last_name"`
FirstName string `json:"first_name"`
LastNameYomi string `json:"last_name_yomi"`
FirstNameYomi string `json:"first_name_yomi"`
LastNameSort string `json:"last_name_sort"`
FirstNameSort string `json:"first_name_sort"`
LastNameRoman string `json:"last_name_roman"`
FirstNameRoman string `json:"first_name_roman"`
DateOfBirth Date `json:"date_of_birth"`
DateOfDeath Date `json:"date_of_death"`
AuthorCopyright bool `json:"author_copyright"`
}
工作員情報の取得
更に更に工作員名「雪森」を検索キーとして青空文庫 API から工作員情報を取得してみる。
func main() {
b, err := aozora.DefaultClient().SearchWorkersRaw(
aozora.WithWorkerName("雪森"),
)
if err != nil {
fmt.Println(err)
return
}
io.Copy(os.Stdout, bytes.NewReader(b))
}
実行結果は以下の通り。
$ go run sample.go | jq .
[
{
"id": 845,
"name": "雪森"
}
]
工作員 No. が分かっている場合は aozora
.Client.LookupWorkerRaw()
関数で作品情報を取得できる。
func main() {
b, err := aozora.DefaultClient().LookupWorkerRaw(845)
if err != nil {
fmt.Println(err)
return
}
io.Copy(os.Stdout, bytes.NewReader(b))
}
aozora
.Client.SearchWorkers()
または aozora
.Client.LookupWorker()
関数を使うと結果を aozora
.Worker
構造体で返す。
worker, err := aozora.DefaultClient().LookupWorker(845)
aozora
.Worker
構造体の構成は以下の通り。
//Worker is entity class of worker info.
type Worker struct {
WorkerID int `json:"id"`
Name string `json:"name"`
}
Server および Client インスタンスの生成
aozora
.Client
インスタンスの生成は aozora
.DefaultClient()
関数で簡単に行えるが,もう少し細かい制御もできる。
青空文庫 API サーバを指定する
aozora
.New()
関数で aozora
.Server
インスタンスを生成できるが,引数としてサーバを指定できる。
server := aozora.New(
aozora.WithScheme("http"),
aozora.WithServerName("pubserver2.herokuapp.com"),
)
これで青空文庫 API サーバとして http://pubserver2.herokuapp.com
を指定できた。
http.Client を指定する
aozora
.Server.CreateClient()
関数により aozora
.Client
インスタンスを生成できるが,引数として http.Client
インスタンスを指定できる。
client := aozora.New(
aozora.WithScheme("http"),
aozora.WithServerName("pubserver2.herokuapp.com"),
).CreateClient(aozora.WithHttpClient(&http.Client{}))
ちなみに aozora
.DefaultClient()
関数は以下の記述と同等である。
client := aozora.New(
aozora.WithScheme("http"),
aozora.WithServerName("www.aozorahack.net"),
).CreateClient(aozora.WithHttpClient(&http.Client{}))
context.Context 付きのアクセス
青空文庫 API アクセスの際に context
.Context
を付けることができる。
作品情報の取得
rawjson, err := aozora.DefaultClient().SearchBooksRawContext(
context.Background(),
aozora.WithBookTitle("/天に積む宝/"),
aozora.WithBookAuthor("富田倫生"),
)
books, err := aozora.DefaultClient().SearchBooksContext(
context.Background(),
aozora.WithBookTitle("/天に積む宝/"),
aozora.WithBookAuthor("富田倫生"),
)
rawjson, err := aozora.DefaultClient().LookupBookRawContext(context.Background(), 59489)
book, err := aozora.DefaultClient().LookupBookContext(context.Background(), 59489)
作家情報の取得
rawjson, err := aozora.DefaultClient().SearchPersonsRawContext(
context.Background(),
aozora.WithPersonName("富田倫生"),
)
persons, err := aozora.DefaultClient().SearchPersonsContext(
context.Background(),
aozora.WithPersonName("富田倫生"),
)
rawjson, err := aozora.DefaultClient().LookupPersonRawContext(context.Background(), 55)
person, err := aozora.DefaultClient().LookupPersonContext(context.Background(), 55)
工作員情報の取得
rawjson, err := aozora.DefaultClient().SearchWorkersRawContext(
context.Background(),
aozora.WithWorkerName("雪森"),
)
workers, err := aozora.DefaultClient().SearchWorkersContext(
context.Background(),
aozora.WithWorkerName("雪森"),
)
rawjson, err := aozora.DefaultClient().LookupWorkerRawContext(context.Background(), 845)
worker, err := aozora.DefaultClient().LookupWorkerContext(context.Background(), 845)
ブックマーク
参考図書
- プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
- Alan A.A. Donovan (著), Brian W. Kernighan (著), 柴田 芳樹 (翻訳)
- 丸善出版 2016-06-20
- 単行本(ソフトカバー)
- 4621300253 (ASIN), 9784621300251 (EAN), 4621300253 (ISBN), 9784621300251 (ISBN)
- 評価
著者のひとりは(あの「バイブル」とも呼ばれる)通称 “K&R” の K のほうである。この本は Go 言語の教科書と言ってもいいだろう。
- インターネット図書館 青空文庫
- 野口 英司 (著)
- はる書房 2005-11-01
- 単行本
- 4899840721 (ASIN), 9784899840725 (EAN), 4899840721 (ISBN)
- 評価
青空文庫の活動について紹介。作品を収録した DVD も付いてる! 巻末に載っている富田倫生さんの文章は青空文庫に収録されている。
- 本の未来 (Ascii books)
- 富田 倫生 (著)
- アスキー 1997-02-01
- 単行本
- 4756117074 (ASIN), 9784756117076 (EAN), 4756117074 (ISBN)
- 評価
e-book の未来を予見する試みの書。あるいは本とコンピュータの関係について。青空文庫にも収録されている。
-
fields
オプションは効いてない感じ? ↩︎