スプラトゥーン3のスケジュール情報を定期的にLINEで通知できるようにした
仕様
- スプラトゥーン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でアカウントを作成する
細かい設定方法については割愛。他の記事を参照してください(実は忘れました)
②コードを書く
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にアップロード
ディレクトリ構造は以下のような感じ
④環境変数を登録
⑤EventBridgeで定期実行の設定をする
⑥完成~さいごに~
これ実はLINEのUSER_ID
(あるLINEグループのID)を取得するのに苦労しました。
ngrok
(https://ngrok.com/)
というローカルで稼働しているネットワークを外部に公開できるサービスを使ってローカル環境からAPIを叩きながら開発していた時にngrokのコンソールでUSER_ID
が見れたんですよね。
ngrokを実行してwebインターフェースにアクセスしてリクエストの詳細見てたらどっかにパラメータ載ってた気がする。
それを控えておいて環境変数として登録してしますので自分が指定したグループでしか機能しません。 この部分を動的に解決できれば皆さんに使っていただけるものとして公開できるんですけどとりあえずそこまではいいかな。
そこは今後の課題ということで。
個人的にLambda触ってみたいというのがあったので今回わざわざLambdaを使いましたが同じようなことGASでもっと簡単にできたかもな〜とも思いました(gem使えないか...🤔)。皆さんのご意見お聞かせください。