割り勘を便利にするためのSlackbotを実装し、 自宅サーバーがない状況でも運用できる状態にしました。
我が家ではSlackbotをいくつか運用しています。 その中のひとつが家計簿botです。
今回、自宅サーバーで運用していた家計簿botを改変し、 Herokuを用いることで、自宅サーバー無しで運用する方法を試しました。
これらの方法の概要について記します。
できたもの
使い方
「割り勘 [割り勘したい金額] [メモ]」で、割り勘した金額を管理します。
また、 「立替 [立替した金額] [メモ]」で、立替した金額を管理します。
ここでは、「発言した人=お金を払った人」というように扱います。
メモは、Slack上で検索したいとき用に残したい場合は入力します。空欄でも大丈夫です。
システム構成図
かなりざっくりとした図ですが、こんな感じで動かします。
- BitBucket
- 開発したソースコードを管理する用
- 後に他人にソースコードを配布する場合に便利
- (GitHubやGitlab的なやつ)
- Heroku
- デプロイ用
- botの機能を常時運用するサーバー代わり
- Slackbot
- チャットボット
- 今回は、金額を管理するチャットボットとして実装
- Slack
- 割り勘や立替した金額を入力するユーザーインターフェース
- スマホやPCなど好きな端末から利用可
ソースコードの開発やHeroku CLIの操作は、Bash on Windows10でおこなっています。
(そろそろ最新版のWSL2を試したい…。)
そもそも家計簿botとは
家計簿bot(我が家で以前から運用していたものであり、 今回作成したbotとは別のもの)では、 夫婦で折半したい生活費を管理します。
夫と私それぞれがこれまでに立て替えた金額をSlackに入力し、 それをデータベース化しておくことで、 現在までにお互いがいくら払い、いくら借金をしている状態かを 管理します。
家計簿botでは、これまでの入力データ(post)をjson形式のログとして取得し、 自宅サーバーのローカルディレクトリに保存することで、 過去の支払い額の照合や、新たな支払い額の更新をおこなっています。
我が家では、この方法で結婚以前から今までの数年間にわたり、家計簿botを利用し続けていました。
家計簿botを改変し、新規開発に至った動機
友人AちゃんからLINEで相談がありました。
友人A「お宅で運用してる家計簿bot、うちでも使えないかな?」
こう返信しました。
私「使ってもらうのはOK!準備方法を夫に確認するわ~」
しかし、残念なことに、家計簿botを管理している夫に確認したところ、 常時起動している自宅サーバーが必要であることが発覚しました。
代案を色々考えました。
- 適当なPCをサーバー利用してもらう
- 友人はサーバー利用できそうなPCを持っていないのでNG
- うちのサーバーでbotの機能を動かす
- 友人宅の入力データ(家計状況)がうちのサーバーに残るのはプライバシー的に良くないのでNG
- 適当なサーバー(ラズパイとか)を購入してもらう
- 初期コスト(お金・労力)が大きいのでNG
- サーバーの機能をクラウドサービスに移管
- データベースを伴うクラウドサービス(AWSなど)は有料となるためNG
どれもこれも微妙で悔しいなと考えていたところ、夫がこう助言しました。
夫「Slackbotの発言に過去の立て替え額を残してそれを都度取得すれば データベース無しの設計でもいけそう。Herokuとかでデプロイできるし」
ということで、上記の設計を試してみることにしました。
これが、今回新たにbotを開発するに至った経緯です。
満たしたい要件
なお、ここで最低限満たしたい要件は以下の通りです。
- パートナー(夫婦や恋人など)との割り勘や立替の金額をSlackbotで管理する
- 自宅サーバーの常時運用が不要な設計にする
- なるべく無料で運用する
- 他展開(他人にも使ってもらえるように)する際、プログラミング不要である
開発
Slackbotで動かす割り勘機能を開発(Python)
まず、Slackbotで動かす割り勘機能を開発しました。
以下のPythonのslackbotライブラリを使用しました。
- 【参考(外部サイト)】github slackbot
今回開発したbotのソースコードは、要望があれば整理して公開しますが、 ここでは概要のみ説明します。
以下の処理を実装しました。
- Slackのあるチャンネル内での「割り勘」や「立替」で始まるユーザーの発言を受け取る
- 発言者を支払者とする
- 支払額をパース(抜き出し)する
- botの前回の発言(各ユーザの支払い総額の履歴が記されているもの)を探し、取得する
- どちらがいくら借金しているかを計算する
- 計算結果をSlackのチャンネルでbotから発言する
初期化したい場合(借金の履歴をチャラにする場合)は、「割り勘 リセット」の発言を受け取ることで初期化するように実装しました。
botの発言は、attachmentsを使い、見やすいレイアウトにしました。 attachmentsに関しては以下の記事が分かりやすく解説してくれています。
- 【参考(外部サイト)】Qiita Slack API attachmentsチートシート
また、処理以外の実装で気を付けた点について述べておきます。
今回、API TOKENやuser名など、公開したくない変数は ソースコードに直書きせず、環境変数にしました。
具体的には、.env
ファイルを用意し、以下の記述をします。
TOKEN = "SlackのAPI TOKENを記述"
CHANNEL_ID = "Botを動かしたいChannelのID(URLの末尾)を記述"
USER1 = "ユーザ名1(自分)を記述"
USER2 = "ユーザ名2(パートナー)を記述"
で、Pythonのソースコードで環境変数を読み込めるようにします。
from dotenv import load_dotenv
load_dotenv(dotenv_path=".env") # load local .env file
import os
TOKEN = os.environ["TOKEN"]
CHANNEL_ID = os.environ["CHANNEL_ID"]
USER1 = os.environ["USER1"]
USER2 = os.environ["USER2"]
これで、余計な情報を公開せずに済みます。 (Herokuでデプロイする際の環境変数指定方法は後で述べます。)
なおここまで、Pythonのslackbotライブラリを用いたbot機能作成に 焦点を当てて書きましたが、 実際には事前準備で色々やることがあります。 以下に例を挙げます。
- Slackの設定(ワークスペース用意、ユーザ登録、チャンネル開設など)
- Slackのbot本体を用意(API TOKEN発行、チャンネル招待など)
昔済ませておいたため、今回はスキップしました。なので間違っていたらすみません。
なお、上で述べた「bot本体を用意」ですが、昔と今ではやり方がやや異なるそうです。 今のやり方については以下の記事が参考になりそうです。
- 【参考(外部サイト)】Qiita Slack API 推奨Tokenについて
本トピックのまとめですが、ざっくりいうと、 「Slackのbotを用意し、Pythonのライブラリを使って機能を追加した」 ことになります。
開発したソースコードをGitで管理
ソースコードはBitBucketで管理しています。
(今回、必須ではないですが、一応書いておきました。)
Herokuでデプロイ
私的に今回の本題です。 初めてHerokuというサービスを使うので、ワクワクしながら作業しました。
まずHerokuのユーザ登録をし、新規アプリを作成します。
- 【参考(外部サイト)】Qiita Pythonで作ったSlackBotを常駐化するまでの備忘録
今回はPythonを動かしたいので、PythonのBuildpacksを選択しておきます。
その後、ローカルPCからHeroku CLIを使ってログインします。
- 【参考(外部サイト)】Heroku公式: The Heroku CLI
Heroku CLIのインストール方法は色々あるのですが、
今回はbash on windows10にて、curl
でインストールしました。
curl https://cli-assets.heroku.com/install-ubuntu.sh | sh
始めは普通にsnap
を使おうとしたのですが、エラーがでました。bash on windows10はsnap
に対応していないようです。
インストール後は、heroku login
でログインします。
この後、Herokuにソースコードをpushするのですが、 その前に以下のファイルを用意する必要があります。
Procfile
- 今回は
[プロセス名]: python3 run.py
と記述
- 今回は
requiments.txt
pip freeze > requiments.txt
で作成可- 明らかに不要なモジュールは消してOK
runtime.txt
- 今回は
python-3.6.10
と記述 - Pythonのバージョンに注意(公式を参照)
- 今回は
次にpushです。 すでにローカルディレクトリにソースコードがあるので、そのディレクトリにて
$ heroku git:remote -a [アプリ名]
$ git push heroku master
すると、Herokuのリモートリポジトリにソースコードが反映されます。
環境変数については、heroku login
した状態で、
heroku config:set TOKEN=hogehuga
というコマンドを打っていけば反映されます。 (HerokuのブラウザからSetting -> Config Varsで入力してもよいと思います。)
で、アプリ(今回でいうとSlackbotのサーバー)を常駐化させるために、以下のコマンドを打ちます。
$ heroku scale [プロセス名]=1
常駐化をやめたい場合は、上記の「1」を「0」にします。
使用状況は、heroku ps
で確認できます。
開発まとめ
以上が、開発からデプロイまでの流れです。
他のパートナー間で使ってもらいたい場合
まだ試していませんが、以下のような段取りで可能かと思います。
- 私がソースコードを公開(GitHubやBitBucketなど)
- ユーザーがソースコードを取得(
git clone
) - ユーザーが以下を用意
- Slackのワークスペース、チャンネル、ユーザー
- SlackbotのToken
- Herokuの新規利用登録
- ソースコードを用いてHerokuにアプリ登録
- 環境変数をポチポチ入力したり常駐化させたりするなど
今回の1つのアプリならば、Herokuの無料枠に収まる範囲だと思います。
まとめ
当初の目的である
- パートナー(夫婦や恋人など)との割り勘や立替の金額をSlackbotで管理する
- 自宅サーバーの常時運用が不要な設計にする
- なるべく無料で運用する
- 他展開(他人にも使ってもらえるように)する際、プログラミング不要である
を、 「データベース不要の割り勘Slackbotを作り、 Herokuでデプロイすることで、 自宅サーバー無しで運用する」 という方法で達成しました。めでたしめでたし。
オチですが、この設計を思いついたときに友人AちゃんにLINEしたら、
友人A「友人BくんがLINEbot作ってくれたので、なんとかなりそう!」
とのことでした(笑)
という訳で、今回作ったSlack botはひとまず放置です。 そもそもSlackよりLINEのほがメジャーですよね…。
なお、LINE botをHerokuでデプロイすることも可能です。
- 【参考(外部サイト)】LINE Developers: Herokuでサンプルボットを作成する
そのうち機会があればLINEのbotも作ってみたいですね。
いずれにせよ、今回はHerokuの良い勉強になったので満足です。
今後
今後ですが、ソースコードの継続改良を見据え、 BitBucketにpushするとHerokuのリモートリポジトリにも反映されるようにする方法を試してみたいです。
以上です。