LoginSignup
5
0

スプラトゥーン3のスケジュール情報を定期的にLINEで通知できるようにした(AWS Lambda × Ruby × LINE messaging API)

Last updated at Posted at 2023-05-04

スプラトゥーン3のスケジュール情報を定期的にLINEで通知できるようにした

A4318E09-A5C8-4D69-8D6E-30C5D2AAB12D.jpeg

仕様

  • スプラトゥーン3バンカラマッチのスケジュール情報(19:00~21:00と21:00~23:00)が特定のLINEグループに通知される
  • 毎日18:00に定期実行される

使用技術

  • AWS Lambda(ランタイムはRuby)
  • AWS EventBridge
  • LINE messagingAPI
  • スプラトゥーン3API(https://spla3.yuu26.com)

①LINE messagingAPIでアカウントを作成する

A5733EDD-4E6A-4920-8EC6-E05C1451F97F.jpeg
細かい設定方法については割愛。他の記事を参照してください(実は忘れました)

 2023-04-20 10.58.05.png

②コードを書く

lambda_function.rb
require 'net/http'
require 'uri'
require 'json'
require 'line/bot'
require 'time'

channel_access_token = ENV['CHANNEL_ACCESS_TOKEN']
channel_secret = ENV['CHANNEL_SECRET']
user_id = ENV['USER_ID']

def lambda_handler(event, context = nil)
  api_url = "https://spla3.yuu26.com/api/bankara-open/schedule"

  @schedule = fetch_schedule(api_url)
  return unless @schedule

  message = build_message(@schedule)
  send_line_message(message, ENV['CHANNEL_ACCESS_TOKEN'], ENV['CHANNEL_SECRET'])
end


def fetch_schedule(api_url)
  uri = URI(api_url)
  response = Net::HTTP.get_response(uri)
  if response.is_a?(Net::HTTPSuccess)
    JSON.parse(response.body)
  else
    Rails.logger.error("Failed to fetch schedule. Response code: #{response.code}")
    nil
  end
rescue StandardError => e
  Rails.logger.error("Failed to fetch schedule. Error message: #{e.message}")
  nil
end

def build_message(schedule)
  message = "Splatoon 3のスケジュール情報\n"
  if schedule["results"][0]["rule"].nil?
    return message += "今日はフェス中のためバンカラ情報はありません🦑"
  end

  schedule["results"].each do |res|
    start_time = Time.parse(res["start_time"]).strftime("%H:%M")
    end_time = Time.parse(res["end_time"]).strftime("%H:%M")

    if start_time == "19:00" || start_time == "21:00" 
      message += "#{start_time}~#{end_time}\n"
      message += "#{res["rule"]["name"]}\n"
      res["stages"].each do |stage|
        message += "┗#{stage["name"]}\n"
      end
      message += "\n"
    end
  end
  message
end

def send_line_message(message, channel_access_token, channel_secret)
  client = Line::Bot::Client.new { |config|
    config.channel_secret = channel_secret
    config.channel_token = channel_access_token
  }

  message = {
    type: 'text',
    text: message
  }

  client.push_message(ENV['USER_ID'], message)
end

【重要】③ローカル環境でbundle install

Lambda上にはもちろんCLIなどはないので
一旦ローカル環境でGemfileを作成しbundle install --path vendor/bundle

# Gemfile

source 'https://rubygems.org'

gem 'line-bot-api'

注意点はAWSで設定したRubyのランタイムとbundle installのバージョンを揃えること

そしてローカル環境で生成されたvendorsディレクトリをまるっとzipにしてlambdaにアップロード
ディレクトリ構造は以下のような感じ
 2023-04-20 10.58.22.png

④環境変数を登録

 2023-04-20 11.00.04.png

⑤EventBridgeで定期実行の設定をする

 2023-04-20 10.59.53.png

⑥完成~さいごに~

これ実はLINEのUSER_ID(あるLINEグループのID)を取得するのに苦労しました。
ngrok(https://ngrok.com/)
というローカルで稼働しているネットワークを外部に公開できるサービスを使ってローカル環境からAPIを叩きながら開発していた時にngrokのコンソールでUSER_IDが見れたんですよね。
スクリーンショット 2023-05-04 18.31.42.png
ngrokを実行してwebインターフェースにアクセスしてリクエストの詳細見てたらどっかにパラメータ載ってた気がする。
それを控えておいて環境変数として登録してしますので自分が指定したグループでしか機能しません。 この部分を動的に解決できれば皆さんに使っていただけるものとして公開できるんですけどとりあえずそこまではいいかな。
そこは今後の課題ということで。

個人的にLambda触ってみたいというのがあったので今回わざわざLambdaを使いましたが同じようなことGASでもっと簡単にできたかもな〜とも思いました(gem使えないか...🤔)。皆さんのご意見お聞かせください。

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0