LINE Messaging API を使って LINE ボットを作る ①調査+疎通確認編

こんにちは、@ketancho です。プライベートの開発で LINE Bot を作ろうと思っており、その準備?調査?状況をまとめていきたいと思います。今回は、LINE Developers 側の準備、疎通確認用の Web API の用意までを整理しました。(このメモを元に私の友人が開発をするので、なるべく丁寧に残したいと思っています。)

LINE Developers 側の準備

まず、 LINE Developers 上で事前準備をしていきます。

下記の画面でログインボタンを押下すると、

f:id:ketancho_jp:20191130143123p:plain

LINE のアカウントでログインするか、ビジネスアカウントでログインするかを選ぶことができます。先々はビジネスアカウントを作ることになるのかもしれませんが、いったん自身のアカウントで進めていくことにしました。

f:id:ketancho_jp:20191130143138p:plain

その後 LINE Developers コンソール から、プロバイダーなるものを作成します。続いて、このプロバイダーの配下に紐付ける形でチャネルを作っていきます。チャネルは幾つかのタイプを選ぶことができるのですが、ボットの場合は Messaging API を選択します。

f:id:ketancho_jp:20191130143149p:plain

最後に、チャネルの名前であったり、画像であったりをセットアップします。この設定の中で Webhook URL という欄があるのですが、ここに後ほど作成する Web API のエンドポイントを指定します。

f:id:ketancho_jp:20191130143204p:plain

Web API を作る

このポストでは、LINE Bot になにかしらのメッセージを送り、バックエンドの Web API の疎通確認までをしたいと思います。今回は Amazon API Gateway + AWS Lambda で簡単な Web API を作り、Webhook URL に指定、そしてボットにメッセージを送ると、それが呼び出しログが残ることを確認、という流れで進めていきます。

前述の友人はエンジニアではないので、開発環境を整えるところからまとめていきたいと考えています。今回は AWS Cloud9 を使っていくことで、ブラウザさえ動けば開発ができるようにしていきたいと思います(友人の環境わかっていないので)。

AWS Cloud9 から、"Create Environment" します。

f:id:ketancho_jp:20191130144738p:plain

環境面は、任意の名前をつけて貰えれば大丈夫です。その後の画面は、標準の設定のまま進めていきます。

f:id:ketancho_jp:20191130144752p:plain

下のようにきれいな環境が立ち上がってくると思います。右側のペインから、"AWS Resources" を押したあと、"λ+" マークを押すことで、Lambda Function とそれを呼び出す API Gateway の雛形を作っていくことができます。

f:id:ketancho_jp:20191130145050p:plain

Lambda と API Gateway の設定を下記に載せておきます。Lambda ファンクション名は任意で設定してください。

f:id:ketancho_jp:20191130145432p:plain

Python を選びます。Cloud9 だと まだ Python 3.7 や 3.8 は選べないですね。。

f:id:ketancho_jp:20191130145442p:plain

API Gateway の設定も進めていきます。今の時点では認証を必要としない形で Web API を作成します。

f:id:ketancho_jp:20191130145453p:plain

以降の設定は、デフォルトのままで進めます。

f:id:ketancho_jp:20191130145503p:plain f:id:ketancho_jp:20191130145515p:plain

その後、lambda_function.py を下記のように修正しました。ただログを吐くだけのコードです。

import json
import boto3
import datetime

import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):

    logger.info(event)
    logger.info(json.loads(event['body'])['events'][0]['message']['text'])

    return {
        'statusCode': 200,
        'body': json.dumps({
            'output_text': "test"
        }),
        'isBase64Encoded': False,
        'headers': {}
    }

その後、AWS Resources ペインでデプロイ("↑" マーク)すると、AWS リソースが更新されます。これで AWS 側の設定は完了です。

f:id:ketancho_jp:20191130150750p:plain

API Gateway の画面に遷移すると、Web API ができているはずですので、下記の画面で URL をコピーしましょう。

f:id:ketancho_jp:20191130151333p:plain

LINE Developers 側で Webhook URL を設定する

最後に、Webhook URL に API Gateway の URL を貼り付けます。

f:id:ketancho_jp:20191130151244p:plain

検証ボタンを押して、下記のような表示になればOKです。

f:id:ketancho_jp:20191130151654p:plain

LINE からメッセージを送り、Web API が叩かれているかを確認します

LINE でチャネルの QR コードを読み取ると Friends 一覧にボットを追加できます。ボットに対して何かしら発信をしてみてください。CloudWatch Logs に下記のようなログが残っていれば、正しく Web API が呼び出されていることになります。

f:id:ketancho_jp:20191130152040p:plain

まとめと今後

LINE Developers 側の初期設定と、ボットの Webhook URL に設定した Web API が呼び出されるところまで確認しました。最低限の確認ですので、今後下記の実装を試していきたいと考えています。

  • ボットからの何かしらの返信をする
  • ↑のボットからの返信でボタンを表示できるようにする(例: はい or いいえ を選ばせる、など)
  • ボット経由以外の場合は Web API を呼び出させない設定をする

LINE Messaging API でできることの全容がまだまだ分かっていませんが、年内に何かしらのプロトタイプが作れるように進めていこうと思います。それでは!