LINE Messaging API + EventBridge + Lambda(Python 3.9)で作るLINE bot

●要件

・LINEで気温に応じた適切な服装を通知。

・朝7:30にLINE通知を飛ばす。

●技術選定

LINE Messaging API + EventBridge + Lambda(Python 3.9)

Lambdaのスケジュール実行はCloudWatch Eventsでやると思ったが、AWSがEventBridgeを推奨しているため選択

※イベントを管理するには、Amazon EventBridge が好ましい方法です。 CloudWatch Events と EventBridge は同じ基盤となるサービスと API ですが、 EventBridge はより多くの機能を提供します。

●開発

・天気予報API

OpenWeatherMapを使用

アカウントを作成してAPI Keysを取得してAPIが叩ける。メソッドはGET。

参考:https://auto-worker.com/blog/?p=1612

・LINE Messaging API

チャンネル(bot)を作成してuser IDとChannel access tokenを取得してAPIが叩ける。

curl -v -X POST https://api.line.me/v2/bot/message/push \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer {channel access token}' \
-d '{
    "to": "{user ID}",
    "messages":[
        {
            "type":"text",
            "text":"curl から"
        }
    ]
}'

メッセージ送信に関して参考: https://developers.line.biz/ja/reference/messaging-api/#send-push-message

・Lambda

コードは以下の通り

import json
import urllib.request

def lambda_handler(event, context):
    
   weather_url="http://api.openweathermap.org/data/2.5/weather?q=Tokyo,JP&appid={API Keys}&lang=ja&units=metric"
   weather_req = urllib.request.Request(weather_url)
   with urllib.request.urlopen(weather_url) as res:
    body = json.loads(res.read())
    
    weather_description = body["weather"][0]['description']#天気
    weather_temperature = body['main']['feels_like']#気温

    if weather_temperature >= 20:
      clothes = "半袖"
    elif weather_temperature >= 13:
      clothes = "ライトアウター"
    else:
      clothes = "アウター"
     
    line_UserId="{user ID}"
    line_AccessToken="{Channel access token}"
    line_url = 'https://api.line.me/v2/bot/message/push'
    line_data = {
        "to": line_UserId,
        "messages":[
            {
                "type":"text",
                "text": f"天気は{weather_description} 服装は{clothes}"
            }
        ]
    }
    line_headers = {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer {'+line_AccessToken+'}',
    }
    line_req = urllib.request.Request(line_url, json.dumps(line_data).encode(), line_headers)
    urllib.request.urlopen(line_req)

LambdaでテストするとLINEが来る。

・EventBridge

スケジュールを選択 スケジュールパターン

JST(Japan Standard Time) 時間で時差を考慮する。

日本標準時JST)はUTCに比べて9時間早いため、

日本時間でイベント日時を設定する場合はその9時間前で設定する。

●ゴール