[Yahoo! Weather Replacement Version] So erhalten Sie Wetterinformationen mit LINE Notify + Python

Einführung

Im vorherigen Beitrag So erhalten Sie Wettervorhersagen mit LINE Notify + Python habe ich vorgestellt, wie Sie die von LINE von der Wettervorhersage-Site abgekratzte Wettervorhersage benachrichtigen. ..

Da die Quelle Livedoor-Wettervorhersage ihren Dienst am 31. Juli 2020 beendet hat, wurde der Webdienst, von dem Wetterinformationen gesammelt werden, geändert. Ich entschied mich durchzuführen (Ersatz).

Auswahl und Grund für die Migration

Dieses Mal habe ich Yahoo! Weather als Migrationsziel ausgewählt. スクリーンショット 2020-07-12 14.07.19.png

Der Grund, warum ich mich dafür entschieden habe, ist folgender.

Wenn Sie sich die bereitgestellte RSS-Seite von Yahoo! Weather Forecast ansehen, können Sie die RSS-Daten der Wetterinformationen in jedem Bereich anzeigen.

Ähnlich wie in der vorherigen Zeit wird im Folgenden auf die RSS-Daten von Mito City, Präfektur Ibaraki, verwiesen. スクリーンショット 2020-07-12 12.12.40.png Das Titel-Tag enthält alle gewünschten Informationen, einschließlich Datum, Stadt, Wetter, maximale / minimale Temperatur. Ist das Beschreibungs-Tag eine Zusammenfassung der Wetterinformationen? Wenn Sie diese als Set erhalten, können Sie anscheinend alle erforderlichen Informationen abdecken. Es ist auch GUT, dass der RSS-Wert der Wettervorhersage und die Tag-Struktur identisch sind.

Ausführungsumgebung

--OS: Windows10, Mac OS X, Linux werden akzeptiert.

Quellcode

Die Grundlogik ist dieselbe wie im vorherigen Eintrag (https://qiita.com/S_eki/items/206ddb321768ad4e7544). Es gibt einen kleinen Unterschied in der Beschreibung der Wetterinformationen. Da es zur Beurteilung der Symbolausgabe verwendet wird, wird die Beschreibung mit Yahoo! abgeglichen.

In Yahoo! Weather scheint beispielsweise ●● temporär </ font> </ b> ▲▲ wie eine sonnige temporäre Wolke hinzugefügt zu werden, sodass dies der OP-Bedingung hinzugefügt wird. ..

(Beispiel) Wenn das Wort "sonnig und bewölkt" oder "sonnig und dann bewölkt" oder "sonnig und manchmal bewölkt" in den Wetterinformationen erscheint ... SunToCloud.png

Ein Symbol mit einer sonnigen Markierung + einer wolkigen Markierung wird angezeigt.

GetWeather.py


#!/usr/bin/env python

import urllib.request
from bs4 import BeautifulSoup
import requests

icon_path = "Pfad, in dem das Symbol gespeichert ist (Eingabe mit einem absoluten Pfad)"

#Produktions-Token-ID
line_notify_token = 'ACCESS TOKEN NAME'
#LINE API-URL benachrichtigen
line_notify_api = 'https://notify-api.line.me/api/notify'

#Zu extrahierendes RSS und URL(Die Standardeinstellung ist Mito City, Präfektur Ibaraki)
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 :Eine Methode zum Extrahieren und Analysieren von Wetterinformationen aus HTML-Tags von Wetterinformationswebseiten##########################
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 :Eine Methode zur Ausgabe der erfassten Wetterinformationen und des entsprechenden Symbols################################
def ck_Weather(i, detail):
   if (detail[i].find("Fein")) != -1 and (detail[i].find("Wolkig")) == -1 and (detail[i].find("Regen")) == -1 and (detail[i].find("Schnee")) == -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("Sonnig und vorübergehend bewölkt")) != -1 or (detail[i].find("Sonnig dann bewölkt")) != -1 or (detail[i].find("Sonnig manchmal Wolken")) != -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("Sonniger vorübergehender Regen")) != -1 or (detail[i].find("Sonnig dann regnen")) != -1 or (detail[i].find("Sonnig und manchmal regnet es")) != -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("Sonniger vorübergehender Schnee")) != -1 or (detail[i].find("Sonnig dann Schnee")) != -1 or (detail[i].find("Sonnig und manchmal Schnee")) != -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("Wolkig")) != -1 and (detail[i].find("Fein")) == -1 and (detail[i].find("Regen")) == -1 and (detail[i].find("Schnee")) == -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("Wolkig")) != -1 or (detail[i].find("Bewölkt dann sonnig")) != -1 or (detail[i].find("Bewölkt und manchmal sonnig")) != -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("Bewölkter vorübergehender Regen")) != -1 or (detail[i].find("Bewölkt dann Regen")) != -1 or (detail[i].find("Bewölkt manchmal Regen")) != -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("Bewölkter vorübergehender Schnee")) != -1 or (detail[i].find("Bewölkt dann Schnee")) != -1 or (detail[i].find("Bewölkt manchmal Schnee")) != -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("Regen")) != -1 and (detail[i].find("Fein")) == -1 and (detail[i].find("Wolkig")) == -1 and (detail[i].find("Schnee")) == -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("Vorübergehender Regen")) != -1 or (detail[i].find("Nach dem Regen")) != -1 or (detail[i].find("Regnerisch und manchmal sonnig")) != -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("Vorübergehender bewölkter Regen")) != -1 or (detail[i].find("Bewölkt nach Regen")) != -1 or (detail[i].find("Regen manchmal bewölkt")) != -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("Regen vorübergehender Schnee")) != -1 or (detail[i].find("Schnee nach Regen")) != -1 or (detail[i].find("Regen manchmal Schnee")) != -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("Schnee")) != -1 and (detail[i].find("Fein")) == -1 and (detail[i].find("Regen")) == -1 and (detail[i].find("Wolkig")) == -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("Temporärer Schnee")) != -1 or (detail[i].find("Nach dem Schnee")) != -1 or (detail[i].find("Schnee manchmal sonnig")) != -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("Temporärer bewölkter Schnee")) != -1 or (detail[i].find("Bewölkt nach Schnee")) != -1 or (detail[i].find("Schnee manchmal bewölkt")) != -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("Temporärer Schneeregen")) != -1 or (detail[i].find("Schnee dann Regen")) != -1 or (detail[i].find("Schnee regnet manchmal")) != -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("Sturm")) == -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("Schneesturm")) == -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)


##Hauptverarbeitung###################################################################################

Parser(rssurl) #Extrahieren Sie Wetterinformationen aus HTML-Tags von Wettervorhersageseiten
for i in range(0,2):
    message = tenki[i]
    payload = {'message': "\n" + message}
    headers = {'Authorization': 'Bearer ' + line_notify_token}  

    ck_Weather(i, detail) #Wetterinformationen und entsprechende Wettersymbole ausgeben

message = URL
payload = {'message': message}
headers = {'Authorization': 'Bearer ' + line_notify_token}  # Notify URL
line_notify = requests.post(line_notify_api, data=payload, headers=headers)

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

Ausführungsergebnis

Stellen Sie cron auf Raspberry Pi ein und führen Sie es automatisch aus. Weitere Informationen finden Sie unter "Ausführungsergebnis" und "Ich möchte das Skript automatisch ausführen" und "Symbol gemäß den Wetterinformationen" unter So erhalten Sie die Wettervorhersage mit LINE Notify + Python. Siehe das Kapitel "Ich habe versucht zu löschen".

image1.png image0.png

Ich konnte erfolgreich von der Wettervorhersage von Livedoor auf Yahoo! portieren. Was den Inhalt von RSS betrifft, kann dies einfacher und leichter zu pflegen sein.

Recommended Posts