熊野寮食メニューbotについて

この記事は、Kumano dorm. Advent Calendar 2019 - Adventarの1日目の記事です。

Kumano dorm. Advent Calendar 2019について

このアドベントカレンダーを作ったのは僕(SK (@dkrqr) | Twitter)です。

Kyoto University Advent Calendar 2019 - Adventarに書こうか迷ってるうちに埋まってしまって,でもアドベントカレンダー書いてみたいなぁ楽しそうだなあという気持ちがずっとあったのでNF明けにKumano dorm. Advent Calendar 2019 - Adventarを作ってしまった。

事務室の雑記帳を読んでいると寮生の書く文章は面白いことが多いのでもっと読みたいという気持ちもある。 まだまだ空きがあるのでみんな登録して書いてくれるといいなぁ。

熊野寮食メニューbotの概要

さて,ここから本題。

今回は熊野寮食メニューbotの話を 熊野寮食メニューbotは僕が作ったtwitterbotで,熊野寮の寮食1のメニューを1日に2回,即ち昼にその日のメニューを夜に翌日のメニューをつぶやく。フォローしてね。 botはGAS2で動かしていて,https://menus.kumano-ryo.com/スクレイピングしてつぶやいている。

どうでもいい機能として,ヨーグルトサラダ(好き)と卯の花(嫌い)がでると効果がつくようにしている。 (ヨーグルトサラダは毎週出るようになったし,自分の嫌いなものを主張するのは微妙な気もするのでなくしてもいいかもしれない)

来年度からは新メニューに🈟マークを付けるようにしたい。 ので,今年度前期までのメニューのデータを持ってる人がいたらほしい。 十分なデータがあれば今すぐにでもできるので。

作った理由

元々先述のwebページや食堂には1週間のメニューが貼り出してあった。 しかし,わざわざそれを見るためだけにwebページを開いたり,食堂まで降りるのはめんどくさい。

「今日の寮食なんやろなぁ」みたいな話題になったときに,わざわざ見に行くほどではないなぁとなって終わってしまう。 食べても何かわからんメニューがあったりする3が,見に行くほど気にはならない。

みたいな状況が何回かあったので,気軽に見れるtwitterbotを作ろうと思い立った。

詳しい(技術的な?)話

興味がない人は読み飛ばしてください。 (ここを読み飛ばすと内容が全くないという説もある)

コードはこんな感じ↓ 拡張子.gsはGAS内で使われるファイルで,中身はほぼJavaScriptそのもの。

本当にざっくり説明すると,main.gs内の関数today()tomorrow()をそれぞれ毎日12時前と21時半くらいに実行するトリガー4を設置していて,実行するとメニューが呟かれる。

ただ,ほとんど同じことをするのに各関数の中身は違っていて,tomorrow()では

//明日のメニューを取得
  var date = new Date();
  date.setDate(date.getDate() + 1);
  var stringTomorrow = Utilities.formatDate(date, 'Asia/Tokyo', 'MM月,dd日');
  var menu = getMenu(stringTomorrow);

としてgetMenu()

UrlFetchApp.fetch('https://menus.kumano-ryo.com/');

しているのに対し,today()では

for (var i = 0; i < 3; i++) {
    //script propertyに記録されているメニューを取得
    menu[i] = getMenuProp(i);
    menu[i] = menu[i].replace(/明日/g, '今日');
}

tomorrow()で記録した内容を読み出す形にしている。 というのも前述の🈟マーク機能の実装に必要だったからだ。 新メニューかどうかの判定法を各メニューを今までのメニューの記録と一致するか検索する方法にしている。 前日夜にtomorrow()で新メニューを記録していくので当日昼にtoday()スクレイピングを実行すると新メニューであっても新メニューでないと判断されてしまうので,こういう実装にした。 きっともっとうまい実装の仕方がある気がする。

もう一つ工夫した点として,「10分ごとトリガー」がある。 これをするためにtrigger.gsがある。 https://menus.kumano-ryo.com/は人力で更新されているらしいので毎週更新される時間が異なり,月曜の昼前に更新されることもあれば夜になることもある。 更新されたらなるべく早くつぶやいてほしいので,月曜の0時から10分ごとにスクレイピングし続けて更新されたらやめる,という実装にしてある。 トリガーをスクリプト自身で立てたり消したりできるのでとても便利。

特に工夫した点はこの2つくらいで,twitter.gsは別のbotで作ったものの再利用だし,正規表現をつかったスクレイピングの処理とかはクソみたいな実装で解説するのも恥ずかしいのでこのあたりにしておきます。

あ,twitter.gspostReply()とかpostLongTweet()とかは自分で作って使い勝手が良くて気に入っている。

反応とか

フォロー数こそ34(11/26現在)と少ない5が,「便利じゃん」的なことを言ってくれる人や,フォローしてないけど時々見ている人もいる(フォローしろ)っぽいのでそれなりに嬉しい。

僕もメニューが気になったらときどき見に行くし,TLに流れてきたらふーんくらいには思うので少し寮食の楽しみが増えた気がする。

おわり

アドベントカレンダーといえば技術系の記事という自分の勝手なイメージがあったのでtwitterbotの話題を書いた。 明日以降書く人は寮に関係なくても,どんな話題でもいいので気軽に書いてください。


  1. 寮の食堂で長期休暇以外の平日に3食提供される食事。栄養バランス,量,コスパが良い。詳しい説明は熊野寮HPにあるので興味があれば読んでみて

  2. Google Apps Script。自分でサーバを持たなくていいのでやりたいことを手軽に実現できる。無料。googleすごい。

  3. メニューを見ても分からないこともある。

  4. GASには特定の時刻や特定のイベント後に関数を呼び出す機能がある

  5. 寮生が約400人であることを考えると1割弱がフォローしているのは多いのかもしれない。もうちょっと増えてほしいけどね