LoginSignup
13
12

More than 3 years have passed since last update.

LINE Botを試してみた

Last updated at Posted at 2021-04-30

Line botを作成するまでの手順をまとめる。
botはpythonで実装した。

LINEの開発概要は以下の解説を参照。
https://developers.line.biz/ja/docs/line-developers-console/overview/#page-title

Line Developersのアカウントとチャネル作成

以下の手順に従い、Line Developersのアカウントとプロバイダー、チャネルを作成する。

プロバイダーの作成手順は省略。

チャネルは「Messageing API」を選択する。
スクリーンショット 2021-04-30 10.47.11.png

チャネル作成時の項目は以下のような感じ。
チャネル名は適当に。
業種は個人のお試しでやっているので、大業種:個人、小業種:個人(IT・コンピュータ) にした。

スクリーンショット 2021-04-30 10.48.28.png
スクリーンショット 2021-04-30 10.50.00.png

作成したMessaging APIチャネルの「Messaging API設定」タブのQRコードをLINEアプリで「友だち追加」から読み込むと、LINEに友達追加できる。
スクリーンショット 2021-04-30 10.59.59.png

応答メッセージの設定(Line Developers)

簡単なものであれば、Line Developers上で応答メッセージの設定ができる。「Messaging API設定」タブの応答メッセージの「編集」から編集する。
スクリーンショット 2021-04-30 11.24.34.png

特定のメッセージに対して応答したり、時間帯別での応答も設定できる。
スクリーンショット 2021-04-30 11.28.49.png

Webhookを利用した応答メッセージ

LINEに投稿されたメッセージを外部サーバに転送し、外部サーバで作成した応答をLINEに応答することができる。
外部サーバはHerokuを使用する。Herokuの対応言語はここに記載されてる。

Herokuでアプリ作成

Herokuでアカウントを作成し、ログインする。

Herokuで 「New」→「Create new app」を選択。

スクリーンショット 2021-04-30 13.05.02.png

「Create app」を押してApp作成。
App nameはHeroku全体(ログインアカウント内ではない)で一意な名前である必要があるため、既に使われている名前は指定できない。名前にこだわりがなければApp name入力なしで「Create app」を押すと、適当な名前のAppをHerokuが作成してくれる。

スクリーンショット 2021-04-30 13.03.57.png

Botアプリ実装

PythonでBotアプリを実装する。
なお、LINEでは、Botアプリ向けにLine bot sdkを提供している。公式のSDKとサードパーティ製SDKがある。Pythonは公式SDKが提供されている。
他に、Webサーバとしてflaskを使用する。

$ mkdir line-bot-python
$ cd line-bot-python
$ python --version
Python 3.6.4
$ python -m venv line-bot
$ source line-bot/bin/activate
$ echo line-bot/ > .gitignore
$ pip install flask line-bot-sdk
$ pip freeze > requirements.txt
$ echo python-3.6.13 > runtime.txt
$ echo web: python main.py > Procfile

runtime.txtの仕様はここを参照。
Procfileの仕様はここを参照。

続いて、Botプログラムを作成。

main.py
import os

from argparse import ArgumentParser
from logging.config import dictConfig

from flask import Flask, request, abort

from flask.logging import default_handler

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
    UnfollowEvent, FollowEvent, JoinEvent, LeaveEvent,
)

# 標準出力にログ出力することで、Herokuのログに出力する
dictConfig({
    'version': 1,
    'formatters': {'default': {
        'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
    }},
    'handlers': {'consoleHandler': {
        'class': 'logging.StreamHandler',
        'level': 'INFO',
        'formatter': 'default',
        'stream': 'ext://sys.stdout'
    }},
    'root': {
        'level': 'INFO',
        'handlers': ['consoleHandler']
    }
})

app = Flask(__name__)

# 環境変数取得
# LINE Developersで設定されているチャネルアクセストークンとチャネルシークレットを設定
YOUR_CHANNEL_ACCESS_TOKEN = os.environ["CHANNEL_ACCESS_TOKEN"]
YOUR_CHANNEL_SECRET = os.environ["CHANNEL_SECRET"]

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


@app.route("/callback", methods=['POST'])
def callback():
    """ Webhookからのリクエストの正当性をチェックし、ハンドラに応答処理を移譲する """

    # リクエストヘッダーから署名検証のための値を取得します。
    signature = request.headers['X-Line-Signature']

    # リクエストボディを取得します。
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    # handle webhook body
    try:
        handler.handle(body, signature)
    # 署名検証で失敗した場合、例外を出す。
    except InvalidSignatureError:
        app.logger.warn("Invalid Signature.")
        abort(400)
    # handleの処理を終えればOK
    return 'OK'


@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    """
    LINEへのテキストメッセージに対して応答を返す

    Parameters
    ----------
    event: MessageEvent
      LINEに送信されたメッセージイベント
    """

    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text="応答です。 " + event.message.text))


if __name__ == "__main__":
    # app.run()
    arg_parser = ArgumentParser(
        usage='Usage: python ' + __file__ + ' [--port <port>] [--help]'
    )
    # Herokuは環境変数PORTのポートで起動したWeb Appの起動を待ち受けるため、そのポート番号でApp起動する
    arg_parser.add_argument('-p', '--port', type=int,
                            default=int(os.environ.get('PORT', 8000)), help='port')
    arg_parser.add_argument('-d', '--debug', default=False, help='debug')
    arg_parser.add_argument('--host', default='0.0.0.0', help='host')
    options = arg_parser.parse_args()

    app.run(debug=options.debug, host=options.host, port=options.port)

Heroku CLIインストール

ここの内容に従い、Heroku CLIをインストールする。
Macでのインストールは以下コマンドで。

$ brew tap heroku/brew && brew install heroku

チャネルアクセストークンの設定

チャネルアクセストークンをHerokuの環境変数に設定する。

Line DevelopersのMessaging API設定の、チャネルアクセストークン(長期)の「発行」を押すと、トークンが発行されるので、これをコピーする。

スクリーンショット 2021-04-30 15.53.57.png

コマンドラインより、以下を実行する。

$ heroku config:set CHANNEL_ACCESS_TOKEN=[Line Developersで発行したチャネルアクセストークン] -app=[HerokuでCreate appした名前]

チャネルシークレットの設定

チャネルシークレットをHerokuの環境変数に設定する。

Line Developersのチャネル基本設定の、チャネルシークレットをコピーする。

スクリーンショット 2021-04-30 16.35.30.png

コマンドラインより、以下を実行する。

$ heroku config:set CHANNEL_SECRET=[Line Developersで発行したチャネルシークレット] -app=[HerokuでCreate appした名前]

Herokuにアップロード

コマンドラインからプログラムをアップロードする。

$ heroku login
$ git init
$ heroku git:remote -a [HerokuでCreate appした名前]
$ git add .
$ git commit -am "line bot app"
$ git push heroku master

Webhook設定

Line DevelopersよりWebhookを設定する。
Messaging API設定より、Webhook URLの「編集」を押す。

スクリーンショット 2021-04-30 16.51.31.png

Webhook URLを設定する画面になるので、herokuのURLを指定する。

スクリーンショット 2021-04-30 16.51.44.png

URLを設定したら、「検証」を押して、Webhookが動作するかを確認する。
スクリーンショット 2021-04-30 16.52.25.png

動作する場合は以下のように表示される。
スクリーンショット 2021-04-30 17.19.55.png

以下のようなエラーが表示された場合は、コマンドラインからheloku logsコマンドを実行するなどして、エラー内容を確認して対処する。
スクリーンショット 2021-04-30 17.16.53.png

確認後、Webhookの利用のスイッチを有効にする。
スクリーンショット 2021-04-30 17.32.10.png

設定後、LINEからメッセージ送信すると、Webhookで設定した応答もLINEに返されるようになる。
image.png

上記は、LINEの応答メッセージとWebhookが両方返されている。
Webhookのみを有効にする場合は、Line Developersの設定で応答メッセージをオフにする。

スクリーンショット 2021-04-30 17.34.22.png

参考

13
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
12