こんな方におすすめ
- PythonでLINE BOTを作りたい
- LINEでメッセージに応じた自動応答をやってみたい
LINE BOTの作り方についてです。まずはコピーして作成してみて、動いたら自分なりにプログラムを変更してみると面白いと思います。
プログラムの概要
PythonでHerokuのサーバーを利用して、FlaskのWebアプリケーションを動かすことで、LINE BOTを構築します。LINEのメッセージをHerokuが受け取ってFlaskのWebアプリケーションがLINEに応答するようなイメージになります。従いまして、LINE Developperの登録、Herokuの登録が事前に必要となります。今回は、子供が大好きな鬼滅の刃の竈門炭治郎BOTを作成して呼吸の種類と型を入れると、炭治郎が必殺技を自動で返すLINE BOTを作成します。
プログラムの作り方
LINE BOTということで、LINEのMessaging APIを使用するための登録が必要です。また、Herokuのサーバーを利用するための登録も必要になります。
Messaging APIの登録方法
まず、LINE developers にログインします。
LINE developers にアカウントを作成しログインする
初回ログイン時には、登録が必要となります。名前とメールアドレスを入れてアカウントを作成してください。
新規プロバイダーを作成する
ログイン後に、新規プロバイダーを作成します。企業や組織の名前になりますが、個人で使用される場合は、自分の名前でよいと思います。
Messaging APIのチャンネルを登録する
Create a new channel から Messaging APIを選択します。
そのあと、アプリ名、業種、メールアドレスなどの入力については、指示に従って作成してください。
チャンネルが作成されると、以下のようにチャンネルが追加されます。
(この写真は、アプリ名を竈門炭治郎として、プロフィールを既に編集した画像です)
Messaging APIのチャンネルの各種設定について
作成したチャンネルを開くと、アカウントの設定ができます。重要箇所を記載しますので、アイコンなどは自由に変更してください。
①チャンネルアクセストークン(Channel access token )の発行
チャンネルアクセストークンを発行してください。このトークンは後で、PythonプログラムとHerokuの環境変数の設定時に使用します。
②チャンネルシークレットキー(Channel secret )
チェンネルシークレットキーは後で、PythonプログラムとHerokuの環境変数の設定時に使用します。
③Webhook送信(Use webhook) を利用可能にするに設定
④Webhook URLの設定
Herokuの設定後に入力します。
⑤「自動応答メッセージ」(Auto-reply-message)と「友達追加時のあいさつ」(Greeting messages) を"利用しない(Disable)"に変更
QRコードからLINEの友達に追加する
Messaging APIのチャンネル内にQRコードがあるので、自分のLINEに登録します。完成した時に、BOTが期待通り動くことを確認してください。
Herokuの登録
Heroku のサイトでアカウントを作成しログインします。
新規アプリを作成する。
ログイン後、以下の画面から新規アプリを作成します。アプリ名は既に誰かが使用している場合は、作成できません。独自のアプリ名をつけてください。
LINE Messaging APIのWebhook URLに設定する情報を取得する
①作成したアプリ内のSettingのDomainに書かれているURLに/callbackをつけたURLを記録する。
(例)Domainが https://mayrxxxxx.herokuapp.com/ の場合、https://mayrxxxxx.herokuapp.com/callbackとなる。
② ①のURLをLINE Messaging APIのWebhook URLに入力する。
Pythonプログラム
必要なモジュールをインストールします。
ターミナルから以下を実行し、インストールします。
1 2 |
$ pip install flask $ pip install line-bot-sdk |
main.pyの作成
main.pyのプログラムを作成します。竈門炭治郎BOTということで、LINEで送られてきた呼吸法と型のメッセージ対して、reモジュールのsearch関数を用いて、条件分岐して、必殺技の名前を返すようなBOTを作成しています。呼吸法がたくさんあるので、最初の部分だけ記載します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
# インポートするライブラリ from flask import Flask, request, abort from linebot import ( LineBotApi, WebhookHandler ) from linebot.exceptions import ( InvalidSignatureError ) from linebot.models import ( FollowEvent, MessageEvent, TextMessage, TextSendMessage, ImageMessage, ImageSendMessage, TemplateSendMessage, ButtonsTemplate, PostbackTemplateAction, MessageTemplateAction, URITemplateAction ) import os import re app = Flask(__name__) #LINEのMessaging APIに記載してあるLINE Access Tokenと CHANNEL SECRETを設定します。 LINE_CHANNEL_ACCESS_TOKEN = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" LINE_CHANNEL_SECRET = "xxxxxxxxxxxxxxxxxxxxx" line_bot_api = LineBotApi(LINE_CHANNEL_ACCESS_TOKEN) handler = WebhookHandler(LINE_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' # MessageEvent @handler.add(MessageEvent, message=TextMessage) def handle_message(event): if re.search('水の呼吸',event.message.text) or re.search('みずのこきゅう',event.message.text): if re.search('壱',event.message.text) or re.search('いち',event.message.text): line_bot_api.reply_message( event.reply_token, TextSendMessage(text="水面斬り") ) elif re.search('弐', event.message.text) or re.search('に', event.message.text): line_bot_api.reply_message( event.reply_token, TextSendMessage(text="水車") ) elif re.search('参', event.message.text) or re.search('さん', event.message.text): line_bot_api.reply_message( event.reply_token, TextSendMessage(text="流流舞い") ) elif re.search('肆ノ型', event.message.text) or re.search('し', event.message.text): line_bot_api.reply_message( event.reply_token, TextSendMessage(text="打ち潮") ) elif re.search('伍ノ型', event.message.text) or re.search('ご', event.message.text): line_bot_api.reply_message( event.reply_token, TextSendMessage(text="干天の慈雨") ) elif re.search('陸ノ型', event.message.text) or re.search('ろく', event.message.text): line_bot_api.reply_message( event.reply_token, TextSendMessage(text="ねじれ渦") ) elif re.search('漆ノ型', event.message.text) or re.search('しち', event.message.text): line_bot_api.reply_message( event.reply_token, TextSendMessage(text="雫波紋突き") ) elif re.search('捌ノ型', event.message.text) or re.search('はち', event.message.text): line_bot_api.reply_message( event.reply_token, TextSendMessage(text="滝壺") ) elif re.search('玖ノ型', event.message.text) or re.search('くの', event.message.text): line_bot_api.reply_message( event.reply_token, TextSendMessage(text="水流飛沫・乱") ) elif re.search('拾ノ型', event.message.text) or re.search('じゅう', event.message.text): line_bot_api.reply_message( event.reply_token, TextSendMessage(text="生生流転") ) elif re.search('拾壱ノ型', event.message.text) or re.search('じゅういち', event.message.text): line_bot_api.reply_message( event.reply_token, TextSendMessage(text="凪") ) else: line_bot_api.reply_message( event.reply_token, TextSendMessage(text="そんなのないよ") ) else: line_bot_api.reply_message( event.reply_token, TextSendMessage(text=f"あなたは{event.message.text}と言ったのか?") ) if __name__ == "__main__": port = int(os.getenv("PORT",5000)) app.run(host="0.0.0.0", port=port) |
設定ファイルの作成
以下、3つの設定ファイルの作成が必要になります。これらは、main.pyと同じフォルダに置く必要があります。
- runtime.txt →Pythonのバージョンを記載を記載する
1 |
python-3.6.10 |
- requirements.txt →インストールするライブラリの記載する
1 2 |
Flask==0.12.2 line-bot-sdk==1.17.0 |
- Procfile →プログラムの実行方法を定義する。(.txtなし)
1 |
web: python main.py |
デプロイする
デプロイは、ターミナルから行います。main.pyの置いてあるフォルダに移動して、順に実行してください。
Herokuコマンドとgitコマンドをインストール
1 2 |
$ brew install heroku $ brew install git |
ターミナルからHerokuにログイン
1 |
$ heroku login |
これを実行すると、Webサイトが開くので、Loginします。ターミナルに、Logged in as xxxx@xxxx のようにアカウントが表示されたら成功です。
gitコマンドを入力する
以下のコマンドを順に実行します。
1 2 3 4 5 6 7 8 9 |
$ git init $ heroku git:remote -a (自分で決めたアプリ名) $ git add . $ git commit -m "inital commit" $ git push heroku master |
環境変数を設定する
LINEのMessaging APIのチャンネルアクセストークンとチャンネルシークレットキーを入れます。
1 2 |
heroku config:set LINE_CHANNEL_ACCESS_TOKEN=XXXXXXXXXXXXXXXXXXXXXXXXX heroku config:set LINE_CHANNEL_SECRET=XXXXXXXXXXXXXXXXXXXXX |
以上でデプロイが完了します。
自分のLINEからメッセージを送り、期待通りに動くことを確認してください。Pythonのプログラムに記載があるように、”水の呼吸壱の型”と送ると、”水面斬り”と返信が来るはずです。
まとめ
今回は、LINE BOTのサンプルとして、鬼滅の刄の竈門炭治郎BOTを作成しました。このプログラムを応用することで、様々なことができます。宅急便のQandAの自動応答BOTのようなものも作成することができます。ぜひチャレンジしてください。