[PYTHON] Obtenez des informations météorologiques à l'aide de Yahoo! Open Local Platform (YOLP) et laissez Razpai parler avec AquesTalkPi

Pour une raison quelconque, si vous recherchez quelque chose qui vous fournira facilement des informations météorologiques, de préférence demain ou après-demain, mais dans environ ◯◯ minutes à partir de maintenant, Yahoo! Open Local J'ai trouvé Platform (YOLP). Je n'ai pas trouvé beaucoup de cas d'utilisation, mais c'était très pratique et intéressant, je vais donc le résumer brièvement. Comme d'habitude, si je peux faire quelque chose qui devrait être ajouté, je l'écrirai dans blog.

[À propos de YOLP]

Selon le site officiel

Yahoo! Open Local Platform (YOLP) est une API / SDK pour les cartes et les informations régionales fournies par Yahoo! JAPAN pour les développeurs.

(Extrait de http://developer.yahoo.co.jp/webapi/map/) Et cela. Il y a API d'informations météorologiques, ce qui est très pratique. Le cas de l'utilisation commerciale est mentionné à l'adresse http://www.yahoo-help.jp/app/answers/detail/p/537/a_id/43405, et résumé en gros: «L'utilisation à des fins non commerciales est Elle est acceptée. Elle n'interdit pas toute utilisation par des sites commerciaux et des entreprises, et si vous souhaitez l'utiliser pour des entreprises, veuillez consulter la fenêtre de demande de chaque API. "

[Acquérir des informations météorologiques]

Préparation: obtenir l'ID de l'application

Obtenez l'ID de l'application conformément au "Guide de l'utilisateur". En ce qui concerne le contenu enregistré, il n'y a pas de quoi s'inquiéter, je vais donc omettre l'explication.

Essayez-le avec un script Python

En lisant Explication de l'API des informations météorologiques, essayez de l'obtenir avec Python.

L'URL cible est http://weather.olp.yahooapis.jp/v1/place, qu'elle soit acquise en XML ou JSON. C'est un flux très standard que JSON est retourné lorsque vous obtenez les informations nécessaires sous forme de requête et que vous les attachez.

Pour le moment, en termes de contrôle de fonctionnement, les trois suivants sont suffisants.

--appid: ID de l'application. Obtenu par la procédure ci-dessus. -coordonnées: latitude et longitude. Séparé par des virgules dans l'ordre de la longitude et de la latitude. Lorsque vous recherchez plusieurs points, séparez-les avec un espace demi-largeur (jusqu'à 10 points) --output: format de sortie. Soit xml / json.

Les données ponctuelles qui disent "Il pleut maintenant ou est sur le point de pleuvoir" sont plus intéressantes, il s'est donc avéré qu'il pleuvait au moment de la confirmation, près de la ville de Nanagajuku, préfecture de Miyagi. Essaie.

getOtenki.py


#!/usr/bin/python
# encoding:utf-8

import urllib
import pprint
import json

APP_ID = "***************************************"

BASE_URL = "http://weather.olp.yahooapis.jp/v1/place"
COORDINATES = "140.471414,38.026973"
OUTPUT="json"

url = BASE_URL + "?appid=%s&coordinates=%s&output=%s" % (APP_ID,COORDINATES,OUTPUT)
# print (url)

json_tree = json.loads( urllib.urlopen(url).read())
pprint.pprint(json_tree)

Le résultat de sortie ressemble à ceci.

{u'Feature': [{u'Geometry': {u'Coordinates': u'140.47141,38.026973',
                             u'Type': u'point'},
               u'Id': u'201609231900_140.47141_38.026973',
               u'Name': u'\u5730\u70b9(140.47141,38.026973)\u306e2016\u5e7409\u670823\u65e5 19\u664200\u5206\u304b\u308960\u5206\u9593\u306e\u5929\u6c17\u60c5\u5831',
               u'Property': {u'WeatherAreaCode': 3420,
                             u'WeatherList': {u'Weather': [{u'Date': u'201609231900',
                                                            u'Rainfall': 5.25,
                                                            u'Type': u'observation'},
                                                           {u'Date': u'201609231910',
                                                            u'Rainfall': 0.95,
                                                            u'Type': u'forecast'},
                                                           {u'Date': u'201609231920',
                                                            u'Rainfall': 2.13,
                                                            u'Type': u'forecast'},
                                                           {u'Date': u'201609231930',
                                                            u'Rainfall': 1.25,
                                                            u'Type': u'forecast'},
                                                           {u'Date': u'201609231940',
                                                            u'Rainfall': 0.55,
                                                            u'Type': u'forecast'},
                                                           {u'Date': u'201609231950',
                                                            u'Rainfall': 0.0,
                                                            u'Type': u'forecast'},
                                                           {u'Date': u'201609232000',
                                                            u'Rainfall': 1.75,
                                                            u'Type': u'forecast'}]}}}],
 u'ResultInfo': {u'Copyright': u'(C) Yahoo Japan Corporation.',
                 u'Count': 1,
                 u'Description': u'',
                 u'Latency': 0.004469,
                 u'Start': 1,
                 u'Status': 200,
                 u'Total': 1}}

Les données que vous voulez existent dans json_tree ['Feature'] [0] ['Property'] ['WeatherList'] ['Weather'], vous pouvez donc obtenir les données nécessaires comme celle-ci.

#!/usr/bin/python
# encoding:utf-8

import urllib
import pprint
import json

APP_ID = "******************************"

BASE_URL = "http://weather.olp.yahooapis.jp/v1/place"
COORDINATES = "140.471414,38.026973"
OUTPUT="json"

url = BASE_URL + "?appid=%s&coordinates=%s&output=%s" % (APP_ID,COORDINATES,OUTPUT)
# print (url)

json_tree = json.loads( urllib.urlopen(url).read())
#pprint.pprint(json_tree)

for var in range(0,7):
    date = json_tree['Feature'][0]['Property']['WeatherList']['Weather'][var]['Date']
    rainfall = json_tree['Feature'][0]['Property']['WeatherList']['Weather'][var]['Rainfall']
    type = json_tree['Feature'][0]['Property']['WeatherList']['Weather'][var]['Type']
    print("%s,%s,%s"%(date,rainfall,type))

Le résultat de sortie ressemble à ceci. En regardant le Champ de réponse, dans le champ Type, l'observation est la valeur mesurée et la prévision est la valeur prédite. Est montré. De plus, le champ Pluie est l'intensité des précipitations (ce n'est pas la quantité de précipitations car c'est la valeur obtenue en convertissant l'intensité observée des précipitations en mm / h). Hmmmm.

201609231945,0.85,observation
201609231955,0.0,forecast
201609232005,2.13,forecast
201609232015,1.45,forecast
201609232025,1.45,forecast
201609232035,1.95,forecast
201609232045,0.0,forecast

Je veux obtenir la latitude et la longitude à partir du code postal et prévoir la météo

J'ai pu répondre aux exigences minimales ci-dessus, mais il n'est pas bon de spécifier les coordonnées une par une, donc l 'API de recherche de code postal également fournie par YOLP Je veux utiliser (/webapi/map/openlocalplatform/v1/zipcodesearch.html) pour "prendre un code postal comme argument et il tirera automatiquement les coordonnées".

Ce n'est pas non plus intéressant à moins qu'il ne soit sur le point de descendre, je vais donc préciser le code postal de l'Oi Matsuda IC qui est sur le point de descendre. De plus, si le code postal n'est pas spécifié, les données près de Hama Rikyu seront affichées.

#!/usr/bin/python
# encoding:utf-8

import urllib
import pprint
import json
import sys

APP_ID = "***********************************"

BASE_URL = "http://weather.olp.yahooapis.jp/v1/place"
COORDINATES = "139.763707,35.659729"
OUTPUT="json"

if len(sys.argv) == 2:
    zip_code = sys.argv[1]
    ZIP_BASE_URL = "http://search.olp.yahooapis.jp/OpenLocalPlatform/V1/zipCodeSearch"
    zip_url = ZIP_BASE_URL + "?appid=%s&query=%s&output=%s" % (APP_ID,zip_code,OUTPUT)
    zip_json_tree = json.loads(urllib.urlopen(zip_url).read())
    #pprint.pprint(zip_json_tree['Feature'][0]['Geometry']['Coordinates'])
    COORDINATES = zip_json_tree['Feature'][0]['Geometry']['Coordinates']


url = BASE_URL + "?appid=%s&coordinates=%s&output=%s" % (APP_ID,COORDINATES,OUTPUT)
# print (url)

json_tree = json.loads( urllib.urlopen(url).read())
#pprint.pprint(json_tree)

for var in range(0,7):
    date = json_tree['Feature'][0]['Property']['WeatherList']['Weather'][var]['Date']
    rainfall = json_tree['Feature'][0]['Property']['WeatherList']['Weather'][var]['Rainfall']
    type = json_tree['Feature'][0]['Property']['WeatherList']['Weather'][var]['Type']
    print("%s,%s,%s"%(date,rainfall,type))

# python sample.py "258-0019"
201609232015,0.0,observation
201609232025,0.0,forecast
201609232035,0.85,forecast
201609232045,16.5,forecast
201609232055,4.38,forecast
201609232105,0.0,forecast
201609232115,0.0,forecast

# python sample.py
201609232015,0.0,observation
201609232025,0.0,forecast
201609232035,0.0,forecast
201609232045,0.0,forecast
201609232055,0.0,forecast
201609232105,0.0,forecast
201609232115,0.0,forecast

Umm. J'ai pu faire ce que je voulais faire.

[Parler]

Il existe un programme appelé AquesTalkPi qui fait parler Razzpai, ce que je n'avais jamais appris auparavant. Traitons la sortie précédente de manière appropriée et laissons-la parler. J'aimerais vraiment être un peu plus intelligent, mais pour l'instant je vais faire quelque chose à ce sujet.

#!/usr/bin/python
# encoding:utf-8

import urllib
import pprint
import json
import sys
import os

APP_ID = "********************************************"

BASE_URL = "http://weather.olp.yahooapis.jp/v1/place"
COORDINATES = "139.763707,35.659729"
OUTPUT="json"
ZIP_CODE = "100-0000"

if (len(sys.argv) == 2) or (len(ZIP_CODE) > 0):
    if len(sys.argv) < 2:
        zip_code = ZIP_CODE
    else:
        zip_code = sys.argv[1]
    ZIP_BASE_URL = "http://search.olp.yahooapis.jp/OpenLocalPlatform/V1/zipCodeSearch"
    zip_url = ZIP_BASE_URL + "?appid=%s&query=%s&output=%s" % (APP_ID,zip_code,OUTPUT)
    zip_json_tree = json.loads(urllib.urlopen(zip_url).read())
    #pprint.pprint(zip_json_tree['Feature'][0]['Geometry']['Coordinates'])
    COORDINATES = zip_json_tree['Feature'][0]['Geometry']['Coordinates']
    name = zip_json_tree['Feature'][0]['Property']['Address']
    print name


url = BASE_URL + "?appid=%s&coordinates=%s&output=%s" % (APP_ID,COORDINATES,OUTPUT)
# print (url)

json_tree = json.loads( urllib.urlopen(url).read())
#pprint.pprint(json_tree)

for var in range(0,7):
    date     = json_tree['Feature'][0]['Property']['WeatherList']['Weather'][var]['Date']
    rainfall = json_tree['Feature'][0]['Property']['WeatherList']['Weather'][var]['Rainfall']
    type     = json_tree['Feature'][0]['Property']['WeatherList']['Weather'][var]['Type']
    print("%s,%s,%s"%(date,rainfall,type))
    rain_level = ""
    talk = ""
    if (rainfall == 0.0):
        rain_level = "Il pleut"
    elif (rainfall < 5.0) :
        rain_level = "Il pleut un peu"
    elif (rainfall < 10.0):
        rain_level = "Il pleut beaucoup"
    elif (rainfall < 20.0):
        rain_level = "Il pleut un peu"
    elif (rainfall < 30.0):
        rain_level = "Il pleut"
    elif (rainfall < 50.0):
        rain_level = "Pluie abondante"
    elif (rainfall < 80.0):
        rain_level = "Très forte pluie"
    elif (rainfall >= 80.0):
        rain_level = "Pluie abondante"

    if type == "observation" :
        time = "maintenant,"
        if rainfall == 0.0:
            suffix = "ne pas"
            talk = time + rain_level + suffix
        else:
            suffix = "j'ai"
            talk = time + rain_level + suffix
    else:
        time = str(var * 10) + "Après une minute"
        if rainfall == 0.0:
            # suffix = "Je ne."
            talk = ""
        else:
            suffix = "Il semble que."
            talk = time + rain_level + suffix

    print talk
    if len(talk) > 0:
        os.system('/home/pi/AquesTalkPi "' + talk + '" | aplay&')

Oh, parlez avec "cette voix"! C'est intéressant.

C'est tout pour aujourd'hui.

Recommended Posts

Obtenez des informations météorologiques à l'aide de Yahoo! Open Local Platform (YOLP) et laissez Razpai parler avec AquesTalkPi
Obtenez la météo en utilisant l'API et laissez Raspberry Pi parler!
Obtenez des informations sur le processeur de Raspberry Pi avec Python
Obtenez la température et l'humidité avec DHT11 et Raspberry Pi
YOLP Obtenir un fichier XML d'informations cartographiques avec l'API Yahoo! Static Map
Créez votre propre plateforme IoT en utilisant raspberrypi et ESP32 (partie 1)
Utiliser une webcam avec Raspberry Pi
Obtenez des informations météorologiques avec Python et le grattage
[Yahoo! Weather Replacement Version] Comment obtenir des informations météo avec LINE Notify + Python
Acquérir la valeur du capteur de Grove Pi + avec Raspberry Pi et la stocker dans Kintone
Surveillance des animaux avec Rekognition et Raspberry pi
Connectez-vous à la console Raspberry PI et affichez les informations IP et SD locales
Demandez au bot de vous indiquer la météo (informations sur les précipitations) à l'aide de l'API d'informations météorologiques (YOLP) fournie par Yahoo ~ développement de bot slack avec python ④ ~