LINEBotを作りました

LINEBotを作りました。 実は過去にLINEBotを作ろうとしていながら、結局全然できておらず。 過去のトラウマ(?)を解消するためにも挑戦しました。

製作物は以下です。お天気情報を教えてくれるBotです。

github.com

イメージはこんな感じです。

LINEイメージ
LINEイメージ

詳しくはGitHubを見てください・・・!と言いたいところですが、どういうサイトを見て作成したかなどせっかくなので書いてみます。

環境

  • Python 3.8(Flask)

  • macOS BigSur 11.6.4

  • heroku(20)

  • Flask 2.1.2

  • line-bot-sdk 2.2.1

  • requests 2.27.1

  • pylint2.13.7

勉強になったこと

  • APIを使ったプログラミングが経験できた(プログラミングやりたての時ってAPIをどう使ったら良いのかわからなかったし今でもわかってないので勉強するために)

  • crontabでPythonを実行することができた(これはGitHubには挙がっていませんが)

  • GitHub Actionも経験できた

  • User Agent という概念を知ることができた

と、思った以上に勉強になりました。

APIの選定

「天気 API」でググった結果、一番上に出てきたこちらのAPIにしました。

weather.tsukumijima.net

難しいイメージがありましたが、思っていた以上に簡単でした。 Pythonではサードパーティライブラリのrequestsを使えば簡単に取得できるようなので使いました。 以下のような具合です。

import requests


URL = 'https://weather.tsukumijima.net/api/forecast/city/290010'

requests.get(URL, headers=HEADERS).json()

APIを使う際の注意点

APIを用いた経験が余り無かったので初めて知ったのですが、APIにはユーザーエージェントと呼ばれる識別子的な情報を設定すべきケースがあるそうです。

今回用いたAPIについても以下のように記載されていました。

テストアプリや開発用途以外で利用される場合は独自のユーザーエージェント(例・WeatherApp/1.0.0)を設定してください。 どのアプリケーションからどれくらいアクセスがあるかをサーバーログで把握するためです。 あまり強いサーバーではないので、API に連続してアクセスする場合は最低でも 0.5 秒以上間隔を空けてから行ってください。 短時間に連続してアクセスした場合、この API だけでなく気象庁 HP にも負荷をかけてしまうことになるため、絶対にやめてください。

今回のAPIでは認証もないため、誰が使っているのかどうかを判断する必要があるのだと思いましたが、知らなかったので勉強になりました。

ただ、実装するにはどうしたら良いかわからなかったので調べたところ以下のリンクが参考になりました。

stackoverflow.com

以下のように第2引数へ付与してやれば良かったようです。

import requests

url = 'SOME URL'

headers = {
    'User-Agent': 'My User Agent 1.0',
    'From': 'youremail@domain.com'  # This is another valid field
}

response = requests.get(url, headers=headers)

LINE Botの作り方

応答メッセージについては以下のリンクを参考にして作りました(構成はほぼ同じです)。 qiita.com

プラスアルファの要素として、以下のリンクを参考にしてherokuへのデプロイはGitHub Actionsで実装しました(別途heroku上にキー情報の設定をする必要あり)。

zenn.dev

プッシュメッセージは以下のリンクを参考にしました(こちらも構成はほぼ同じです)。

qiita.com

ちょっと詰まった要素として、特定のグループにプッシュできるようにしたかったのでgroup_idを調べる方法がわかりませんでしたが、以下リンクを参考にすれば実装できました。

www.line-community.me

crontabでPythonを実行するには

今回のBot作成の元々の動機として「雨の日にあらかじめ連絡してくれたら嬉しいじゃん!」と思っており。 朝晴れていたら雨が降るとは思わないことが多く、天気予報もいちいちチェックしないズボラな性格なので・・・。 そのため、定期実行したら良いなと思ってcrontabを設定しましたが、ここで一つ詰まりました・・・。

通常、python3 xx.py と叩いて実行出来ていたのですが、crontabで同じようにできず。

イメージ

0 7 * * * python3 /Users/nibutan/weatherReport/push.py

調べたところcrontabからpathが通っていないようなので、以下のように実行環境のフルパスを記載することで成功できました。

0 7 * * * /Users/nibutan/weatherReport/venv/bin/python /Users/nibutan/weatherReport/push.py

オチ

crontabはPCの電源がついていないと実行出来ないので、本当に定期実行させたい場合herokuのスケジューラーを設定する必要があったw