Line botを作成するまでの手順をまとめる。
botはpythonで実装した。
LINEの開発概要は以下の解説を参照。
https://developers.line.biz/ja/docs/line-developers-console/overview/#page-title
Line Developersのアカウントとチャネル作成
以下の手順に従い、Line Developersのアカウントとプロバイダー、チャネルを作成する。
プロバイダーの作成手順は省略。
チャネル作成時の項目は以下のような感じ。
チャネル名は適当に。
業種は個人のお試しでやっているので、大業種:個人、小業種:個人(IT・コンピュータ) にした。
作成したMessaging APIチャネルの「Messaging API設定」タブのQRコードをLINEアプリで「友だち追加」から読み込むと、LINEに友達追加できる。
応答メッセージの設定(Line Developers)
簡単なものであれば、Line Developers上で応答メッセージの設定ができる。「Messaging API設定」タブの応答メッセージの「編集」から編集する。
特定のメッセージに対して応答したり、時間帯別での応答も設定できる。
Webhookを利用した応答メッセージ
LINEに投稿されたメッセージを外部サーバに転送し、外部サーバで作成した応答をLINEに応答することができる。
外部サーバはHerokuを使用する。Herokuの対応言語はここに記載されてる。
Herokuでアプリ作成
Herokuでアカウントを作成し、ログインする。
Herokuで 「New」→「Create new app」を選択。
「Create app」を押してApp作成。
App nameはHeroku全体(ログインアカウント内ではない)で一意な名前である必要があるため、既に使われている名前は指定できない。名前にこだわりがなければApp name入力なしで「Create app」を押すと、適当な名前のAppをHerokuが作成してくれる。
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プログラムを作成。
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設定の、チャネルアクセストークン(長期)の「発行」を押すと、トークンが発行されるので、これをコピーする。
コマンドラインより、以下を実行する。
$ heroku config:set CHANNEL_ACCESS_TOKEN=[Line Developersで発行したチャネルアクセストークン] -app=[HerokuでCreate appした名前]
チャネルシークレットの設定
チャネルシークレットをHerokuの環境変数に設定する。
Line Developersのチャネル基本設定の、チャネルシークレットをコピーする。
コマンドラインより、以下を実行する。
$ 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の「編集」を押す。
Webhook URLを設定する画面になるので、herokuのURLを指定する。
URLを設定したら、「検証」を押して、Webhookが動作するかを確認する。
以下のようなエラーが表示された場合は、コマンドラインからheloku logs
コマンドを実行するなどして、エラー内容を確認して対処する。
設定後、LINEからメッセージ送信すると、Webhookで設定した応答もLINEに返されるようになる。
上記は、LINEの応答メッセージとWebhookが両方返されている。
Webhookのみを有効にする場合は、Line Developersの設定で応答メッセージをオフにする。
参考