データベース(SQLite3?)を利用した簡単なlinebotアプリを作る(アプリ作成編)

baku1101.hatenablog.comの続きになります.

作成アプリの要件(再掲)

  • スタート,エンドがあり,その間の時間を計る
  • (スタート,エンドの時間自体もあるといい)
  • 計った時間を(少なくとも1ヶ月は)保存する
  • 月末にその月に計った時間の合計を送る

kitchensinkを試す

linebotはいくつかのサンプルが公式のgitで用意されており,その中でもkitchensinkは使える機能を網羅しているので,これを試しながらどうやって作るか考えていきます.
kitchensinkのリポジトリはここ
line-bot-sdk-python/examples/flask-kitchensink at master · line/line-bot-sdk-python · GitHub
なお,サンプルコードは以下のように一部書き換えました(修正前はwebhookが機能しなかった,portの問題?)

いくつか試してみたところ,buttonsにスタート,エンドをつければ良さそうかなという気持ちになりました.
kitchensinkにおけるbuttonsのサンプル実装と見た目はこんな感じです.

f:id:baku1101:20190411205928j:plain

なお,PostbackActionは受け取ったdataによってlinebot側が取る行動を変えられるactionです.サンプル実装はこんな感じ(pingボタンを押すとlinebotがpongを返します)

実装を考える

  • start, endボタンを作る
    • 押された時の挙動(データベースの作成や保存)は前回作ったやつをうまく使う
  • 今データベースに格納されているデータを取り出すボタンも欲しい(show)
    • 月ごとに取り出せると嬉しい -> DatetimePickerActionなる便利なものがあったので利用する
  • 間違えて入れたデータを削除するボタンも欲しい(del)
    • データを選択して削除させる方針は難しそう (データにidがついてればできる?)
    • とりあえず直近のデータが消せれば十分かな?
  • 直接データを挿入できるボタンもあると嬉しい(insert)

とりあえずこんな感じで良さそうかな.

実装する

てことで実装しました.大きく詰まった点は以下の2つで

実際の実装はこれです.linebotのメインがmain.pyで,データベース関連の操作を行う関数群がmydatabase.pyということにしています.

なお,lineアカウントのaccess_token, secretキーはheroku の環境変数として設定しています(main.py:56,57).設定方法は
$ heroku config:set LINE_CHANNEL_SECRET="シークレットキー" --app アプリ名
こんな感じでできます.
それと,herokuでdatetime使う時はheroku側のタイムゾーンの設定をする必要があります.
$ heroku config:set TZ='Asia/Tokyo'

問題

とりあえずこれで動いたのですが,ものすごく大きい問題が判明してしまい...
herokuにはファイルが保存できない(時間でリセットされる)ので,データベースファイルが保持できない!!
ということで,次でherokuのデータベース(postgreSQL)を利用するように改修する予定です.最初からそうしときゃよかったなあ...