データベース(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のサンプル実装と見た目はこんな感じです.
なお,PostbackActionは受け取ったdataによってlinebot側が取る行動を変えられるactionです.サンプル実装はこんな感じ(pingボタンを押すとlinebotがpongを返します)
実装を考える
- start, endボタンを作る
- 押された時の挙動(データベースの作成や保存)は前回作ったやつをうまく使う
- 今データベースに格納されているデータを取り出すボタンも欲しい(show)
- 月ごとに取り出せると嬉しい -> DatetimePickerActionなる便利なものがあったので利用する
- 間違えて入れたデータを削除するボタンも欲しい(del)
- データを選択して削除させる方針は難しそう (データにidがついてればできる?)
- とりあえず直近のデータが消せれば十分かな?
- 直接データを挿入できるボタンもあると嬉しい(insert)
とりあえずこんな感じで良さそうかな.
実装する
てことで実装しました.大きく詰まった点は以下の2つで
- python標準のsqliteモジュールはマルチスレッド非対応,linebotはマルチスレッドつかってるっぽい
- apswというモジュールを代わりに使用->SQLiteが本気を出せるPythonのライブラリのAPSWを使用してみる - Qiita (現在はpipでインストールでき
- 1つのbuttonsに登録できるのは4つまでだったみたい
- insertだけメッセージで送ることにする
実際の実装はこれです.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)を利用するように改修する予定です.最初からそうしときゃよかったなあ...