パートナーとの割り勘を助けるSlackbotをHerokuでデプロイし、自宅サーバー無しで運用する
@ Tanao · Wednesday, Apr 15, 2020 · 2 minute read · Update at Apr 16, 2020

割り勘を便利にするための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で支払い額を管理

家計簿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ライブラリを使用しました。

今回開発したbotのソースコードは、要望があれば整理して公開しますが、 ここでは概要のみ説明します。

以下の処理を実装しました。

  • Slackのあるチャンネル内での「割り勘」や「立替」で始まるユーザーの発言を受け取る
  • 発言者を支払者とする
  • 支払額をパース(抜き出し)する
  • botの前回の発言(各ユーザの支払い総額の履歴が記されているもの)を探し、取得する
  • どちらがいくら借金しているかを計算する
  • 計算結果をSlackのチャンネルでbotから発言する

初期化したい場合(借金の履歴をチャラにする場合)は、「割り勘 リセット」の発言を受け取ることで初期化するように実装しました。

botの発言は、attachmentsを使い、見やすいレイアウトにしました。 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本体を用意」ですが、昔と今ではやり方がやや異なるそうです。 今のやり方については以下の記事が参考になりそうです。

本トピックのまとめですが、ざっくりいうと、 「Slackのbotを用意し、Pythonのライブラリを使って機能を追加した」 ことになります。

開発したソースコードをGitで管理

ソースコードはBitBucketで管理しています。

(今回、必須ではないですが、一応書いておきました。)

Herokuでデプロイ

私的に今回の本題です。 初めてHerokuというサービスを使うので、ワクワクしながら作業しました。

まずHerokuのユーザ登録をし、新規アプリを作成します。

今回はPythonを動かしたいので、PythonのBuildpacksを選択しておきます。

その後、ローカルPCから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のbotも作ってみたいですね。

いずれにせよ、今回はHerokuの良い勉強になったので満足です。

今後

今後ですが、ソースコードの継続改良を見据え、 BitBucketにpushするとHerokuのリモートリポジトリにも反映されるようにする方法を試してみたいです。

以上です。

Tanao's blog
好きなものをゆるくつづる

gadget heroku hugo ifttt it netlify python raspberrypi rss service slack vim アウトドア ハンドメイド 写真 家具家電 日常 生活術 育児

© 2020 Blog by Tanao

Powered by Hugo with theme Dream.

プライバシーポリシー

Google Analytics

当ブログではアクセス解析ツールとしてGoogle Analyticsを使用しています。 Google AnalyticsではCookieを使用したデータ収集をしています。 情報の扱いやCookieの消去方法について、詳しくはこちらをご覧ください。

免責事項

当ブログにはなるべく正しい情報を掲載するように努めていますが、 意図せず古い情報や誤情報を掲載する可能性もあります。 当ブログに掲載した情報やリンク先によって生じた損失、損害等について 一切の責任を負いかねますので、ご了承ください。

About me

  • tanao
    • アラサー会社員(育休中)
    • 情報処理系のお仕事
    • 夫と娘(0歳)の3人暮らし

本ブログでは気の向くままに好きなことをつづります。

  • 技術・ガジェット
  • 育児
  • 生活術
  • アウトドア
  • 写真
  • ハンドメイド・工作
  • etc.

以下のブログランキングサイトに登録しています。

ブログランキング・にほんブログ村へ

Social Links