Zeigen Sie die Wettervorhersage mit OpenWeatherMap an, einer externen API in Ruby

App Beschreibung

Es ist ein Programm, das die Wettervorhersage für den nächsten Tag mit Ruby anzeigt. Verwenden Sie "OpenWeatherMap" mit einer externen API.

Entwicklungsumgebung

ruby:2.6.6

Vollständiges Bild

wf.gif

Betriebsablauf
  1. Führen Sie ruby execute.rb im Stammverzeichnis Ihrer App aus.
  2. Die Präfekturen sind aufgelistet.
  3. Geben Sie die Präfekturnummer ein.
  4. Die Wettervorhersage des nächsten Tages wird alle 3 Stunden aufgeteilt und in einer Liste angezeigt.

Verzeichniskonfigurationsdiagramm

wf.png

OpenWeatherMap-API-Schlüssel im Voraus erforderlich

Um dieses Programm zu erstellen, benötigen Sie den "API-Schlüssel" von "OpenWeatherMap".

  1. Führen Sie auf der OpenWeatherMap-Homepage [Kontoregistrierung] aus (https://home.openweathermap.org/users/sign_up).
  2. Eine E-Mail wird an die registrierte E-Mail-Adresse gesendet.
  3. Der "API-Schlüssel" ist im Hauptteil der empfangenen E-Mail enthalten. Verwenden Sie diesen.

API-Schlüssel in Umgebungsvariable speichern

Speichern Sie aus Sicherheitsgründen den API-Schlüssel in einer Umgebungsvariablen, auf die von außen nicht verwiesen werden kann.

Funktionsweise

Terminal


vim ~/.zshrc

Stellen Sie den Einfügemodus ein und fügen Sie Folgendes hinzu.

.zshrc


export WEATHER_API_KEY="Geben Sie den API-Schlüssel ein"

Beenden Sie das Speichern mit : wq und führen Sie die folgenden Schritte aus, um die Einstellungen widerzuspiegeln.

Terminal


source ~/.zshrc

Zulassen, dass API-Schlüssel im Code verwendet werden

Erstellen Sie eine config.rb-Datei und fügen Sie Folgendes hinzu.

config.rb


WEATHER_API_KEY = ENV["WEATHER_API_KEY"]

Dieses Mal werden wir es verwenden, indem wir es in eine Konstante einsetzen. Sie können jetzt den API-Schlüssel mit dem konstanten Namen WEATHER_API_KEY verwenden.

Erstellen und lesen Sie eine CSV-Datei der Präfekturliste

Erstellen Sie eine prefectures.csv-Datei und fügen Sie die folgende Präfekturliste hinzu.

prefectures.csv


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

CSV-Datei lesen

Erstellen Sie "execute.rb" und fügen Sie Folgendes hinzu.

execution.rb


require "csv"

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

Erstellen Sie die WeatherInfo-Klasse

Erstellen Sie weather_info.rb und definieren Sie die Klasse.

weather_info.rb


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

Erstellen Sie eine Instanz aus der Klasse "WeatherInfo" mit "execute.rb" und übergeben Sie die CSV-Daten

execution.rb


require "csv"

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

#---------Fügen Sie Folgendes hinzu---------

weather_info = WeatherInfo.new(prefectures)

#-----------Bisher-----------

Definieren Sie eine Methode, die eine Liste der Präfekturen anzeigt und die Auswahl einer Nummer ermöglicht

Definieren Sie in der Klasse WeatherInfo die Methode ** select_prefecture, mit der Sie ** Präfekturen auflisten und Zahlen auswählen können.

weather_info.rb


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

  #---------Fügen Sie Folgendes hinzu---------

  def select_prefecture
    puts <<~TEXT
            ☀~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~☀
            ☁                              ☁
☂ Wettervorhersage von morgen ☂
            ☆                              ☆
            ☀~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~☀

          TEXT

    #Listenausgabe mit Indexnummer der Präfekturliste
    @prefectures.each.with_index(1) do |prefecture, i|
      puts "#{i.to_s.rjust(2)}. #{prefecture["prefecture"]}"
    end
    puts <<~TEXT
            
Die Wetterinformationen von morgen werden alle 3 Stunden angezeigt.
Bitte geben Sie die Präfekturnummer ein.
          TEXT
    while true
      input = gets.to_i
      #Beenden Sie die Methode, wenn die richtige Listennummer eingegeben wurde
      if input.between?(1, @prefectures.count)
        return @prefectures[input - 1]
      else
        #Wenn etwas anderes als die Listennummer eingegeben wird, wird ein Fehler angezeigt und ein erneutes Aufrufen erfolgt.
        puts <<~TEXT
                --------------------------------------------
Fehler: Bitte geben Sie nur die angezeigte Nummer ein.
                --------------------------------------------
              TEXT
      end
    end
  end

  #-----------Bisher-----------

end

--Wenn die Anzahl der Ziffern der Indexnummer in der angezeigten Präfekturliste unterschiedlich ist, wird sie nicht vertikal ausgerichtet. Ich benutze rjust (2), um es in einen String mit to_s zu konvertieren, um es vertikal auszurichten.

Führen Sie die Methode "select_prefecture" in "execute.rb" aus

Führen Sie die oben in "execute.rb" definierte Methode "select_prefecture" aus. Lesen Sie auch weather_info.rb.

execution.rb


require "csv"

#---------Fügen Sie Folgendes hinzu---------

require_relative "weather_info"

#-----------Bisher-----------

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

#---------Fügen Sie Folgendes hinzu---------

prefecture = weather_info.select_prefecture

#-----------Bisher-----------

Erhalten Sie Wetterinformationen von OpenWeatherMap

Holen Sie sich Wetterinformationen von der externen API OpenWeatherMap. Definieren Sie die Methode "get_weather_forecast" in "weather_info.rb".

weather_info.rb


class WeatherInfo
  #----------***Abkürzung***---------
  def select_prefecture
    #--------***Abkürzung***---------
  end

  #---------Fügen Sie Folgendes hinzu---------

  def get_weather_forecast(prefecture)
    #Holen Sie sich Wetterinformationen von der externen API "Open Weather Map"
    response = open("http://api.openweathermap.org/data/2.5/forecast" + "?q=#{prefecture["english"]}&appid=#{WEATHER_API_KEY}&units=metric&lang=ja")
    #Analysieren Sie die erfassten Daten als JSON
    data = JSON.parse(response.read)
    #Holen Sie sich nur einige Informationen in JSON-Daten und hashen Sie sie
    datas = { list: data["list"], prefecture_name: data["city"]["name"] }
  end

  #-----------Bisher-----------
end
Geben Sie die URL mit der Methode open an, um die Wetterinformationen abzurufen.

--http: // api.openweathermap.org / data / 2.5 / Forecast → Sie können die Wettervorhersage 5 Tage lang alle 3 Stunden abrufen. --? Q = → Geben Sie den englischen Städtenamen der CSV-Daten ein --& appid =→ Geben Sie den API-Schlüssel ein -- & unit = metric → Geben Sie die Einheit des Datenformats an --& lang =→ Geben Sie die Sprache als Japanisch an

Sie können die Details der einzelnen Parameter und den Inhalt der JSON-Daten unter hier überprüfen.

Führen Sie die Methode "get_weather_forecast" in "execute.rb" aus

Führen Sie die oben in "execute.rb" definierte Methode "get_weather_forecast" aus. Laden Sie außerdem die Datei "config.rb", die Bibliothek "json" und die Bibliothek "open-uri".

execution.rb


require "csv"
require_relative "weather_info"

#---------Fügen Sie Folgendes hinzu---------

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

#-----------Bisher-----------

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

#---------Fügen Sie Folgendes hinzu---------

datas = weather_info.get_weather_forecast(prefecture)

#-----------Bisher-----------

Listen Sie die Wetterinformationen des nächsten Tages auf

Definieren Sie die Methode display_weather_forecast, um die erfassten Wetterinformationen aufzulisten.

weather_info.rb


class WeatherInfo
  #----------***Abkürzung***---------
  def select_prefecture
    #--------***Abkürzung***---------
  end

  def get_weather_forecast(prefecture)
    #--------***Abkürzung***---------
  end

  #---------Fügen Sie Folgendes hinzu---------

  def display_weather_forecast(weathers)
    #Machen Sie es möglich, den Tag auf Japanisch anzuzeigen
    wd = ["Tag", "Mond", "Feuer", "Wasser", "Holz", "Geld", "Boden"]
    #nächster Tag
    tomorrow = Date.today + 1
    puts <<~TEXT


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

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

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

         TEXT
    weathers[:list].each do |weather|
      #In DateTime-Typ konvertieren
      date_and_time = DateTime.parse(weather["dt_txt"])
      #Zum Vergleich steht auch der Datumstyp zur Verfügung
      date = Date.parse(weather["dt_txt"])
      #Listenanzeige nur zur Information des nächsten Tages
      if date == tomorrow
        puts <<~TEXT
               ---------------------------
               #{date_and_time.strftime("%p%Um H.")}
Wetter:#{weather["weather"][0]["description"]}
Temperatur:#{weather["main"]["temp"]}℃
               ---------------------------
             TEXT
      end
    end
  end

  #-----------Bisher-----------

end

Führen Sie die Methode "display_weather_forecast" in "execute.rb" aus

Führen Sie die oben in "execute.rb" definierte Methode "display_weather_forecast" aus. Laden Sie auch die date Bibliothek.

execution.rb


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

#---------Fügen Sie Folgendes hinzu---------

require "date"

#-----------Bisher-----------

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

#---------Fügen Sie Folgendes hinzu---------

weather_info.display_weather_forecast(datas)

#-----------Bisher-----------

Jetzt, wo es fertig ist, der Rest

Terminal


ruby execution.rb

Wenn Sie ausführen, funktioniert es entsprechend dem fertigen Image.

Quellcode

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

Recommended Posts

Zeigen Sie die Wettervorhersage mit OpenWeatherMap an, einer externen API in Ruby
[Rails] So zeigen Sie die Wettervorhersage der registrierten Adresse auf Japanisch mit OpenWeatherMap an
Holen Sie sich Wettervorhersage von Open Weather Map with Rails
[Ruby] Zähle eine gerade Zahl in einem Array mit der geraden? -Methode
Zeigen Sie die API-Definition in der Swagger-Benutzeroberfläche mit Docker + Rails6 + apipie an
Erzielen Sie eine dreistellig begrenzte Anzeige in Ruby
Führen Sie einen externen Prozess in Java aus
Ich habe versucht, die Elasticsearch-API in Java zu verwenden
Map ohne Verwendung eines Arrays in Java