[PYTHON] Utilisez AWS Lambda + LINE Notify pour avertir LINE de ne pas oublier votre parapluie lorsque vous rentrez chez vous

introduction

Tout le monde a déjà quitté un parapluie dans une entreprise ou une école, non? S'il pleut le lendemain, je suis désespéré sans parapluie. .. ..

Par conséquent, nous avons créé un système qui avertit LINE afin que vous n'oublierez pas votre parapluie lorsque vous rentrez chez vous **!

Produit fini

IMG_1366.PNG

Il est basé sur le système introduit dans l'article suivant qui vous avertit d'avoir un parapluie le matin s'il pleut.

Python + AWS Lambda + Line Notify notifie automatiquement à Line la météo du jour chaque matin.

Mis en œuvre en plus de ce qui précède, ** vous notifie d'apporter votre parapluie le matin s'il pleut ** + ** vous notifie de ramener votre parapluie à la maison lorsque vous rentrez chez vous ** Nous prendrons en charge les jours de pluie avec une position en deux étapes!

Présentation du système

Matin: Prévenez-moi d'avoir un parapluie s'il pleut

reminder_1.jpg

Tout d'abord, lancez Lambda à 7 heures du matin chaque matin dans CloudWatch Event. Lambda obtient les informations météorologiques et dit à LINE d'avoir un parapluie s'il pleut aujourd'hui. Jusqu'à présent, vous pouvez le créer dans Article ci-dessus.

La différence est que s'il pleut, cela créera un fichier dans S3. Ceci est utilisé pour la notification lors du retour à la maison.

De retour à la maison: vous avertir de ramener votre parapluie

reminder_2.jpg

C'est la partie principale ajoutée dans cet article. Tout d'abord, lancez Lambda chaque jour lorsque vous rentrez chez vous dans CloudWatch Event. Lambda vérifiera le S3 et si le fichier a été créé à la date d'aujourd'hui, il déterminera que vous avez un parapluie le matin et informera LINE de le ramener.

C'est très simple! Faisons-le réellement!

Obtenez un jeton de notification LINE

Obtenez le jeton LINE Notify en vous référant aux articles suivants. https://qiita.com/iitenkida7/items/576a8226ba6584864d95

Préparation pour S3

Créez un répertoire approprié dans le compartiment S3. Dans cet article, nous avons créé le répertoire weather.

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

Le système de cet article générera les fichiers suivants dans le répertoire créé ci-dessus. De plus, comme le processus de suppression n'est pas implémenté, il est pratique de définir une règle de cycle de vie et de la supprimer automatiquement après quelques jours!

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

Créée par Lambda

Créez une nouvelle fonction Lambda. Cette fois, le runtime est Python 3.8.

Modifiez le lambda_function.py généré par défaut et collez le code ci-dessous.

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("pluie" in weather_json['forecasts'][0]['telop']):
            send_info("\n☔☔☔☔☔☔☔☔\n Il pleuvra aujourd'hui.\n N'oubliez pas votre parapluie!\n☔☔☔☔☔☔☔☔" + msg)
            put_s3()
    elif(event['event_type'] == "evening" and was_it_raining()):
        send_info("\n☂️☂️☂️☂️☂️☂️☂️☂️\n Prenons le parapluie à la maison!\n☂️☂️☂️☂️☂️☂️☂️☂️")
    
    return {
        'statusCode': 200,
        'body': json.dumps('function finished')
    }

kankyo.png

Créer un événement CloudWatch

Créez deux déclencheurs dans CloudWatch Event pour lancer Lambda le matin (7h00) et lorsque vous rentrez chez vous (17h00). Sur l'écran de la fonction Lambda, cliquez sur "Ajouter un déclencheur" dans le cadre rouge ci-dessous.

triger.png

Sélectionnez CloudWatch Event et créez deux déclencheurs avec une expression planifiée comme celle-ci:

events.png

Cliquez sur l'événement créé pour afficher l'écran d'édition. Définissez ensuite la valeur à transmettre lors du déclenchement de Lambda comme suit.

target.png

Cela transmettra la valeur définie ci-dessus à la variable d'événement de lambda_handler lorsque chaque déclencheur démarre Lambda. Dans Lambda de cet article, par branchement conditionnel avec cette valeur, le traitement du matin et le traitement au moment du retour à la maison sont séparés comme suit. Pratique!

def lambda_handler(event, context):
    if(event['event_type'] == "morning"):
        #Traitement du matin
    elif(event['event_type'] == "evening"):
        #Traitement lors du retour à la maison

C'est tout! Attendons un jour de pluie!

résultat

IMG_1366.PNG

Les notifications sont arrivées à LINE les jours de pluie, le matin et quand je suis rentré à la maison! Grâce à cela, je sens que je suis moins susceptible d'oublier mon parapluie et de le laisser sur la route.

Vous pouvez le créer avec le cadre gratuit d'AWS, alors essayez-le.

Recommended Posts

Utilisez AWS Lambda + LINE Notify pour avertir LINE de ne pas oublier votre parapluie lorsque vous rentrez chez vous
Utilisez AWS lambda pour récupérer les actualités et notifier régulièrement LINE des mises à jour [python]
ImportError lors de la tentative d'utilisation du package gcloud avec la version AWS Lambda Python
Lorsque vous souhaitez l'utiliser tel quel lorsque vous l'utilisez avec lambda memo
Création d'un LINE BOT pour notifier d'autres concours AtCoder à l'aide d'AWS
Comment se souvenir quand on oublie un mot
Résumé de l'étude de Python pour utiliser AWS Lambda
Utilisons AWS Lambda pour créer un mécanisme pour notifier Slack lorsque la valeur surveillée par CloudWatch est dépassée sur Python
J'ai essayé d'obtenir une AMI en utilisant AWS Lambda
[Python] Lorsque vous souhaitez importer et utiliser votre propre package dans le répertoire supérieur
Que faire si vous obtenez une erreur non définie lorsque vous essayez d'utiliser pip avec pyenv