Dans le post précédent Comment obtenir les prévisions météo avec LINE Notify + Python, j'ai présenté comment notifier les prévisions météorologiques extraites du site de prévisions météo par LINE. ..
Cependant, depuis que la source prévisions météo liveoor a mis fin à son service le 31 juillet 2020, le service Web à partir duquel les informations météorologiques sont collectées a été modifié. J'ai décidé d'effectuer (remplacement).
Cette fois, j'ai choisi Yahoo! Weather comme destination de migration.
La raison pour laquelle je l'ai choisi est la suivante.
La structure de la balise est simple et pas si différente de la rss de prévision météorologique de Livingoor, de sorte que la quantité de correction peut être minimisée.
Major en tant que service de prévisions météorologiques. Il est peu probable que le service se termine dans le futur.
Si vous regardez la page RSS fournie de Yahoo! Weather Forecast, vous pouvez voir les données RSS des informations météorologiques dans chaque zone.
Semblable à la fois précédente, ce qui suit est une référence aux données RSS de la ville de Mito, préfecture d'Ibaraki. La balise de titre contient toutes les informations que vous souhaitez, y compris la date, la ville, la météo, la température maximale / minimale. L'étiquette de description est-elle un résumé des informations météorologiques? Si vous les obtenez sous forme d'ensemble, il semble que vous puissiez couvrir toutes les informations nécessaires. Il est également BON que le flux RSS des prévisions météorologiques et la structure des balises soient les mêmes.
--OS: Windows10, Mac OS X, Linux sont tous acceptés.
La logique de base est la même que celle de l'entrée précédente (https://qiita.com/S_eki/items/206ddb321768ad4e7544), Il y a une légère différence dans la description des informations météorologiques. Puisqu'il est utilisé pour juger de la sortie de l'icône, la description correspond à Yahoo!.
Par exemple, dans Yahoo! Weather, il semble que ●● temporaire </ font> </ b> ▲▲ est ajouté comme un nuage temporaire ensoleillé, donc ceci est ajouté à la condition OR. ..
(Exemple) Lorsque le mot "ensoleillé temporairement nuageux" ou "ensoleillé puis nuageux" ou "ensoleillé parfois nuageux" apparaît dans les informations météorologiques ...
Une icône avec une marque ensoleillée + une marque nuageuse s'affiche.
GetWeather.py
#!/usr/bin/env python
import urllib.request
from bs4 import BeautifulSoup
import requests
icon_path = "Chemin où l'icône est stockée (entrez avec un chemin absolu)"
#ID du jeton de production
line_notify_token = 'ACCESS TOKEN NAME'
#URL de l'API de notification LINE
line_notify_api = 'https://notify-api.line.me/api/notify'
#RSS et URL à extraire(La valeur par défaut est Mito City, Ibaraki Prefecture)
rssurl = "https://rss-weather.yahoo.co.jp/rss/days/4010.xml"
URL = "https://weather.yahoo.co.jp/weather/jp/8/4010/8201.html"
tenki = []
detail = []
## Parser :Une méthode pour extraire et analyser des informations météorologiques à partir de balises HTML de pages Web d'informations météorologiques##########################
def Parser(rssurl):
with urllib.request.urlopen(rssurl) as res:
xml = res.read()
soup = BeautifulSoup(xml, "html.parser")
for item in soup.find_all("item"):
title = item.find("title").string
description = item.find("description").string
if title.find("[ PR ]") == -1:
tenki.append(title)
detail.append(description)
## ck_Weather :Une méthode qui génère les informations météorologiques acquises et l'icône correspondante################################
def ck_Weather(i, detail):
if (detail[i].find("Bien")) != -1 and (detail[i].find("Nuageux")) == -1 and (detail[i].find("pluie")) == -1 and (detail[i].find("neige")) == -1:
files = {'imageFile': open(icon_path + "Sun.png ","rb")}
line_notify = requests.post(line_notify_api, data=payload, headers=headers, files=files)
elif (detail[i].find("Ensoleillé et temporairement nuageux")) != -1 or (detail[i].find("Ensoleillé puis nuageux")) != -1 or (detail[i].find("Ensoleillé parfois nuages")) != -1:
files = {'imageFile': open(icon_path + "SunToCloud.png ","rb")}
line_notify = requests.post(line_notify_api, data=payload, headers=headers, files=files)
elif (detail[i].find("Pluie temporaire ensoleillée")) != -1 or (detail[i].find("Ensoleillé puis pluie")) != -1 or (detail[i].find("Ensoleillé et parfois pluie")) != -1:
files = {'imageFile': open(icon_path + "SunToRain.png ","rb")}
line_notify = requests.post(line_notify_api, data=payload, headers=headers, files=files)
elif (detail[i].find("Neige temporaire ensoleillée")) != -1 or (detail[i].find("Ensoleillé puis neige")) != -1 or (detail[i].find("Ensoleillé et parfois neige")) != -1:
files = {'imageFile': open(icon_path + "SunToSnow.png ","rb")}
line_notify = requests.post(line_notify_api, data=payload, headers=headers, files=files)
elif (detail[i].find("Nuageux")) != -1 and (detail[i].find("Bien")) == -1 and (detail[i].find("pluie")) == -1 and (detail[i].find("neige")) == -1:
files = {'imageFile': open(icon_path + "Cloud.png ","rb")}
line_notify = requests.post(line_notify_api, data=payload, headers=headers, files=files)
elif (detail[i].find("Nuageux")) != -1 or (detail[i].find("Nuageux puis ensoleillé")) != -1 or (detail[i].find("Nuageux et parfois ensoleillé")) != -1:
files = {'imageFile': open(icon_path + "CloudToSun.png ","rb")}
line_notify = requests.post(line_notify_api, data=payload, headers=headers, files=files)
elif (detail[i].find("Nuageux pluie temporaire")) != -1 or (detail[i].find("Nuageux puis pluie")) != -1 or (detail[i].find("Nuageux parfois pluie")) != -1:
files = {'imageFile': open(icon_path + "CloudToRain.png ","rb")}
line_notify = requests.post(line_notify_api, data=payload, headers=headers, files=files)
elif (detail[i].find("Nuageux, neige temporaire")) != -1 or (detail[i].find("Nuageux puis neige")) != -1 or (detail[i].find("Nuageux parfois neige")) != -1:
files = {'imageFile': open(icon_path + "CloudToSnow.png ","rb")}
line_notify = requests.post(line_notify_api, data=payload, headers=headers, files=files)
elif (detail[i].find("pluie")) != -1 and (detail[i].find("Bien")) == -1 and (detail[i].find("Nuageux")) == -1 and (detail[i].find("neige")) == -1:
files = {'imageFile': open(icon_path + "Rain.png ","rb")}
line_notify = requests.post(line_notify_api, data=payload, headers=headers, files=files)
elif (detail[i].find("Pluie temporaire")) != -1 or (detail[i].find("Après la pluie")) != -1 or (detail[i].find("Pluvieux et parfois ensoleillé")) != -1:
files = {'imageFile': open(icon_path + "RainToSun.png ","rb")}
line_notify = requests.post(line_notify_api, data=payload, headers=headers, files=files)
elif (detail[i].find("Pluie nuageuse temporaire")) != -1 or (detail[i].find("Nuageux après la pluie")) != -1 or (detail[i].find("Pluie parfois nuageux")) != -1:
files = {'imageFile': open(icon_path + "RainToCloud.png ","rb")}
line_notify = requests.post(line_notify_api, data=payload, headers=headers, files=files)
elif (detail[i].find("Pluie de neige temporaire")) != -1 or (detail[i].find("Neige après la pluie")) != -1 or (detail[i].find("Pluie parfois neige")) != -1:
files = {'imageFile': open(icon_path + "RainToSnow.png ","rb")}
line_notify = requests.post(line_notify_api, data=payload, headers=headers, files=files)
elif (detail[i].find("neige")) != -1 and (detail[i].find("Bien")) == -1 and (detail[i].find("pluie")) == -1 and (detail[i].find("Nuageux")) == -1:
files = {'imageFile': open(icon_path + "Snow.png ","rb")}
line_notify = requests.post(line_notify_api, data=payload, headers=headers, files=files)
elif (detail[i].find("Neige temporaire")) != -1 or (detail[i].find("Après la neige")) != -1 or (detail[i].find("Neige parfois ensoleillée")) != -1:
files = {'imageFile': open(icon_path + "SnowToSun.png ","rb")}
line_notify = requests.post(line_notify_api, data=payload, headers=headers, files=files)
elif (detail[i].find("Neige nuageuse temporaire")) != -1 or (detail[i].find("Nuageux après la neige")) != -1 or (detail[i].find("Neige parfois nuageux")) != -1:
files = {'imageFile': open(icon_path + "SnowToCloud.png ","rb")}
line_notify = requests.post(line_notify_api, data=payload, headers=headers, files=files)
elif (detail[i].find("Pluie de neige temporaire")) != -1 or (detail[i].find("Neige puis pluie")) != -1 or (detail[i].find("Neige parfois pluie")) != -1:
files = {'imageFile': open(icon_path + "SnowToRain.png ","rb")}
line_notify = requests.post(line_notify_api, data=payload, headers=headers, files=files)
elif (detail[i].find("tempête")) == -1:
files = {'imageFile': open(icon_path + "Typhon.png ","rb")}
line_notify = requests.post(line_notify_api, data=payload, headers=headers, files=files)
elif (detail[i].find("Tempête de neige")) == -1:
files = {'imageFile': open(icon_path + "HeavySnow.png ","rb")}
line_notify = requests.post(line_notify_api, data=payload, headers=headers, files=files)
else:
line_notify = requests.post(line_notify_api, data=payload, headers=headers)
##Traitement principal###################################################################################
Parser(rssurl) #Extraire les informations météorologiques des balises HTML des sites de prévisions météorologiques
for i in range(0,2):
message = tenki[i]
payload = {'message': "\n" + message}
headers = {'Authorization': 'Bearer ' + line_notify_token}
ck_Weather(i, detail) #Sortie des informations météorologiques et des icônes météorologiques correspondantes
message = URL
payload = {'message': message}
headers = {'Authorization': 'Bearer ' + line_notify_token} # Notify URL
line_notify = requests.post(line_notify_api, data=payload, headers=headers)
################################################################################################
Définissez cron sur Raspberry Pi et exécutez-le automatiquement. Pour plus de détails, voir "Résultat de l'exécution" et "Je veux exécuter automatiquement le script" et "Icône en fonction des informations météo" dans Comment obtenir les prévisions météo avec LINE Notify + Python. Voir le chapitre "J'ai essayé d'éteindre".
J'ai pu transférer avec succès les prévisions météorologiques de Liveoor vers Yahoo!. En ce qui concerne le contenu du RSS, cela peut être plus simple et plus facile à maintenir.
Recommended Posts