何かやってみるブログ

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

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