Afficher les prévisions météorologiques à l'aide d'OpenWeatherMap, une API externe de Ruby

Description de l'application

C'est un programme qui affiche les prévisions météorologiques du lendemain avec Ruby. Utilisez ʻOpenWeatherMap` avec une API externe.

Environnement de développement

ruby:2.6.6

Image complète

wf.gif

Flux d'opération
  1. Exécutez ruby execution.rb dans le répertoire racine de votre application.
  2. Les préfectures sont répertoriées.
  3. Entrez le numéro de préfecture.
  4. Les prévisions météorologiques du lendemain sont divisées toutes les 3 heures et affichées dans une liste.

Diagramme de configuration d'annuaire

wf.png

Clé API OpenWeatherMap requise à l'avance

Pour créer ce programme, vous aurez besoin de la ʻAPI key de ʻOpenWeatherMap.

  1. Cliquez sur Enregistrer un compte sur la page d'accueil ʻOpenWeatherMap`.
  2. Un e-mail sera envoyé à l'adresse e-mail enregistrée.
  3. La «clé API» est incluse dans le corps de l'e-mail reçu, alors utilisez-la.

Stocker la clé API dans la variable d'environnement

Par mesure de sécurité, stockez la «clé API» dans une variable d'environnement qui ne peut pas être référencée de l'extérieur.

Mode opératoire

Terminal


vim ~/.zshrc

Réglez en mode insertion et ajoutez ce qui suit.

.zshrc


export WEATHER_API_KEY="Entrez la clé API"

Terminez l'enregistrement avec : wq, exécutez ce qui suit pour refléter les paramètres.

Terminal


source ~/.zshrc

Autoriser l'utilisation des clés API dans le code

Créez un fichier config.rb et ajoutez ce qui suit.

config.rb


WEATHER_API_KEY = ENV["WEATHER_API_KEY"]

Cette fois, nous allons l'utiliser en le substituant à une constante. Vous pouvez maintenant utiliser la ʻAPI key avec le nom constant WEATHER_API_KEY`.

Créer et lire un fichier CSV de la liste de préfecture

Créez un fichier prefectures.csv et ajoutez la liste de préfecture suivante.

prefectures.csv


prefecture,english
Hokkaido,Hokkaido
Préfecture d'Aomori,Aomori-ken
Préfecture d'Iwate,Iwate-ken
Préfecture de Miyagi,Miyagi-ken
Akita,Akita-ken
Préfecture de Yamagata,Yamagata-ken
Préfecture de Fukushima,Fukushima-ken
Préfecture d'Ibaraki,Ibaraki-ken
Préfecture de Tochigi,Tochigi-ken
Préfecture de Gunma,Gunma-ken
Saitama,Saitama-ken
Préfecture de Chiba,Chiba-ken
Tokyo,Tokyo
Préfecture de Kanagawa,Kanagawa-ken
Préfecture de Niigata,Niigata-ken
Préfecture de Toyama,Toyama-ken
Préfecture d'Ishikawa,Ishikawa-ken
Préfecture de Fukui,Fukui-ken
Préfecture de Yamanashi,Yamanashi-ken
Préfecture de Nagano,Nagano-ken
Préfecture de Gifu,Gifu-ken
Préfecture de Shizuoka,Shizuoka-ken
Préfecture d'Aichi,Aichi-ken
Préfecture de Mie,Mie-ken
Préfecture de Shiga,Shiga-ken
Kyoto,Kyoto Prefecture
Préfecture d'Osaka,Osaka-fu
Préfecture de Hyogo,hyogo
Préfecture de Nara,Nara-ken
Préfecture de Wakayama,Wakayama-ken
Préfecture de Tottori,Tottori-ken
Préfecture de Shimane,Shimane-ken
Préfecture d'Okayama,Okayama-ken
Préfecture d'Hiroshima,Hiroshima-ken
Préfecture de Yamaguchi,Yamaguchi-ken
Préfecture de Tokushima,Tokushima-ken
Préfecture de Kagawa,Kagawa-ken
Préfecture d'Ehime,Ehime-ken
Préfecture de Kochi,Kochi Prefecture
Préfecture de Fukuoka,Fukuoka-ken
Préfecture de Saga,Saga-ken
Préfecture de Nagasaki,Nagasaki-ken
Préfecture de Kumamoto,Kumamoto-ken
Préfecture d'Oita,Oita Prefecture
Préfecture de Miyazaki,Miyazaki-ken
Préfecture de Kagoshima,Kagoshima-ken
Préfecture d'Okinawa,Okinawa-ken

Lire le fichier CSV

Créez ʻexecution.rb` et ajoutez ce qui suit.

execution.rb


require "csv"

prefectures = CSV.read("./prefectures.csv", headers: true)

Créer une classe WeatherInfo

Créez weather_info.rb et définissez la classe.

weather_info.rb


class WeatherInfo
  def initialize(prefectures)
    @prefectures = prefectures
  end
end

ʻExecution.rb crée une instance de la classe WeatherInfo` et transmet les données CSV

execution.rb


require "csv"

prefectures = CSV.read("./prefectures.csv", headers: true)

#---------Ajoutez ce qui suit---------

weather_info = WeatherInfo.new(prefectures)

#-----------Jusque là-----------

Définir une méthode qui affiche une liste de préfectures et vous permet de sélectionner un nombre

Dans la classe WeatherInfo, définissez la méthode ** select_prefecture qui vous permet de lister ** les préfectures et de sélectionner des nombres.

weather_info.rb


class WeatherInfo
  def initialize(prefectures)
    @prefectures = prefectures
  end

  #---------Ajoutez ce qui suit---------

  def select_prefecture
    puts <<~TEXT
            ☀~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~☀
            ☁                              ☁
☂ Prévisions météo de demain ☂
            ☆                              ☆
            ☀~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~☀

          TEXT

    #Sortie de liste avec numéro d'index de la liste de préfecture
    @prefectures.each.with_index(1) do |prefecture, i|
      puts "#{i.to_s.rjust(2)}. #{prefecture["prefecture"]}"
    end
    puts <<~TEXT
            
Les informations météorologiques de demain seront affichées toutes les 3 heures.
Veuillez saisir le numéro de préfecture.
          TEXT
    while true
      input = gets.to_i
      #Quittez la méthode si le numéro de liste correct est entré
      if input.between?(1, @prefectures.count)
        return @prefectures[input - 1]
      else
        #Si quelque chose d'autre que le numéro de liste est entré, une erreur sera affichée et un
        puts <<~TEXT
                --------------------------------------------
erreur: veuillez entrer uniquement le numéro affiché.
                --------------------------------------------
              TEXT
      end
    end
  end

  #-----------Jusque là-----------

end

--Si le nombre de chiffres du numéro d'index dans la liste de préfecture affichée est différent, il ne sera pas aligné verticalement. J'utilise rjust (2) pour le convertir en une chaîne avec to_s pour l'aligner verticalement. --Si une valeur autre que le numéro d'index est entrée, une déclaration d'erreur sera affichée et une boucle sera affichée.

ʻExécuter la méthode select_prefecture dans execution.rb`

ʻExécute la méthode select_prefecture définie ci-dessus dans execution.rb. Lisez également weather_info.rb`.

execution.rb


require "csv"

#---------Ajoutez ce qui suit---------

require_relative "weather_info"

#-----------Jusque là-----------

prefectures = CSV.read("./prefectures.csv", headers: true)
weather_info = WeatherInfo.new(prefectures)

#---------Ajoutez ce qui suit---------

prefecture = weather_info.select_prefecture

#-----------Jusque là-----------

Obtenez des informations météo d'OpenWeatherMap

Obtenez des informations météorologiques à partir de l'API externe ʻOpenWeatherMap. Définissez la méthode get_weather_forecast dans weather_info.rb`.

weather_info.rb


class WeatherInfo
  #----------***Abréviation***---------
  def select_prefecture
    #--------***Abréviation***---------
  end

  #---------Ajoutez ce qui suit---------

  def get_weather_forecast(prefecture)
    #Obtenez des informations météorologiques à partir de l'API externe "Open Weather Map"
    response = open("http://api.openweathermap.org/data/2.5/forecast" + "?q=#{prefecture["english"]}&appid=#{WEATHER_API_KEY}&units=metric&lang=ja")
    #Analysez les données acquises au format JSON
    data = JSON.parse(response.read)
    #Obtenez seulement quelques informations dans les données JSON et hachez-les
    datas = { list: data["list"], prefecture_name: data["city"]["name"] }
  end

  #-----------Jusque là-----------
end
Spécifiez l'URL avec la méthode ouverte pour obtenir les informations météorologiques.

--http: // api.openweathermap.org / data / 2.5 / prévisions → Vous pouvez obtenir les prévisions météorologiques toutes les 3 heures pendant 5 jours. --? Q = → Entrez le nom anglais de la ville des données CSV --& appid =→ Entrez la clé API -- & units = metric → Spécifiez l'unité de format de données --& lang =→ Spécifiez la langue en japonais

Vous pouvez vérifier les détails de chaque paramètre et le contenu des données JSON sur ici.

ʻExécute la méthode get_weather_forecast dans execution.rb`

ʻExecution.rbla méthodeget_weather_forecastdéfinie ci-dessus. Chargez également le fichierconfig.rb, la bibliothèque json et la bibliothèque ʻopen-uri.

execution.rb


require "csv"
require_relative "weather_info"

#---------Ajoutez ce qui suit---------

require_relative "config"
require "json"
require "open-uri"

#-----------Jusque là-----------

prefectures = CSV.read("./prefectures.csv", headers: true)
weather_info = WeatherInfo.new(prefectures)
prefecture = weather_info.select_prefecture

#---------Ajoutez ce qui suit---------

datas = weather_info.get_weather_forecast(prefecture)

#-----------Jusque là-----------

Liste des informations météo du lendemain

Définissez la méthode display_weather_forecast pour lister les informations météorologiques acquises.

weather_info.rb


class WeatherInfo
  #----------***Abréviation***---------
  def select_prefecture
    #--------***Abréviation***---------
  end

  def get_weather_forecast(prefecture)
    #--------***Abréviation***---------
  end

  #---------Ajoutez ce qui suit---------

  def display_weather_forecast(weathers)
    #Rendre possible d'afficher le jour en japonais
    wd = ["journée", "Mois", "Feu", "eau", "bois", "Argent", "sol"]
    #le prochain jour
    tomorrow = Date.today + 1
    puts <<~TEXT


           ☀~~☆~~☁~~☂~~☀~~☆~~☁~~☂~~☀~~☆~~☁~~☂

              #{weathers[:prefecture_name]}de#{tomorrow.strftime("%m/%d(#{wd[tomorrow.wday]})")}de天気予報   

           ☀~~☆~~☁~~☂~~☀~~☆~~☁~~☂~~☀~~☆~~☁~~☂

         TEXT
    weathers[:list].each do |weather|
      #Convertir en type DateTime
      date_and_time = DateTime.parse(weather["dt_txt"])
      #Le type de date est également disponible pour comparaison
      date = Date.parse(weather["dt_txt"])
      #Affichage de la liste uniquement pour les informations du lendemain
      if date == tomorrow
        puts <<~TEXT
               ---------------------------
               #{date_and_time.strftime("%p%Autour de H")}
Météo:#{weather["weather"][0]["description"]}
Température:#{weather["main"]["temp"]}℃
               ---------------------------
             TEXT
      end
    end
  end

  #-----------Jusque là-----------

end

ʻExécute la méthode display_weather_forecast dans execution.rb`

ʻExécute la méthode display_weather_forecast définie ci-dessus dans execution.rb. Chargez également la bibliothèque date`.

execution.rb


require "csv"
require_relative "weather_info"
require_relative "config"
require "json"
require "open-uri"

#---------Ajoutez ce qui suit---------

require "date"

#-----------Jusque là-----------

prefectures = CSV.read("./prefectures.csv", headers: true)
weather_info = WeatherInfo.new(prefectures)
prefecture = weather_info.select_prefecture
datas = weather_info.get_weather_forecast(prefecture)

#---------Ajoutez ce qui suit---------

weather_info.display_weather_forecast(datas)

#-----------Jusque là-----------

Maintenant que c'est terminé, le reste

Terminal


ruby execution.rb

Si vous exécutez, cela fonctionnera selon l'image terminée.

Code source

https://github.com/keisuke-333/Weather_Forecast

Recommended Posts

Afficher les prévisions météorologiques à l'aide d'OpenWeatherMap, une API externe de Ruby
[Rails] Comment afficher les prévisions météo de l'adresse enregistrée en japonais en utilisant OpenWeatherMap
Obtenez les prévisions météo de Open Weather Map with Rails
[Ruby] Comptez un nombre pair dans un tableau en utilisant la méthode pair?
Afficher la définition d'API dans l'interface utilisateur Swagger à l'aide de Docker + Rails6 + apipie
Obtenez un affichage délimité à 3 chiffres en Ruby
Exécuter un processus externe en Java
J'ai essayé d'utiliser l'API Elasticsearch en Java
Mapper sans utiliser de tableau en java