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

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

![A4318E09-A5C8-4D69-8D6E-30C5D2AAB12D.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427079/b5edcb10-2f1c-66fc-3b7a-2151047d7460.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427079/cc648a61-25f0-6f31-5f28-32a05432d229.jpeg)
細かい設定方法については割愛。他の記事を参照してください(実は忘れました)

![ 2023-04-20 10.58.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427079/0b5fc486-c548-816b-3337-1971826eacb4.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
# Gemfile

source 'https://rubygems.org'

gem 'line-bot-api'
```

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

そしてローカル環境で生成されたvendorsディレクトリをまるっとzipにしてlambdaにアップロード
ディレクトリ構造は以下のような感じ
![ 2023-04-20 10.58.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427079/54f5a78d-c8f6-64a1-1fde-c1332cc30687.png)

### ④環境変数を登録
![ 2023-04-20 11.00.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427079/1178d5d0-68c1-72b7-070f-fec196d4e0c8.png)

### ⑤EventBridgeで定期実行の設定をする
![ 2023-04-20 10.59.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427079/0df03e30-739f-e3e4-bd5e-e90487e0f196.png)

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

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