Line Bot に、AWS を用いてオウム返しの返信をさせたい！


#作りたいもの
![line.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/d44abb98-54ea-44cc-0480-8e8861851dc0.png)

このようなオウム返しをするLine Bot を作っていきます。
#使用技術
python3.8
AWS lambda
Line Message API
#今回の概要
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/c88082fe-8229-11c7-dedc-24ab07540f9a.png)


#Line Developers へのチャンネル登録
まず、Line Developers にログインします。
その後、ドキュメントというところにカーソルを合わしMessaging API を選択します。![スクリーンショット (44).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/f2ccb951-74dd-76c8-25ea-4da6af3a8e45.png)

その後、クイックスタート欄のところにある「Messaging API を今から始めよう」を選択し、新規プロバインダーを作成します。![f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/753ba6c0-499b-bdc7-82aa-c1eaabba05ee.png)
#AWS のlambda 関数の作成 
AWS のコンソールにログインし、検索バーに「lambda 」を入力し、lambda の画面に移ります。![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/8ab11ccb-f255-6d0f-23b0-1e9c8dedca5b.png)
設定は上記のように行います。設定後は、「関数の作成」を押してlambda 関数を作成します。ちなみに、Line のからどういった形式でメッセージが送られているのかは、公式によるとjson 形式で text という名前で送られます。
<font color="Red">( json 形式 とは JavaScriptのオブジェクト記法を用いたデータ交換フォーマット)</font>
次に応答メッセージをユーザーに返す際は、
https://api.line.me/v2/bot/message/reply
に対してPOST形式で、リクエストヘッダとリクエストボディをそれぞれ下記の形式で設定することでメッセージ送信しています。
リクエストヘッダ

```
Content-Type
application/json

Authorization
Bearer {channel access token}

```

リクエストボディ

```
replyToken
String 必須
Webhookで受信する応答トークン

messages
メッセージオブジェクトの配列 必須
送信するメッセージ
最大件数：5

notificationDisabled
Boolean 任意
true：メッセージ送信時に、ユーザーに通知されない。
false：メッセージ送信時に、ユーザーに通知される。ただし、LINEで通知をオフにしている場合は通知されません。
デフォルト値はfalseです。

```

#AWS の Lambda 関数とは
AWS Lambda は、サーバーのプロビジョニングや管理の必要なしにコードを実行できるコンピューティングサービスです。<font color="Red">( プロビジョニング とは 顧客に対する技術やサービスの提供 )</font> Lambda では、コードは必要時にのみ実行されます。
#AWS の Lambda 関数で使われるトリガーとは
何らかのきっかけで動き出すプログラムのきっかけのことを指します。
今回で言うと、user からメッセージを受け取ってオウム返しをするので、user の行動がトリガーにあたります。
#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)
    
    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"))
            
            return {
                "statusCode": 200,
                "body": json.dumps("Hello from Lambda!")
            }
```
'ACCESSTOKEN'の部分は「Line Developers のチャンネル登録」したときに発行したチャンネルアクセストークンをlambdaで設定してます。![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/8fa8ade8-8ae5-b0da-3e93-a1d2237246e5.png)

ユーザからきたjson形式で来たメッセージの中のtext部分を取得し、POSTリクエストを作成して返す処理が書けました。このままではこの関数は呼ばれないのでトリガーを指定していきます。
#Lambda 関数のトリガー設定
Lambda　コンソール画面の上部、「関数の概要」より、「トリガーを追加」ボタンを押下します。
「トリガーを選択」では「API GateWay」、「APIを作成する」をそれぞれ選択し、APIタイプは「HTTP」を選択します。
セキュリティは今回は「オープン」を選択します。
ここまでできたら「追加」ボタンを押下します。![c6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/d096d9a5-e54d-5618-7055-4c8f846a4f15.png)追加後に、設定タブのトリガーの中にあるAPI GateWayのAPIエンドポイントをコピーして、Messageing API設定の「Webhook URL」に先ほどコピーしたAPI GateWayのAPIエンドポイントを追記してください。
すると実際に友達登録して、メッセージを送った際にオウム返しをしてきます！
#最終的な動きのまとめ
![完成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/77becca6-b9ce-9e8f-9060-8b7ef83e6f84.png)
![さらに詳細図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/3ac48ffd-8ad8-3cca-63c7-7a794ced6487.png)