LoginSignup
1
2

ハッカソン参加時の備忘録 ~ 第2回:【Python】1番お手軽なGUIであるLINEとAWS(Lambda)の連携をしてみよう ~

Last updated at Posted at 2023-12-25

こんにちは。
ITエンジニアのきゅうと申します。

概要

さて、第2回は早速ちょっとしたアプリ開発を基に、ハッカソンで必要なIT技術に触れていきましょう。
ということで、今回はLINEのMessageAPIとAWSのLambdaを使った、オウム返しアプリを作っていきます。

何故これが最初なのか?
何度も言っておりますが、ハッカソンはとにかく時間がありません。
その中で動くものを作るとなると、UI(ユーザインタフェース)にかける時間は限りなく少なくしたい!!
だけど、UIを疎かにするとバック処理で凄いアプリを作ったとしても、見た目がショボい為、アプリ全体もショボい評価となってしまいます。

このジレンマを解消してくれる1つの手段が、LINE Bot(MessageAPI)になります。

LINE BotはLINE DeveloperとLINE Official Accountを登録することで、
簡単にLINEのMessageAPIを呼び出し、意図した処理を行って返答するBotアプリを作成することができるのです!!

テクニカル

  • Python3.11
  • AWS lambda
  • Line Message API

手順

LINE Developersのコンソールより、プロバイダーを作成する。

1.LINE Developersにアクセスする。

2.右上の『コンソール』をクリックする。

image.png

3.ページの真ん中にある「作成」ボタンをクリックする。

image.png

4.ポップアップした『新規プロバイダー作成』画面の赤枠内に任意のプロバイダー名を入力する。

 その後、「作成」ボタンを押下する。
 ※今回は「Test_Provider」と入力する。
image.png

5.プロバイダーの作成に成功!!

image.png

作成したプロバイダーはまだ何もサービスが登録されていないので、
使用したいサービスを選択します。
選択できるサービスは以下になります。

  • LINEログイン
  • Messaing API
  • ブロックチェーンサービス
  • LINEミニアプリ

今回はその中の「Messaing API」を選択します。

Messaging API(チャンネル)を設定する。

1.先ほどの画面で、『Messaging API』を選択する。

image.png

2.入力画面に遷移するので、必要な内容を入力する。

※今回は画面キャプチャーの取得の関係で、スマホの画面となっておりますが、大きな違いはありません。
※一応、入力例を載せさせていただきます。
developers.line.biz_console_channel_new_provider=2001053284&type=messaging-api (1).png

3.「作成」ボタンを押下すると、『確認』画面が表示されますので、「OK」を押下。

image.png

4.その後の情報利用に関する同意書も『同意する』を押下する。

image.png

5.チャンネルが作成されました。

image.png

AWSのLambda関数を作成する。

1.AWSのLambdaにアクセスし、「関数作成」ボタンを押下

さて、ここからはAWSにてLambda関数を作成していきます。
AWSにログインし、上部の検索テキストボックスで『Lambda』と入力し、Lambdaを開きましょう。
その後、「関数作成」ボタンを押下します。

2.関数の初期設定をします。

以下のように設定していきましょう。
01.png

<以下、注意ポイント>
1.『ランタイム』については、タイミングによって表示内容がコロコロ変わります。
  キャプチャー時は2023/12となりますので、最新のPythonとバージョンを選択しましょう。
2.『関数URLを有効化』にチェックを入れておきましょう。
  また、認証タイプと呼ばれる選択肢が増えるので、『NONE』を選択しましょう。
その他はデフォルトでも構いません。適宜設定してくださいな。

3.関数の作成に成功。

関数の作成に成功すると、関数の一覧に命名した関数名が表示されます。
それをクリックすると以下のような画面が表示され、設定した通りの関数が作成されたことが分かります。
02.png

4.『lambda_function.py』の中身を修正する。

『lambda_function.py』の中身を以下のPythonソースで置き換えます。

- import json
- 
- def lambda_handler(event, context):
-     # TODO implement
-     return {
-         'statusCode': 200,
-         'body': json.dumps('Hello from Lambda!')
-     }

+ 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!")
+     }

↓↓↓ コピー用 ↓↓↓

import logging
import os
import urllib.request
import json

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

def lambda_handler(event, context):
    
    logger.info(event)
    
    print("1.")
    print(event)
    for message_event in json.loads(event["body"])["events"]:
        print("2.")
        
        logger.info(json.dumps(message_event))
        
        url = "https://api.line.me/v2/bot/message/reply"
        print("3.")
        headers = {
            "Content-Type": "application/json",
            'Authorization': 'Bearer ' + os.environ['ACCESSTOKEN']
        }
        print("3.")

        data = {
            "replyToken": message_event["replyToken"],
            "messages": [
                {
                    "type": "text",
                    "text": message_event["message"]["text"],
                }
            ]
        }
        
        print("4.")
        req = urllib.request.Request(url=url, data=json.dumps(data).encode("utf-8"), method="POST", headers=headers)
        
        print("5.")
        with urllib.request.urlopen(req) as res:
            
            logger.info(res.read().decode("utf-8"))
            print("6.")
            return {
                "statusCode": 200,
                "body": json.dumps("Hello from Lambda!")
            }
    
    return {
        "statusCode": 200,
        "body": json.dumps("Hello from Lambda!")
    }



5.環境変数を設定する。

上記のソースコードの内、

           'Authorization': 'Bearer ' + os.environ['ACCESSTOKEN']

の部分で環境変数を使用しておりますので、環境変数を設定します。
そもそもLINE DevelopersのAccessTokenはどちらで確認できるのか?

  1. 『LINE Developers』にアクセス

  2. 対象のプロバイダーを選択。

  3. プロバイダー設定画面の以下で確認が可能です。
    03.png

  4. AWSのLambdaに戻り、『設定』タブ⇒『環境変数』⇒『編集』ボタンをクリック
    04.png

  5. キーに「ACCESSTOKEN」、値に【3.で確認したアクセストークン】を設定し、「保存」をクリック
    05.png

6.『AWS API Gateway』の設定

  1. Lambda関数の上部のイメージ図より『トリガーを追加』をクリック
    06.png
  2. 「トリガーを追加」画面で以下のように設定します。
    07.png
  3. イメージ図の中に「API Gateway」が追加されるのでそれをクリック
  4. 『API endpoint:』という項目があるので、その後のURLをコピーします。
  5. LINE Developersの以下の場所にコピーしたエンドポイントを貼り付けます。
      ●(プロバイダーを選択)⇒「Message API設定」⇒『Webhook設定』

7.その他、エラーが出たときの設定

さて、以上で基本的な設定は終了です。
●(プロバイダーを選択)⇒「Message API設定」⇒『QRコード』
から、友達登録し、メッセージを送付してみましょう。

ここで、メッセージがオウム返しされなかったり、エラーが返ってきてしまう時があります。
そんな時は以下を試してみてください。

➀、「Webhookの利用」がONになっているか?

●(プロバイダーを選択)⇒「Message API設定」⇒『Webhookの利用』
について、『ON』になっている必要があります。
まずはそこを確認してみましょう!!
08.png

➁、『LINE official Account Manager』の自動応答メッセージの応答メッセージからステータスをオフにする

『LINE official Account Manager』にアクセスし、対象のアカウントを選択。
その後以下の画像の個所を確認し、『OFF(無効)』となっていることを確認しましょう。
09.png

以上、いかがでしょうか??
下記の画像のようにオウム返し出来ましたでしょうか??
10.png

簡単ですので、是非是非試してみてくださいね!!

次回は、Lambdaを外部接続させるためにNATゲートウェイを用意したいと思います。

ということで、本日はここまでです。
少しでも参考になったと思いましたら、「いいね」や「ストック」を押していただけますと、今後の励みになりますので、是非とも宜しくお願い致します。

最後までお読み頂きありがとうございました。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2