Python、Lambda、API GatewayでLINEチャットBotを作る

今回はline-bot-sdk-pythonを使わずにAWSのLambdaとAPI Gatewayでオウム返しLINEチャットボットを作ったので投稿します。AWS初心者が初めてのLambdaとAPI Gatewayに挑みました。

## LINE Developersへのチャネル登録

https://developers.line.biz/ja/services/messaging-api/

を開いて「今すぐはじめよう」を押してチャンネルを作成してください。

## AWS Lambdaの関数の作成

Lambdaの画面に遷移して関数を一から作成しましょう。
![スクリーンショット 2021-04-13 16.28.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/7e51b362-6846-3570-a07f-827a1661f424.png)
関数名はLINEBot、ランタイムはPython 3.8 にします。そして関数の作成を押しましょう。

あとLambdaの環境設定を編集しましょう

![スクリーンショット 2021-04-13 16.40.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/117654fd-539c-5428-ca97-51ce9259aa0a.png)

値のところにMessaging APIのChannel access token（めちゃくちゃ長いやつ）をコピペして保存してください。

ここから「lambda_function.py」を編集して実際にコードを書いていきます。

## lambda_function.py の編集

```python:lambda_function.py
import logging

import os
import urllib.request
import json

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

def lambda_handler(event, context):
    
    logger.info(event)
    
    # JSON文字列をPythonオブジェクトに変換してをeventsをループで回す
    for message_event in json.loads(event['body'])['events']:
        
        logger.info(json.dumps(message_event))
        
        url = 'https://api.line.me/v2/bot/message/reply'

        # リクエストヘッダー
        headers = {
            'Content-Type': 'application/json',
            'Authorization': 'Bearer ' + os.environ['ACCESSTOKEN']
        }
        # リクエストボディ
        data = {
            'replyToken': message_event['replyToken'],
            'messages': [
                {
                    "type": "text",
                    "text": message_event['message']['text'],
                }
            ]
        }
        req = urllib.request.Request(url=url, data=json.dumps(data).encode('utf-8'), method='POST', headers=headers)
        
        with urllib.request.urlopen(req) as res:
            
            logger.info(res.read().decode("utf-8"))

```
loggerはCloud Watchでlogを出力しているのでなくてもいいです！

https://developers.line.biz/ja/reference/messaging-api/#send-reply-message
公式に下記のような方法でPOSTリクエストすれば良いと書いてありました。

```
HTTPリクエスト POST 
https://api.line.me/v2/bot/message/reply

リクエストヘッダー
Content-Type　application/json
Authorization　Bearer {channel access token}

リクエストボディ
replyToken　Webhookで受信する応答トークン
messages 送信するメッセージ
```
そしてオウム返しするには下記のような構造になっていたので

```
"events":[{
"replyToken":"xxxxxxxxxxxxxxxxxxx",
"message":{"type":"text","id":"xxxxxxxxxxxxxxx","text":"こんにちは"}
}]
```
<strong>"text": message_event['message']['text']</strong>でオウム返しできる。


##  API Gatewayの設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/cfcbbf68-1953-9201-a604-b3ba6c310101.png)


Lambdaの先ほど作成したLINEBotの「関数の概要」より、「トリガーを追加」ボタンを押します。「トリガーを選択」では「API GateWay」、「APIを作成する」をそれぞれ選択し、APIタイプは「HTTP」を選択します。セキュリティは今回は「オープン」を選択します。ここまでできたら「追加」ボタンを押します。


![LINE.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/18280aee-15a0-551b-3177-8541000ffad5.jpeg)


そして作成したトリガーのAPIエンドポイントをコピーしてMessaging APIのWebhookのURLに貼り付けます。

##  完成

![IMG_6552.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/7ab8a37e-7bb5-3fa2-5ce0-8c4865666468.jpeg)

そうするとこのようにオウム返しチャットbotの完成です ！!

##  参考文献

https://qiita.com/taku-0728/items/c80bcf65aba318ac6db0

https://blog.5000164.jp/2017/8/14/line-bot/