AWSで LINE bot を作る

AWS

フェイス・ソリューション・テクノロジーズ株式会社 IS 本部 OS ユニットの Saitoです。
此度はAWSの「API Gateway」と「Lambda」使って、自動的に定型の受け答えをしてくれる LINE bot 作ります。

LINE公式アカウントのページからでもbotは作れるのですが、できることの範囲がとても狭いので、LINE Developer の「Messaging API」からLINE公式アカウントを作成し、AWS の「API Gateway」を使って、応答内容を設定した AWS「Lambda」と連携させます。

LINE公式アカウントの作成

まず、LINEビジネスIDを登録します。無料です。
https://www.linebiz.com/jp/signup/

登録した LINEビジネスIDで LINE Developerにログインします。
https://developers.line.biz/

プロダクト > Messaging API を選択

今すぐはじめよう > 新規チャネル作成
チャネルの種類:Messaging API にして他は適当に

これでLINE公式アカウントが作成されました。

作成したチャネル > Messaging API 設定

一番下のチャンネルアクセストークン(長期)「発行」を押して出てくる文字列

作成したチャネル > チャネル基本設定 にある「チャネルシークレット」の文字列

それぞれ後ほど使います。

Lambdaの設定

AWS Lambda > 関数の作成

一から作成、ランタイムはPython3.8を選択し関数の作成。

作成した関数にコードを書く前にライブラリを入れます。

コマンドプロンプトでline-bot-sdk-pythonのダウンロード
python -m pip install line-bot-sdk -t .

ダウンロードしたものをzipにする。

作成した関数 > コード > アップロード元 > zipファイル
zipにしたライブラリをアップロード。

関数直下に新しいファイル「lambda_function.py」を作成します。
このファイルに LINEbot 用のコードを書いていきます。

以下を入れてDeployを押す。

import os
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage, StickerSendMessage, QuickReply, QuickReplyButton, MessageAction, PostbackAction,
)
LINE_CHANNEL_ACCESS_TOKEN   = os.environ['LINE_CHANNEL_ACCESS_TOKEN']
LINE_CHANNEL_SECRET         = os.environ['LINE_CHANNEL_SECRET']
LINE_BOT_API = LineBotApi(LINE_CHANNEL_ACCESS_TOKEN)
LINE_HANDLER = WebhookHandler(LINE_CHANNEL_SECRET)

def lambda_handler(event, context):
    logger.info(event)
    signature = event["headers"]["x-line-signature"]
    body = event["body"]

    @LINE_HANDLER.add(MessageEvent, message=TextMessage)
    def on_message(line_event):
        profile = LINE_BOT_API.get_profile(line_event.source.user_id)
        logger.info(profile)

        message = line_event.message.text.lower()
        answerlist = ["鉛", "銅", "銀", "金", "斎藤道三", "斎藤義龍", "ショーツ", "パジャマ"]
        if message == 'テスト':
            LINE_BOT_API.reply_message(line_event.reply_token,
                TextSendMessage(text='次のうち、最も融点が高いのはどれ?',
                        quick_reply=QuickReply(items=[
                            QuickReplyButton(action=PostbackAction(label="鉄", data="鉄", text="鉄")),
                            QuickReplyButton(action=PostbackAction(label="鉛", data="鉛", text="鉛")),
                            QuickReplyButton(action=PostbackAction(label="銅", data="銅", text="銅")),
                            QuickReplyButton(action=PostbackAction(label="銀", data="銀", text="銀")),
                            QuickReplyButton(action=PostbackAction(label="金", data="金", text="金")),
                        ])))
        elif message == '鉄':
            LINE_BOT_API.reply_message(line_event.reply_token,
                TextSendMessage(text='戦国時代の大名、斎藤氏の最後の当主は誰?',
                        quick_reply=QuickReply(items=[
                            QuickReplyButton(action=PostbackAction(label="斎藤道三", data="斎藤道三", text="斎藤道三")),
                            QuickReplyButton(action=PostbackAction(label="斎藤義龍", data="斎藤義龍", text="斎藤義龍")),
                            QuickReplyButton(action=PostbackAction(label="斎藤龍興", data="斎藤龍興", text="斎藤龍興")),
                        ])))
        elif message == '斎藤龍興':
            LINE_BOT_API.reply_message(line_event.reply_token,
                TextSendMessage(text='女性向け下着ブランド\nチュチュアンナで唯一存在するメンズ向けアイテムはどれ?',
                        quick_reply=QuickReply(items=[
                            QuickReplyButton(action=PostbackAction(label="ショーツ", data="ショーツ", text="ショーツ")),
                            QuickReplyButton(action=PostbackAction(label="パジャマ", data="パジャマ", text="パジャマ")),
                            QuickReplyButton(action=PostbackAction(label="ソックス", data="ソックス", text="ソックス")),
                        ])))
        elif message in answerlist:
            LINE_BOT_API.reply_message(line_event.reply_token,
                TextSendMessage(text='不正解!',
                        quick_reply=QuickReply(items=[
                            QuickReplyButton(action=PostbackAction(label="再挑戦", data="再挑戦", text="テスト")),
                        ])))
        elif message == 'ソックス':
            LINE_BOT_API.reply_message(line_event.reply_token, StickerSendMessage(package_id='8515',sticker_id='16581254'))
    
        else:
            LINE_BOT_API.reply_message(line_event.reply_token, StickerSendMessage(package_id='11537',sticker_id='52002744'))
            return


    LINE_HANDLER.handle(body, signature)
    return 0

作成した関数 > 設定 > 環境変数 にて
キーと値を以下のように追加します。値はMessaging API の画面で確認した、
チャンネルアクセストークン(長期)とチャネルシークレットの文字列を貼り付けます。

API Gateway の設定

続けて、AWS Lambdaの 作成した関数 > 設定 > トリガー > トリガーの追加

以下のように設定してAPI Gatewayをトリガーに追加する。

API Gateway の API endpoint(https://~)を

LINE developers の
作成したチャネル > Messaging API設定 > Webhook設定
WebhookURLに貼り付け、Webhookの利用を有効にします。

作成したチャネルを友だち追加して、トークで「テスト」と入れると…
※LINE Official Account Managerの設定からデフォルトの応答設定などをオフにしておきます。

応答とクイックリプライが出るようになりました。
クイックリプライを選択すると次のクイズか、不正解!の応答が出て、3問正解するとスタンプが出てきます。
例外のメッセージを入れると別のスタンプで応答します。

このようにして、LINE botを作ることができました。
他にもいろいろできることがあるので、以降の記事でも紹介していきたいと思います。

プロフィール
この記事を書いた人
Saito

三度のメシより一度のラーメン

Saitoをフォローする
フェイスでは一緒に働く仲間を募集しています

フェイス・ソリューション・テクノロジーズ株式会社では、一緒に働いてくれる仲間を募集しています。
いろいろな案件があるので、いろいろなことに挑戦できる会社です。
「面白いこと」に積極的なので、あなたの「面白そうなことだからやってみたい」を形にできるチャンスがあります!

AWSLambdaAPI Gateway
フェイススタッフブログ

コメント

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