[PYTHON] Verwenden Sie AWS Lambda + LINE Benachrichtigen, um LINE zu benachrichtigen, dass Sie Ihren Regenschirm nicht vergessen, wenn Sie nach Hause kommen

Einführung

Jeder hat einmal einen Regenschirm in einer Firma oder Schule hinterlassen, oder? Wenn es am nächsten Tag regnet, bin ich ohne Regenschirm verzweifelt. .. ..

Aus diesem Grund haben wir ein System erstellt, das LINE benachrichtigt, damit Sie Ihren Regenschirm nicht vergessen, wenn Sie nach Hause zurückkehren **!

Fertiges Produkt

IMG_1366.PNG

Es basiert auf dem im folgenden Artikel vorgestellten System, das Sie benachrichtigt, wenn es regnet, morgens einen Regenschirm zu haben.

Python + AWS Lambda + Line Notify benachrichtigt Line jeden Morgen automatisch über das heutige Wetter.

Zusätzlich zu den oben genannten implementiert: ** Benachrichtigen Sie, dass Sie Ihren Regenschirm am Morgen mitbringen müssen, wenn es regnet. ** + ** Benachrichtigen Sie, dass Sie Ihren Regenschirm nach Hause bringen sollen, wenn Sie nach Hause kommen. ** Unterstützt Regentage!

Systemübersicht

Morgen: Benachrichtigen Sie mich, dass ich einen Regenschirm haben soll, wenn es regnet

reminder_1.jpg

Starten Sie Lambda jeden Morgen um 7 Uhr morgens im CloudWatch Event. Lambda erhält die Wetterinformationen und fordert LINE auf, einen Regenschirm zu haben, wenn es heute regnet. Bis zu diesem Punkt können Sie es mit obigem Artikel erstellen.

Der Unterschied besteht darin, dass bei Regen eine Datei in S3 erstellt wird. Dies wird zur Benachrichtigung bei der Rückkehr nach Hause verwendet.

Wenn Sie nach Hause zurückkehren: Benachrichtigen Sie Sie, dass Sie Ihren Regenschirm nach Hause bringen sollen

reminder_2.jpg

Dies ist der Hauptteil, der in diesem Artikel hinzugefügt wird. Starten Sie Lambda zunächst jeden Tag, wenn Sie in CloudWatch Event nach Hause kommen. Lambda überprüft den S3 und wenn die Datei am heutigen Datum erstellt wurde, stellt es fest, dass Sie morgens einen Regenschirm haben, und benachrichtigt LINE, um ihn zurückzubringen.

Es ist sehr einfach! Lass es uns tatsächlich schaffen!

Holen Sie sich LINE Notify Token

Beziehen Sie das LINE-Benachrichtigungstoken anhand der folgenden Artikel. https://qiita.com/iitenkida7/items/576a8226ba6584864d95

Vorbereitung für S3

Erstellen Sie ein entsprechendes Verzeichnis im S3-Bucket. In diesem Artikel haben wir das Verzeichnis "Wetter" erstellt.

スクリーンショット 2020-01-28 21.12.20.png

Das System in diesem Artikel generiert die folgenden Dateien in dem oben erstellten Verzeichnis. Da der Löschvorgang nicht implementiert ist, ist es außerdem praktisch, eine Lebenszyklusregel festzulegen und diese nach einigen Tagen automatisch zu löschen!

スクリーンショット 2020-01-28 21.12.10.png

Erstellt von Lambda

Erstellen Sie eine neue Lambda-Funktion. Diesmal ist die Laufzeit Python 3.8.

Bearbeiten Sie die standardmäßig generierte lambda_function.py und fügen Sie den folgenden Code ein.

lambda_function.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import json
import sys
import urllib.parse
import urllib.request
import datetime
import os
import boto3

# weather's API
WEATHER_URL="http://weather.livedoor.com/forecast/webservice/json/v1?city=%s"
CITY_CODE="130010" # TOKYO
TODAY=0

# LINE notify's API
LINE_TOKEN = os.environ['LINE_TOKEN']
LINE_NOTIFY_URL = "https://notify-api.line.me/api/notify"

S3_BUCKET_NAME = os.environ['S3_BUCKET_NAME']
S3_PREFIX = "weather/"
s3 = boto3.resource('s3')
s3Client = boto3.client('s3')

def get_weather_info():
    try:
        url = WEATHER_URL % CITY_CODE
        html = urllib.request.urlopen(url)
        html_json = json.loads(html.read().decode('utf-8'))
    except Exception as e:
        print ("Exception Error: ", e)
        sys.exit(1)
    return html_json

def set_weather_info(weather_json, day):
    min_temperature = None
    max_temperature = None
    try:
        date = weather_json['forecasts'][day]['date']
        weather = weather_json['forecasts'][day]['telop']
        max_temperature = weather_json['forecasts'][day]['temperature']['max']['celsius']
        min_temperature = weather_json['forecasts'][day]['temperature']['min']['celsius']
    except TypeError:
        # temperature data is None etc...
        pass
    msg = "%s\nweather: %s\nmin: %s\nmax: %s" % \
               (date, weather, min_temperature, max_temperature)
    return msg

def send_info(msg):
    method = "POST"
    headers = {"Authorization": "Bearer %s" % LINE_TOKEN}
    payload = {"message": msg}
    try:
        payload = urllib.parse.urlencode(payload).encode("utf-8")
        req = urllib.request.Request(
            url=LINE_NOTIFY_URL, data=payload, method=method, headers=headers)
        urllib.request.urlopen(req)
    except Exception as e:
        print ("Exception Error: ", e)
        sys.exit(1)
        
def put_s3():
    now = datetime.datetime.now() + datetime.timedelta(hours=9) ## UTC+9
    obj = s3.Object(S3_BUCKET_NAME, S3_PREFIX + now.strftime('%Y-%m-%d'))
    obj.put()
        
def was_it_raining():
    now = datetime.datetime.now() + datetime.timedelta(hours=9) ## UTC+9
    contents = s3Client.list_objects(Bucket=S3_BUCKET_NAME, Prefix=S3_PREFIX)["Contents"]
    if contents:
        for content in contents:
            if content.get("Key") == S3_PREFIX + now.strftime('%Y-%m-%d'):
                return True
    return False
        
def lambda_handler(event, context):
    if('event_type' not in event):
        return {
            'statusCode': 400,
            'body': json.dumps('event_type does not exist in event')
        }
    
    if(event['event_type'] == "morning"):
        weather_json = get_weather_info()
        msg = set_weather_info(weather_json, TODAY)
        if("Regen" in weather_json['forecasts'][0]['telop']):
            send_info("\n☔☔☔☔☔☔☔☔\n Es wird heute regnen.\n Vergiss deinen Regenschirm nicht!\n☔☔☔☔☔☔☔☔" + msg)
            put_s3()
    elif(event['event_type'] == "evening" and was_it_raining()):
        send_info("\n☂️☂️☂️☂️☂️☂️☂️☂️\n Nehmen wir den Regenschirm mit nach Hause!\n☂️☂️☂️☂️☂️☂️☂️☂️")
    
    return {
        'statusCode': 200,
        'body': json.dumps('function finished')
    }

kankyo.png

Erstellen eines CloudWatch-Ereignisses

Erstellen Sie im CloudWatch-Ereignis zwei Trigger, um Lambda am Morgen (7:00 Uhr) und nach Ihrer Ankunft (17:00 Uhr) zu starten. Klicken Sie auf dem Lambda-Funktionsbildschirm im roten Rahmen unten auf "Trigger hinzufügen".

triger.png

Wählen Sie CloudWatch Event und erstellen Sie zwei Trigger mit einem geplanten Ausdruck wie folgt:

events.png

Klicken Sie auf das erstellte Ereignis, um den Bearbeitungsbildschirm anzuzeigen. Stellen Sie dann den Wert, der beim Auslösen von Lambda übergeben werden soll, wie folgt ein.

target.png

Dadurch wird der oben festgelegte Wert an die Ereignisvariable von lambda_handler übergeben, wenn jeder Trigger Lambda startet. In Lambda dieses Artikels werden durch bedingte Verzweigung mit diesem Wert die morgendliche Verarbeitung und die Verarbeitung zum Zeitpunkt der Rückkehr nach Hause wie folgt getrennt. Praktisch!

def lambda_handler(event, context):
    if(event['event_type'] == "morning"):
        #Morgenbearbeitung
    elif(event['event_type'] == "evening"):
        #Bearbeitung bei der Rückkehr nach Hause

Das ist es! Warten wir auf einen regnerischen Tag!

Ergebnis

IMG_1366.PNG

An Regentagen, am Morgen und als ich nach Hause kam, kamen Benachrichtigungen zu LINE! Dank dessen habe ich das Gefühl, dass ich meinen Regenschirm weniger wahrscheinlich vergesse und ihn unterwegs lasse.

Sie können es mit dem kostenlosen Rahmen von AWS erstellen. Probieren Sie es also aus.

Recommended Posts

Verwenden Sie AWS Lambda + LINE Benachrichtigen, um LINE zu benachrichtigen, dass Sie Ihren Regenschirm nicht vergessen, wenn Sie nach Hause kommen
Verwenden Sie AWS Lambda, um Nachrichten zu kratzen und LINE regelmäßig über Updates zu informieren [Python]
ImportError beim Versuch, das gcloud-Paket mit der AWS Lambda Python-Version zu verwenden
Wenn Sie es so verwenden möchten, wie es ist, wenn Sie es mit Lambda-Memo verwenden
Erstellen eines LINE BOT, um zusätzliche AtCoder-Wettbewerbe mit AWS zu benachrichtigen
Wie man sich erinnert, wenn man ein Wort vergisst
Zusammenfassung des Studiums von Python zur Verwendung von AWS Lambda
Verwenden Sie AWS Lambda, um einen Mechanismus zu erstellen, der Slack benachrichtigt, wenn der von CloudWatch überwachte Wert in Python überschritten wird
Ich habe versucht, mit AWS Lambda einen AMI zu erhalten
[Python] Wenn Sie Ihr eigenes Paket im oberen Verzeichnis importieren und verwenden möchten
Was tun, wenn beim Versuch, pip mit pyenv zu verwenden, ein undefinierter Fehler angezeigt wird?