sasau’s diary

作ったもので2年に一回くらいの更新を目指す

指定した聖書の箇所を読み上げるslack bot

この記事はSlack Advent Calendar 2016 - Qiita の 20 日目です。

文字どおり私事なのですが、privateなslack teamを利用しています。その中でタイトルのようなbotを稼働させていまして、いわゆるアドベントカレンダーに合っているな、と思ったので、紹介をしたいと思います。

はじめに

聖書は旧約聖書新約聖書があり、それらはいくつかの書物から成り立っています。
さらに本文中には章番号と節番号が振られており、聖書の箇所を指定するときは
[新|旧]約聖書, 書物の名前, 章の数字, 節の数字
という形式で行います。(慣れている人は書物の名前で新旧はわかるので省略することも多いです)
例:
旧約聖書 創世記1章1節


聖書の参照を簡単にしたいというのはモチベーションとしてあったのですが
日本聖書協会のWebサイトにて聖書の本文を検索出来るフォームが公開されていて、これに前述の内容を入れることで目当ての聖書の箇所の本文を閲覧することができます。
こういうフォームへの入力をSlackを使って対話形式にできたらいいな、と考えて作りました。

実装

Python3で書いています。*1

本文検索を行うコードはgistにあります。
bible_search.py · GitHub

これを、

from random import choice
from bible_search import SearchQuery, BibleSearch


def bible_search_sequence(text):
    query = SearchQuery(text)
    if not query.ready:
        yield '聖書の箇所がよくわからないな。ごめんね。'
        return

    sections_text = ''
    if query.section_from:
        if query.to_end_of_section:
            sections_text = ' {}節から終わりまで'.format(query.section_from)
        elif query.section_to:
            sections_text = ' {}節から{}節'.format(query.section_from, query.section_to)
        else:
            sections_text = ' {}節'.format(query.section_from)

    yield '`{}、{}の{}章{}`だね。{}'.format(
        query.bible_name,
        query.book_name,
        query.chapter,
        sections_text,
        choice([
            'うん、頑張るね。',
            '{}、どんな箇所だろう。'.format(query.book_name),
            'ふふ。聖書読むの大好き。',
            '聖書を持ってくるからちょっと待ってね。',
            'ええと、その箇所は...。',
            'わかった。任せてよ。'])
    )

    bible_text = BibleSearch.search(query).text()
    if bible_text:
        yield '```{}```'.format(bible_text)
    else:
        yield 'あれ?その箇所はないみたい。'

こんな感じに使って返答を作っています。

bot: bibledog

そして稼働しているbotbibledogです。こんな感じに喋ってくれます。

f:id:ssuwam:20161213151153p:plain

f:id:ssuwam:20161213152345p:plain

  • botがjoinしているchannelに投稿された「読んで|よんで」に反応して、その聖書の箇所をpostしてくれる。
  • 書物の名前は省略にもだいたい対応、読み上げる箇所は1節から最大1章まで。

終わりに

メッセージという一つのUIでやりとり出来るのは便利で楽しいですね。
また普段、聖書を開いている時に複数の箇所を見たい時は、聖書についている紐を使ったり、しおりや指を挟んでおいたりしますが、タイムラインに並べて表示できるのは捗ります。
他には源氏物語など、章節が振られている書物などは同じようにやってみると面白いかもしれません。
最後に、アドベントカレンダーということなので、少し長いですがクリスマスの箇所、特にページェントでよく参照される箇所を読んでもらいたいと思います。

ルカによる福音書 2章1節から20節を読んで。

f:id:ssuwam:20161213153719p:plain

それではよいクリスマスを。

謝辞

引用している聖書の日本語訳は新共同訳です。
(c)共同訳聖書実行委員会 Executive Committee of The Common Bible Translation (c)日本聖書協会 Japan Bible Society , Tokyo 1987,1988

*1:言及していませんがPythonによるSlack APIのインターフェース実装には github.com を使用しています。