何かやってみるブログ

興味をもったこと、趣味のこと、技術について色々書きます。

Ruby on Jetsを使って天気予報を通知してくれるSlack Botを作ってみた

今回はRuby on Jetsを使って天気予報を通知してくれるSlack Botを作ってみました。

仕様

毎朝7:00にその日の天気がslackに通知される仕組みにします。以下の情報をAPIから取得するようにします。

  • 最高気温(daily.temp.max)
  • 最低気温(daily.temp.min)
  • 日中の気温(daily.temp.day)
  • 降水確率(daily.pop)
  • 天気の説明(daily.wather.description)
  • 天気のアイコン(daily.wather.icon)

APIはOpenWeatherMap APIOneCallAPI使用します。

実装

gemはslackを使用するのにslack-ruby-client、HTTPクライアントを使用するためにhttpartyを使用しました。

実装手順は大体前回の記事と同じ感じで、特に詰まることなく簡単に実装出来ました。

www.takayasugiyama.com

class TenkiJob < ApplicationJob
  URL = "https://api.openweathermap.org/data/2.5/onecall?lat=35.779553&lon=139.785015&exclude=current,minutely,hourly&appid=#{ENV["TENKI_API_TOKEN"]}&lang=ja&units=metric&ctn=1"

  cron "0 22 * * ? *"
  def tenki_notify
    response = HTTParty.get(URL)
    #今日のデータを取得する
    daily = response["daily"][0]
    #気温
    max_temp = daily["temp"]["max"]
    min_temp = daily["temp"]["min"]
    day_temp = daily["temp"]["day"]
    #降水確率
    pop = daily["pop"]
    #天気の状態とアイコンURL
    description = daily["weather"][0]["description"]
    icon_url = "http://openweathermap.org/img/wn/#{daily["weather"][0]["icon"]}@2x.png"

    # メッセージを作成する
    text = <<~"STR"
      今日の天気情報です。
      > 日中の気温: #{day_temp}°C
      > 最高気温: #{max_temp}°C
      > 最低気温: #{min_temp}°C
      > 降水確率: #{pop * 100}%
      > 今日の天気は#{description}です。
      #{icon_url}
    STR

    # slackに送信する
    send_message(text)
  end

  private

  def send_message(text)
    client = Slack::Web::Client.new
    client.auth_test
    client.chat_postMessage(channel: "#lifestyle", text: text, as_user: true)
  end
end

動作確認

コンソールから動くかどうかを確かめます。

$ jets console
Jets booting up in development mode!
irb(main):001:0> TenkiJob.perform_now(:tenki_notify)

無事に動くことが確認出来ました。

f:id:s-takaya1027:20200826071548p:plain

投げ銭していただける方は以下のボタンからよろしくお願いいたします。

takayaにOFUSEする