どんなBotか
弊学では以前から大学が発信する学内情報を流してくれるBotを運用してくださっていた人がいて, 昨年度末に卒業され, そのBotが稼働停止となってしまいました. そのBotには非常にお世話になっていたので, 開発者の方から譲っていただくことも提案してくださいましたが, 自分の勉強がてら, 車輪の再発明ですが, やってみることにしました.
このBotがすることは単純で以下の通りです.
- 大学の情報が得られるページにログイン
- 自分が持っているデータとの差分を取ってツイートする
サーバーでやっていること
データ取得部
言語: Bash + Node.js
このBotを作るにあたって最初の課題になったところです.
まず, どうやってidやpasswordが必要なページにログインするのかを調べる必要がありました.
JavaScriptを触ったことがあったので, それで目的のページに遷移する方法は調べながら理解しました.
じゃあどうやってJSをサーバーで動かすんだ???ってなって(語彙不足のため調べ方がわからず)数日調べたところ, Selenium webdriver+Node.jsを使えばできそうとのこと. Node.jsの非同期処理に苦しませられながらも, ウンウン言いながらどうにか実装. 動いた. 嬉しい.
時々ページの取得に失敗します. そのときはどうしようもないので, 以前のデータを更新しないようにrollbackしてあげます.
データ整理部
言語: Bash + Python3
得たデータをどうやって管理したらいいんだ?ってなり, また数日.
データ整理にはいくつか案があって,
- データ整理せずにそのままにしておく
- データ整理をしてすべてを1つのテキストで管理する
- データ整理をしてすべてを1つのJSONで管理する
- テータ整理をしてそれぞれの内容ごとにテキストで管理する
- データ整理をしてそれぞれの内容ごとにJSONで管理する
あたりだったはずです. 結局このデータ整理部では最後の案を採用して実装を行いました.
このデータ整理もなかなか曲者で, 得たhtmlにはある程度のフォーマットは存在したのですが, 微妙に クソ ぶれていて, その対処が難しかったです. 正規表現でごりっとやりました.
得たデータは前に存在したデータと比較して, 同じデータがあれば削除, 新しいデータに存在しない過去のデータがあればこれまた削除, という $O(n^2)$ (ただし $ n \le 150 $)で操作をしました. 文字データをhash化して比較すればより早くなるはずですが, めんどくさいのでやってません.
データ出力部
言語: Bash + Python3
決まったフォーマットで出力するだけ.
おしまい.
調子はいかかが?
そこそこには動いてくれているようです.
つい一昨日なんか1回再起動かかりましたが, 1週間位は安定して稼働してくれたようで作者としては嬉しいことこの上ないです.
今後の展望
まだいくつか課題は残っています.
取得したHTMLのパターンの例外処理が足りていようで, 時折htmlの構文が混じったまま出力されることがあります. そんなexampleが集まらなかったのもあって, 最初は対処することができませんでしたが, 今ならできそうです. そのうちやりたいですね.
また, エラーメッセージを出し得るので, そのメッセージを取りこぼすことが無いようにSlack等で通知する機能がほしいと思っているので, それの実装をしたいんですが, なんかうまく通知できなくて困っています. これは早急にやりたいところです.
あとは, 講義時間の変更のところ. 私がこれを作り上げたときにはまだ春休みで, 講義時間の変更のところの情報がまったくなかったのです. 実験しようがなかったのでしゃあなしにほっていましたが, 今なら作ることができそうです. そのうち作ります.
といった感じでしょうか. そこそこに頑張っていきたいですね.