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 **!
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!
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.
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 le jeton LINE Notify en vous référant aux articles suivants. https://qiita.com/iitenkida7/items/576a8226ba6584864d95
Créez un répertoire approprié dans le compartiment S3.
Dans cet article, nous avons créé le répertoire weather
.
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!
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')
}
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.
Sélectionnez CloudWatch Event et créez deux déclencheurs avec une expression planifiée comme celle-ci:
cron (0 22 * *? *)
→ Commence tous les jours à 7h00 (22h00 UTC)cron (0 8 * *? *)
→ Commence tous les jours à 17h00 (UTC 8 heures)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.
{"event_type": "morning"}
{"event_type": "evening"}
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!
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