おうちMac+PythonでLINE botを作る

オウム返しするまでのメモ


予想読了時間 210

導入までの覚え書き。オウム返しbotを作ることをゴールとします。(雑なので気が向いたら書き直すかもしれない)

LINE Developer に登録する

ここから頑張るとできる。

Messanging API のチャネルを作る

Providerを選んでMessanging API のチャネルを作る。できたら

  • チャネルシークレット
    • チャネル基本設定のタブにある
  • チャネルアクセストークン
    • Messaging API設定のタブにある

をメモしておく。あとで使う。

LINE Messaging API SDK for Python の導入

次にここのReadmeの通りに

Console
$ pip install line-bot-sdk

する。Flaskを入れてなかったら

Console
$ pip install flask

もする。

Readmeのサンプルコードをそのままもらって mylinebot.py として保存しておく。

このときさっきメモしたチャネルシークレットチャネルアクセストークンをサンプルコードの対応する部分に貼り付ける。

Let's Encrypt で証明書の準備

LINEのAPIにはWebhookが必須、かつSSL対応のCallback URLが必要なのでこれをする必要がある。無理におうちでやる必要がないのならばHerokuでやった方が早いらしい。でもおうち環境で完結させたいので頑張る。SSL対応はLet's Encryptを使う。(オレオレ証明書だとLINEくんに弾かれるので)

ここで

  • おうちにつながるドメイン
    • ouchi.trpfrog.net みたいな
  • 80番のポート開放

が必要になるので準備しておく。したら次にcertbotを入れる。(Homebrewが必要)

Console
$ brew install certbot

次を実行。

Console
$ sudo certbot certonly --manual

いろいろ聞かれるので従う。最後に「.well_known/acme-challenge/XXXXXX」にYYYYYYを書いたファイルを用意してね、と言われるので準備する。その後、Webサーバを立ち上げて外部からそのファイルにアクセスできるようにする。つまり

Text
http://ouchi.trpfrog.net/.well_known/acme-challenge/XXXXXX

から指定された文字列 YYYYYY のテキストファイルが得られるようにすれば良い。

ここはFlaskを使ってやっても良いのだけれども、いまいち書き方がよくわからなかったので(え?) Dockerでnginx呼び出して殴ってしまった。

Console
$ docker run docker run -d -p 80:80 \
    -v $PWD:/usr/share/nginx/html \
    --name lets-tmp \
    nginx

Webサーバ立ち上げたらつながることを確認してcertbotを続行。うまくいくとどこかに

  • fullchain.pem
  • privkey.pem

ができるので、そのパスをメモしておく。

Webhookに使うサーバを起動

ここまでいったら起動する、がサンプルコードのままだと不都合なのでちょっと書き加える。

Python
app.run()

Python
app.run(host='自分のローカルIP', port=80, ssl_context=(
    'fullchain.pemへのパス', 
    'privkey.pemへのパス'
))

にする。これで実行する。ouchi.trpfrog.net にアクセスしてコンソールに反応があればOK。

Callback URLを登録

ここまでできたら、LINEのMessaging API設定からWebhookを登録する。

Text
https://ouchi.trpfrog.net/callback

みたいな感じで良い。検証をクリックしてうまくいけば成功

やってみる

同じくMessaging API設定にQRコードがあるはずなので友達登録してみる。

なんか喋ってオウム返しされたら成功!お疲れ様でした。

https://res.cloudinary.com/trpfrog/image/upload/v1641538924/blog/line-bot/thumbnail.webp