Python で簡単な Line bot を作成してみた

こんにちは、ToMです。
今回はプログラミング関連の記事を書いてみます。
結構前にLine botを作成したことがあったのですが、途中で辞めていました。
Python学習を始めたこともあり、再度挑戦してみようと思いました。
第1回目の目標はこちらです。
Python でオウム返しするLine botを作成する
Qiitaの記事を参考にしつつ、疎通確認まで行っていきます。
基本的な流れはQiitaに書いてある通りですが、自分が詰まったところをまとめていきます。

実行環境

  • macOS Big Sur 11.3.1
  • Python 3.6.13
  • Heroku

LINE Developersの登録、設定

以前登録していたため、こちらは不要でした。
今回用にチャネルシークレットとチャネルアクセストークン(長期)は再発行をし直しておきました。
それぞれ後続で使用していきます。
  • チャネル基本設定> チャネルシークレット> 発行
  • Messaging API設定> チャネルアクセストークン >再発行

ソースコード、設定ファイルの準備

ソースコードと設定ファイルを準備します。
内容はQiitaのものをそのまま使用しています。
from flask import Flask, request, abort

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)
import os

app = Flask(__name__)

#環境変数取得
YOUR_CHANNEL_ACCESS_TOKEN = os.environ["YOUR_CHANNEL_ACCESS_TOKEN"]
YOUR_CHANNEL_SECRET = os.environ["YOUR_CHANNEL_SECRET"]

line_bot_api = LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(YOUR_CHANNEL_SECRET)

@app.route("/callback", methods=['POST'])
def callback():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']

    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)

    return 'OK'


@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=event.message.text))


if __name__ == "__main__":
#    app.run()
    port = int(os.getenv("PORT", 5000))
    app.run(host="0.0.0.0", port=port)
python-3.6.13
Flask==0.12.2
line-bot-sdk==1.5.0
web: python main.py

Herokuの設定

デプロイ先としてHerokuを使用します。

Heroku CLI のダウンロードとインストール

上記を参考に、Heroku CLIを入れていきます。
MacではHomebrewから入手できるとのことなので、そちらから行いました。
$ brew tap heroku/brew && brew install heroku

アプリケーションの新規作成

herokuのインストール、ログインができたら、アプリケーションの新規作成を行います。
herokuのcreateを使います。
$ heroku create <アプリケーション名>
アプリケーション名は世界で一意でないといけないようです。
Name <アプリケーション名> is already taken と出たら別の名前にしましょう。

環境変数の設定

先ほど再発行したチャネルシークレットとチャネルアクセストークンを、環境変数として設定します。
$ heroku config:set YOUR_CHANNEL_SECRET="<チャネルシークレット>" --app <アプリケーション名>
$ heroku config:set YOUR_CHANNEL_ACCESS_TOKEN="<チャネルアクセストークン>" --app <アプリケーション名>

Herokuへデプロイ

ソースコード、設定ファイルを格納しているディレクトリにて、gitコミットとプッシュを行います。
$ git init
$ git add .
$ git commit -m "new commit"
$ git push heroku master
プッシュの際、下記エラーが出ました。
$ git push heroku master
fatal: 'heroku' does not appear to be a git repository
fatal: Could not read from remote repository.
どうやら、リモートリポジトリの参照ができていないらしいです。
下記コマンドを入力することで、configファイルに情報が追記されました。
$ git remote add heroku https://git.heroku.com/<アプリケーション名>.git
再度プッシュを行ったところ、無事デプロイができました。

Webhookの設定

LINE Developersのコンソール画面に戻り、Webhookの設定を行います。
Messaging API設定> Webhook設定> Webhook URL にて、デプロイしたアプリケーションのURLを指定します。
Webhook URL:https://<アプリケーション名>.herokuapp.com/callback
問題なくデプロイができていれば、「検証」を押すと「成功」と表示されるはずです。
もし成功とならない場合、何らかの設定不備がある可能性があります。
herokuのログを確認するなどして原因を特定しましょう。
ToM
ToM
ちなみに私は環境変数の設定で、変数名を誤っていたため失敗していました

稼働確認

実際にLINEで稼働確認を行います。
今回はオウム返しをするだけの実装となっているので、書いたコメントをそのまま返します。
無事オウム返しをしてくれました!
ちなみにテキストに対しての返答しか定義をしていないため、スタンプは既読スルーされます。
こちらも追々反応できるようにしたいですね。

まとめ

今回はオウム返ししてくれるLINE botの稼働確認までを行いました。
ほぼ参照したQiitaの記事のままではありますが、無事動くところまで試すことができました。
ここから実際にPythonで実装をしてLINE botを試してみたいと思います。

コメント

  1. 匿名 より:

    現在のheroku-20だとpython-3.6.3はサポートされていないようです。heroku-18にダウングレードする必要があるかと。

    $ heroku stack:set heroku-18 -a

    で変更することができます。

タイトルとURLをコピーしました