くまがいブログ

エンジニアに目指す社会人

OKウイスキー抽選通知Botを作った話

目次

きっかけ


私はウイスキーの「響」が好きで、チャンスがあれば購入したいと思っています。しかし、ここ数年は手に入りにくくなり、OKストアで抽選販売が行われていることに気づいてからは、欠かさず応募するようになりました。

ところが、OKストアのウイスキー抽選販売はアプリまたは公式ホームページでしか確認できなくアプリでしか申し込みできないため、申し込み期間を逃してしまうことが度々ありました。毎回手動でチェックするのは手間がかかり、うっかり忘れてしまうことも多かったため、自動で通知を受け取れる仕組みを作ることにしました。

そこで、OKストアのニュースページを定期的にチェックし、新しい抽選情報があればDiscordに通知し、Googleカレンダーに登録する スクリプトを開発しました。

ソースコード


このプロジェクトのソースコードはGitHubで公開しています。

GitHubリポジトリはこちら

仕組み


この自動化スクリプトは、Google Apps Script (GAS) を使って実装しました。

主な機能
  1. OKストアのニュースページをスクレイピング
    • 「国産洋酒」のキーワードを含む新着情報を検出
    • 過去に取得した情報と比較し、新しいものがあれば処理を開始
  2. 抽選情報をDiscordに通知
    • 新しい抽選が発表されたら、DiscordのWebhookを使って通知
  3. 抽選申し込み期間をGoogleカレンダーに登録
    • 申し込み開始日・終了日をGoogleカレンダーに自動追加
    • 抽選申し込み前日にリマインダーをDiscordに通知

実装方法


1. スクリプトの概要

Google Apps Script を使用し、UrlFetchApp.fetch() でOKストアのニュースページを取得します。正規表現を使って「国産洋酒」のキーワードを含むニュースを抽出し、新しいものがあれば処理を実行。

  1. 抽選情報を取得
  2. Discordに通知
  3. Googleカレンダーに登録
  4. 申し込み前日にリマインダーを送信
2. 技術的に工夫したところ
  1. スクリプトプロパティを利用したデータの永続化
    • 過去に取得した最新記事の日付 (lastSavedDate) をスクリプトプロパティに保存し、毎回すべてのニュースを処理するのを防ぐ
    • 初回実行時には自動で lastSavedDate1970-01-01 に初期化する仕組みを導入
  2. 正規表現を活用したニュース解析
    • <ul> タグの中の <li> 要素を抽出し、動的なHTML構造に対応できるように正規表現を工夫
    • datetime 属性を用いてニュースの日付を確実に取得
    • a タグの href を解析し、記事の詳細ページを取得
  3. Googleカレンダーのイベント管理
    • 申し込み期間の日付を 正規表現で解析し、Googleカレンダーのイベントとして登録
    • カレンダーイベントのタイトルに OKストア:国産洋酒 を含め、後からリマインダー通知しやすくする
    • 申し込み期限の前日に notifyDiscordForCalendarEvents() を実行し、Discordにリマインダーを送信
  4. Discord通知のフォーマット整備
    • DiscordのWebhookを使用し、見やすいフォーマットでメッセージを送信
    • 取得したウイスキー情報を改行でリスト化し、通知を分かりやすく整理
    • sendToDiscord() 関数を汎用化し、異なる種類の通知でも再利用可能にした
3. 実行方法

Google Apps Script の トリガー機能 を使って、毎日定期的にニュースページをチェックするように設定します。

  • okWhiskyNotifier()1日1回実行 (ニュースページをスクレイピング)

使ってみて


このスクリプトを運用し始めてから、ウイスキー抽選を見逃すことがなくなりました!毎日ニュースページをチェックする手間もなくなり、安心してウイスキー抽選に申し込めるようになったのが大きなメリットです。

しかし、できればウイスキーが抽選販売ではなく、気軽に購入できる日が来ることを願っています。

同じように抽選販売を見逃しがちな方は、ぜひこの方法を試してみてください!