カービィカフェのキャンセルを通知するLINE botをPython3で作る。

書こうかやめとくか迷ったネタだったのですが、以下みたいな記事があって、「あ、こういうの書いていいんだ」と思ったので書くことにしました。
年末年始の新幹線をPythonで予約する - ふしみのブログ


カービィカフェ | トレタかんたんウェブ予約をChrome DevToolsで開くと、空き確認用のAPIが存在している事がわかるので、それをそのまま実行してLINE Botで通知すればいいです。

DevToolsのNetwork

準備

LINE Developersから適当にBotを発行してアクセストークンを取得します。For Developerプランだと(友達に登録できる人数に制限がありますが、)無料でメッセージのPushができます。自分用のBotならDeveloperプランで十分でしょう。

チャネル基本設定画面から自分のUserIDとBotのアクセストークンを確認します。今回はCallbackが必要ないのでCallback URLの準備は不要です。

トークンの取得

必要なライブラリをpipで導入します。今回は公式のLINE Bot用のSDKを使いました。
line/line-bot-sdk-python: SDK of the LINE Messaging API for Python.

sudo python3 -m pip install line-bot-sdk

以下のコードをDoS攻撃にならない間隔(2分に1回とか)で定期的に回します。ちなみにコード自体は別のところで公開したやつの改良版です。

import sys
import json
import urllib.request
from linebot import LineBotApi
from linebot.models import TextSendMessage
from linebot.exceptions import LineBotApiError

LINE_ACCESS_TOKEN = '取得したアクセストークン'
LINE_USER_ID = '自分のUser ID'
line_bot_api = LineBotApi(LINE_ACCESS_TOKEN)

restaurant_id = 'jta9560wTJF-1OGWHJwGdFyX1A3dE4wjK4ChQ2pe6kM'
year = '2019' # 空きを確認したい年
month = '1' # 空きを確認したい月
seats = '2' # 席数

url = 'https://yoyaku.toreta.in/web/v1/web_reservations/{}/days.json?year={}&month={}&seats={}'.format(restaurant_id, year, month, seats)

try:
    req = urllib.request.Request(url)
    res = urllib.request.urlopen(req)
    body = json.loads(res.read().decode('utf-8'))
except urllib.error.HTTPError as err:
    print(err.code)
    sys.exit(1)
except urllib.error.URLError as err:
    print(err.reason)
    sys.exit(1)

days = body['result']['days']

day = 1
message = ""

for results in days:
    if results is not None:
        for result in results:
            if result['label'] is not None:
                message += month + '/' + str(day) + ' ' + result['label'] + '\n'
    day+=1

if message != "":
    #print(message)
    try:
        line_bot_api.push_message(LINE_USER_ID, TextSendMessage(text=message.rstrip()))
    except LineBotApiError as err:
        print(err)

空きが通知された。

稼働中のmetabaseを他のサーバに移行する。

本当はAlexa Skillの記事を書きたかったのですが、スクショとか取るのめんどくさくなってしまった。

あらまし

このブログと同じサーバでmetabase(0.31.2)を動かしていたのですが、-Xmxで指定してるヒープ領域を食いつぶす+Full GCが発生しまくる+他のサービスに影響が出そうなので引っ越すことにしました。(チューニング用のパラメータは以下を参考にしています。)

移動先はRaspberry Pi 3 Model Bしかなかったのでそこにしました。動くのか。

移行方法

metabase.db.mv.dbのSETTINGのurlを移行先のものにしたあと、metabase.db.mv.dbとmetabase.db.trace.dbをmetabase.jarと同じ場所において起動したところ、問題なく動作しました。ダッシュボードや管理者の設定も正しく生きています。
urlは移行先のものにしなくても起動できそうな気がします。多分。
Dockerの場合は試していませんが、おそらくdbファイルをホストからマウントすればいけるんじゃないでしょうか。

問題点(未解決)

起動がめちゃくちゃ遅いです。移行前はおよそ3分で起動していたのですが、移行後は7分程度かかるようになりました。ダッシュボードにあるグラフの描画も、移行前と比べて明らかにLoading状態が長いです。
チューニングの問題なのか、ラズパイのスペックが足りてないのか、問題の切り分けができていないので調査して改善できそうならどうにかしたいです。