人は悩む_人は学ぶ_オウム_BOTを

人は悩む、人は学ぶ、オウムBOTを。

はじめに

前回の記事で、オウム返しBotの作り方について書きました。
しかし、Messaging APIやHerokuの登録や設定で記事の量が多くなってしまい、コードについての解説は省略していました。

そこでこの記事では、オウム返しBOTのコードの解説をしていきたいと思います!

オウム返しBOTのコードの解説

オウム返しBOT

コードの全体像

# インポートするライブラリ
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

# 軽量なウェブアプリケーションフレームワーク:Flask
app = Flask(__name__)

#環境変数からLINE Access Tokenを設定
LINE_CHANNEL_ACCESS_TOKEN = os.environ["LINE_CHANNEL_ACCESS_TOKEN"]
#環境変数からLINE Channel Secretを設定
LINE_CHANNEL_SECRET = os.environ["LINE_CHANNEL_SECRET"]

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):
	line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=event.message.text)
     )

if __name__ == "__main__":
    port = int(os.getenv("PORT"))
    app.run(host="0.0.0.0", port=port)

それでは、コードの上の部分から解説していきます。

必要なライブラリをインポートします。

# インポートするライブラリ
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

Flaskを利用します。
Flaskは、Python用のマイクロweb開発フレームワークです。これを利用することで、ごく簡単なウェブアプリケーションを作ることができます。
詳しく知りたい方は、日本語訳されたユーザーガイドがあるので、確認して見て下さい。

# 軽量なウェブアプリケーションフレームワーク:Flask
app = Flask(__name__)

LINE Access TokenとLINE Channel Secretを設定します。

#環境変数からLINE Access Tokenを設定
LINE_CHANNEL_ACCESS_TOKEN = os.environ["LINE_CHANNEL_ACCESS_TOKEN"]
#環境変数からLINE Channel Secretを設定
LINE_CHANNEL_SECRET = os.environ["LINE_CHANNEL_SECRET"]

新しいLineBotAPIインスタンスとhandlerインスタンスを作成します。

line_bot_api = LineBotApi(LINE_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(LINE_CHANNEL_SECRET)

ここからウェブアプリケーション用のルーティングを記述します。
ルーティング:Webアプリケーションにおいて、 URL などの要求に含まれる条件から適切な処理を選択する過程

@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):
	line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=event.message.text)
     )

ユーザーがボットにメッセージを送るとWebhookがトリガーされ、LINEプラットフォームからボットアプリのサーバーのWebhook URLにリクエストが送信されます。
Webhook URLは 下記のように設定しました。

https://アプリ名.herokuapp.com/callback

つまり、BOTにメッセージを送信する(POST)と、herokuにリクエストが送信され、下記のコードから下の部分が実行されます。

@app.route("/callback", methods=['POST'])

リクエストの署名検証をします。
リクエストごとの関数を呼び出すためにはWebhookHandlerのhandleメソッドを用います。 引数にはレスポンスのbodyと署名検証のためのsignatureを使います。

def callback():
    # リクエストヘッダーから署名検証のための値を取得
    signature = request.headers['X-Line-Signature']

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

    try:
        # 署名を検証し、問題なければhandleに定義されている関数を呼び出す
        handler.handle(body, signature)
    except InvalidSignatureError:
        # 署名検証で失敗したときは400を出力
        abort(400)

    # handleの処理を終えればOK
    return 'OK'


ここからがオウム返しをする処理になります。
(この部分を変更することで、様々なBOTを作ることが可能です。)

handlerのaddメソッドを用いて、リクエストのイベントごとに実行する関数を記述します。 オウム返しBOTの場合、受信したTextMessageをそのまま送信します。処理は以下のようになります。

# MessageEvent
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
	line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=event.message.text)
     )
handler.add:引数にリクエストのイベントを指定します。イベントはlinebot.modelsに定義されていて、メッセージやグループ参加などがあります。
MessageEvent:LINE Messaging APIで定義されているリクエストボディです。
reply_message:LineBotApiのメソッドです。第一引数のevent.reply_tokenはイベントの応答に用いるトークンです。 第二引数にはlinebot.modelsに定義されている返信用のTextSendMessageオブジェクトを渡しています。
event.message.text:受信したメッセージです。

コードの解説は以上となります。
オウム返しの処理の部分をいじれば、他の機能も追加できます。次回は他の機能も追加していこうと思います。

Messaging APIでできること
・テキストメッセージ
・画像メッセージ
・動画メッセージ
・音声メッセージ
・位置情報メッセージ
・スタンプメッセージ
など

まとめと感想

オウム返しBOTのコードについての解説でした。
僕も初めてオウム返しBOTを作った時は、なんか凄いのできたなぁ〜と嬉しい半面、友達に自慢できるほどの機能でもないから残念という気持ちでした。
このオウム返しBOTを発展させて、面白いBOTを作りたいですね!この記事が参考になったら、感想とかシェアしていただけると嬉しいです!

ちなみにタイトルは、下の記事にあるコピーメカを活用させていただいてます!


ここから先は

28字

¥ 100

サポートするのは有料なので大丈夫です。代わりに無料でできる記事へのコメントやシェアをしていただけると、とても嬉しいです!