[Yahoo! Weather Replacement Version] Comment obtenir des informations météo avec LINE Notify + Python

introduction

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).

Sélection et motif de la migration

Cette fois, j'ai choisi Yahoo! Weather comme destination de migration. スクリーンショット 2020-07-12 14.07.19.png

La raison pour laquelle je l'ai choisi est la suivante.

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. スクリーンショット 2020-07-12 12.12.40.png 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.

Environnement d'exécution

--OS: Windows10, Mac OS X, Linux sont tous acceptés.

Code source

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 ... SunToCloud.png

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)

################################################################################################

Résultat d'exécution

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".

image1.png image0.png

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