図書館が開いてるか教えてくれるだけのbotを作った話

概要

”わかりて”

時は2016年4月。人工知能が世の中で盛り上がりを見せる中、某O高専の学生は「図書館今日開いてたっけ」と思った時、お手元の人工知能に尋ねるわけにもいかず、通常は直接足を運ぶか、インターネット上に公開されている「開館カレンダー」を見ることで開館状況を確認する。しかしそのためだけにいちいちPCを起動し、n回のクリックを経てサイトにアクセスするのは面倒だ。もう少し気軽に開館状況を知ることができれば…。
するとそこへ一羽の青い鳥が颯爽と現れ、大丈夫さ、と呟く…。

――そう、Twitterならね。

ということで、今回はPythonの勉強も兼ねて、開館状況を知りたい日付をリプライすると、その日の開館状況を返してくれるだけのTwitterBotを作りました(なお現在(2016/4/3時点)は動作させていません)。

開発環境

OS: Windows7
言語: Python(2.7.11)

開館状況の取得方法を検討する

開館カレンダーは画像に示すように、開館の状況によって日付の背景色を変える表示方法が採用されています。カレンダーはHTMLのtableタグで構成されており、日付がそれぞれtdタグ(セル)に収まっているようです。よって、任意の日付の開館状況を知りたければ、その日付のtdの背景色を取得・判定できれば良さそうです。

開館カレンダーの見た目。開館状況と背景色の対応表も示されている。

スクレイピングの方法を検討する

上記の通り、カレンダーはHTMLで構成されているため、その要素であるtdにアクセスするためにスクレイピングを行います。今回は、pythonでスクレイピングに使用できるライブラリ

を試用しましたが、今回はBeautifulSoup4(以下bs4)を選択しました。bs4ではPure Python以外のHTMLパーサーが選択でき、試用の際にインストールしていたlxmlをパーサーとして選択することで、パース速度と、パース結果の正確性の向上が期待できそうです。

1
2
pip install lxml
pip install beautifulsoup4

ここまでで、bs4のfindメソッド(→doc)を用いてtdタグに以下のようにアクセスできるようになりました。

1
2
3
4
5
from bs4 import BeautifulSoup
# 第1引数にHTMLのデータ(urllibなどで取得してくる)、第2引数でパーサーを指定
soup = BeautifulSoup(HTML_DATA, "lxml")
# findメソッドを使用し、検索条件としてtdの値がDATEのものを探す
td_data = soup.find("td", text=DATE)

また、スクレイピング等のテストで実際のURLにプログラムから何度もアクセスをかけているとそのうち怒られるような気がしたので、スクレイピングに関する全ての動作テストは、実際のカレンダーを模倣したHTMLファイルを作成し、localhost上で行いました。

Twitterとの連携を行う方法を検討する

今回は定期的に呟くタイプのBot形式ではなく、StreamingAPIを使用してリプライに反応するような仕様にしました。特にStreamingAPIにこだわる理由はありませんでしたが、pythonでStreamingAPIを叩いたことがなかったので、やってみたかったという感じです。ライブラリには「twitter(1.17.1)」を使用しました。

1
pip install twitter

Streamingへの接続方法は以下のとおりです。

1
2
3
4
5
from twitter import *
# OAuth認証用のキーを指定して認証情報を生成
auth = OAuth(ACCESSTOKEN, ACCESSSECRET, CONSUMERKEY, CONSUMERSECRET)
# 接続
stream = TwitterStream(auth=auth, domain="userstream.twitter.com")

反応の仕方は、
「@islibopen islib N」(Nは任意の日付)
というリプライを受け取ったら処理を実行し、結果をリプライする、という感じです。

できたもの

図書館が開いているか実際に聞いてみた。やってる事自体は難しくないので、ちゃんと動作している。

Botの公開・運営について

未定です。

作って思ったこととかまとめ

  • td内にstyle属性が直書きされてるタイプのHTMLだったので、ザルな正規表現で背景色が取得できた。
  • 今回は当月分しか対応していないが、201n年n月(カレンダー登録状況に依存するため、限界あり)対応はパラメータを変更することで簡単に実現できる。しかしやっていいのか…。てかそもそも作って使うのだろうか(何かを悟る)。
  • 開発用に新たにTwitterアカウントを作成したが、これまでにもいくつか開発用にアカウントを作成しており、今回ついに巷で噂のスパム確認(電話番号登録)を強いられた(なんとかなった)。
  • 作った後に改めて思ったけどあんまり役に立たない(重要)。
  • カレンダーの正しいスペルは「calend a r」。「calend e r」ではない(重要)
  • 今後のためにも、スクレイピング関連の法律ちゃんと知っておきたい。

以上です。