Line API (Notify API) と Python と Heroku でゴミ出し通知 Bot 作成

# 動機

新たな場所に引越しをしたのですが、以前住んでいた場所とゴミ捨ての曜日が異なり、忘れてしまうことがありました。

そのため、今日は何のごみの日かというのを忘れないように、毎朝午前 7 時 30 分に LINE から通知がくればいいなと思い、作成しました。

## 完成イメージ

![line_message_screen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407150/53c9dd45-bcd8-b571-0c5c-0f65bdd2d575.png)

# 内容

今回は Python 上で LINE の Notify API を使い、Heroku 上で動かしました。

なお、時間指定も Heroku 上で行えるので、それらをまとめて以下に記述します。

# 開発環境

- Windows: 10 Pro
- Python: 3.9.1 64-bit

# Line API (Notify api) について

LINE Notify API は既にご存じかもしれませんが、指定したトークルームにメッセージを送信することができる物です。
なお、返信などはできず、一方的にメッセージを通知するとてもシンプルな機能となっています。

難しい設定などは不要で、とてもシンプルに利用できるので、早速手順を説明しようと思います。

# 手順

## LINE Notify ページでへアクセス

以下の LINE Notify ページの右上から、自身の LINE ID でログインします。

- [Line Notify(https://notify-bot.line.me/ja/)](https://notify-bot.line.me/ja/)

ログイン後、再度 LINE Notify ページの右上から、今度は「マイページ」選択します。

![LINE Notify page.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407150/e2d56334-a92b-c894-c598-08df235e5ea9.png)


## LINE Notify API のアクセストークンを発行

「マイページ」選択後、「アクセストークンの発行(開発者向け)」にある「トークンを発行する」を選択します。

![before token pubiish page.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407150/98506765-330f-160f-cc70-f51a76b6655d.png)


以下のページで、「トークン名」と「通知を送信するトークルーム」を選択します。

- トークン名：メッセージの頭に必ずつく文字となります（例：[ゴミ出し通知]～～、など）。
- 通知を送信するトークルーム：Notify API が通知するトークルームを選択します。個人でもグループでも可。

![token publish page.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407150/148f13b1-686b-25b4-dfb9-a53744845901.png)


上記を記述したら、「発行する」を選択してトークンを発行します。

![published token.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407150/2a086d90-76ed-5ac0-4586-fcc6b570b987.png)


※ 注意書きにもありますが、こちらのトークンは本画面から遷移したら二度と表示されないようです。しっかりメモしておきましょう。

## LINE Notify からの通知を受け取るトークルームに「LINE Notify」を招待

先ほどアクセストークンを発行する際に選択したトークルームに、LINE Notify を招待します。

アクセストークンを発行したからと言って自動的に通知先のトークルームに加入するという訳ではないので注意です。

![friend setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407150/8faeeb98-d325-542c-c8ba-9795ce0c0137.png)


※ 画面はパソコン版の画面です。

## 動作確認

ちゃんとつながったか確認してみましょう。

以下の `ACCESS_TOKEN`に先ほど取得したアクセストークンの文字列を置換してください。

```cmd
curl -X POST -H "Authorization: Bearer ACCESS_TOKEN" -F "message=ABC" https://notify-api.line.me/api/notify
```

以下のような通知が来れば成功です！

![notify api test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407150/32b7e755-d2c6-5080-cf7c-ccafe1185f0b.png)


# Python ソース

Python のソースは以下のサイトを参考にしました。

- [今日は何のゴミ出しの日かを Line に通知してくれるプログラムを作ってみた -- コメント](https://qiita.com/machiiyusuke/items/80de903c624054b3002f#comments)

```garbage_day_alert.py
import datetime
import requests

# 発行されたトークン
ACCESS_TOKEN = "ACCESS_TOKEN"  # LINE Notify で設定したアクセストークンを設定
headers = {"Authorization": f"Bearer {ACCESS_TOKEN}"}

# Line Notify API URL
url = "https://notify-api.line.me/api/notify"

# ゴミ出し曜日情報
DAILY_EVENT = {
    "月": "燃やすゴミ、燃えないゴミ、スプレー缶、乾電池",
    "火": "古紙・古布・段ボール",
    "水": None,
    "木": "プラスチック製容器包装",
    "金": "燃やすゴミ、燃えないゴミ、スプレー缶、乾電池",
    "土": "缶・ビン・ペットボトル、小さな金属類",
    "日": None,
}


def garbage_day():
    weekday = datetime.date.today().weekday()
    # Heroku の設定で述べますが、Heroku側で時間指定起動をするには
    # UST で指定しなければなりません。
    # そのため、JST(日本時間) で AM7:30 を指定したい場合は、
    # Heroku 側で 前日の PM22:30(UTC) を指定しますが、
    # その際に曜日が1 日ずれるので、その分を調整 (+1日) します。
    day, event = list(DAILY_EVENT.items())[weekday+1]
    event and send(f"\n{day}曜日は{event}の日です！")


def send(message):
    data = {"message": message}
    requests.post(
        url,
        headers=headers,
        data=data,
    )


if __name__ == "__main__":
    garbage_day()
```

- [本 Python ソース (GitHub)](https://github.com/kewpie134134/garbage_day_alert)

# Heroku のサービス設定について

Python をサーバーに置く際、簡単に済ませたいと思い、Heroku を選択しました。

この Heroku は Python などのソースをデプロイすることでサーバーの機能を果たしてくれるだけでなく、時間指定なども可能です。

## Heroku へ登録

まずは Heroku へアカウント登録をします。

その後、Heroku CLI というコマンドラインインターフェースをインストールします。

- [Heroku CLI (https://devcenter.heroku.com/articles/heroku-cli#download-and-install)](https://devcenter.heroku.com/articles/heroku-cli#download-and-install)

## Heroku CLI へログイン

コマンドラインで以下を入力します。

```cmd
heroku login
```

その後、先ほど Heroku で登録した際のメールアドレスとパスワードの入力を要求されるので、入力します。

認証に成功すると、無事 Heroku へログインとなります。

## Heroku へデプロイ

Heroku のポータルサイト上の`Deploy`タブにある手順通りに git の設定を行い、先ほど作成した Python のソースをデプロイします。

### Heroku で設定したリポジトリをローカルにクローン

※ <YOUR_APP_NAME> には Heroku 上で作成したアプリ名を入力してください。

```cmd
heroku git:clone -a <YOUR_APP_NAME>
cd <YOUR_APP_NAME>
```

### ローカルで作成した Python ソースを Heroku へデプロイする

Python ソースを 先ほどローカル上に作成した<YOUR_APP_NAME> ディレクトリに置き、Heroku へデプロイすれば良いのですが、それだけでは Heroku 上では動作しません。

そのため、Heroku で Python がうまく動くように設定ファイルなどを準備します。

- Procfile

プログラムの実行方法を記載します。

```Procfile
web: python garbage_day_alert.py
```

- runtime.txt

Python のバージョンを記載するテキストファイルです。

```runtime.txt
python-3.9.1
```

- requirements.txt

インストールするライブラリを記載するテキストファイルです

```requirements.txt
requests==2.25.1
```

上記で準備したファイルを Heroku で作成した<YOUR_APP_NAME>に写し、以下のコマンドを入力して Heroku へデプロイします。

- garbage_day_alert.py
- runtime.txt
- requirements.txt

```cmd
git add .
git commit -am "initial commit"
git push heroku master
```

![Heroku_Deploy_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407150/f70770d0-6bea-e606-9d08-39ed6e0b55e4.png)


これで無事にソースを Heroku 側に push することができました。

動作確認は以下のコマンドで行います。これで LINE 側に通知が来れば成功です。

```cmd
heroku run python garbage_day_alert.py
```

### Heroku 上で指定した時間に起動させる

Heroku の `Resources` タブの `Add-ons` で `Heroku Scheduler` を入力して選択する。

![Heroku_Resources.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407150/94433afa-4e0c-b794-90b4-1e168241e62a.png)


別タブが開くので、右上の`Add Job`を選択して日時指定で起動するように情報を入力します。

![Heroku_addons.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407150/c51e60f6-6ddd-d4b9-f305-cc413fb27ab0.png)

- Schedule: Every day at...
- Time: 10:30 PM (UTC)
  - (注意) Heroku では`UTC`で時間指定する必要があるので、日本時間で `7:30 AM`を指定したい場合は `22:30 PM`を指定する(9 時間時差のため)。
- Run Command: python garbage_day_alert.py

![Job_Editor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407150/fa7e1c8e-209d-03a1-43d2-001255ea6bc9.png)


なお、Heroku で時間指定しても、Heroku のサーバー側で自動（勝手に）起動することがあるため、Web 起動を停止させます。

![stop_web_python.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407150/38a22339-a889-b7c6-4ee3-a35228a901cb.png)


以上で全ての設定は終了です。

# おわりに

これでゴミ出しの日にちを忘れることはなくなりました！

意外と簡単に作成できたので皆さんもぜひ試してみてください。