目次
きっかけ
私はウイスキーの「響」が好きで、チャンスがあれば購入したいと思っています。しかし、ここ数年は手に入りにくくなり、OKストアで抽選販売が行われていることに気づいてからは、欠かさず応募するようになりました。
ところが、OKストアのウイスキー抽選販売はアプリまたは公式ホームページでしか確認できなくアプリでしか申し込みできないため、申し込み期間を逃してしまうことが度々ありました。毎回手動でチェックするのは手間がかかり、うっかり忘れてしまうことも多かったため、自動で通知を受け取れる仕組みを作ることにしました。
そこで、OKストアのニュースページを定期的にチェックし、新しい抽選情報があればDiscordに通知し、Googleカレンダーに登録する スクリプトを開発しました。
ソースコード
このプロジェクトのソースコードはGitHubで公開しています。
仕組み
この自動化スクリプトは、Google Apps Script (GAS) を使って実装しました。
主な機能
- OKストアのニュースページをスクレイピング
- 「国産洋酒」のキーワードを含む新着情報を検出
- 過去に取得した情報と比較し、新しいものがあれば処理を開始
- 抽選情報をDiscordに通知
- 新しい抽選が発表されたら、DiscordのWebhookを使って通知
- 抽選申し込み期間をGoogleカレンダーに登録
- 申し込み開始日・終了日をGoogleカレンダーに自動追加
- 抽選申し込み前日にリマインダーをDiscordに通知
実装方法
1. スクリプトの概要
Google Apps Script を使用し、UrlFetchApp.fetch()
でOKストアのニュースページを取得します。正規表現を使って「国産洋酒」のキーワードを含むニュースを抽出し、新しいものがあれば処理を実行。
- 抽選情報を取得
- Discordに通知
- Googleカレンダーに登録
- 申し込み前日にリマインダーを送信
2. 技術的に工夫したところ
- スクリプトプロパティを利用したデータの永続化
- 過去に取得した最新記事の日付 (
lastSavedDate
) をスクリプトプロパティに保存し、毎回すべてのニュースを処理するのを防ぐ - 初回実行時には自動で
lastSavedDate
を1970-01-01
に初期化する仕組みを導入
- 過去に取得した最新記事の日付 (
- 正規表現を活用したニュース解析
-
<ul>
タグの中の<li>
要素を抽出し、動的なHTML構造に対応できるように正規表現を工夫 -
datetime
属性を用いてニュースの日付を確実に取得 -
a
タグのhref
を解析し、記事の詳細ページを取得
-
- Googleカレンダーのイベント管理
- 申し込み期間の日付を 正規表現で解析し、Googleカレンダーのイベントとして登録
- カレンダーイベントのタイトルに
OKストア:国産洋酒
を含め、後からリマインダー通知しやすくする - 申し込み期限の前日に
notifyDiscordForCalendarEvents()
を実行し、Discordにリマインダーを送信
- Discord通知のフォーマット整備
- DiscordのWebhookを使用し、見やすいフォーマットでメッセージを送信
- 取得したウイスキー情報を改行でリスト化し、通知を分かりやすく整理
-
sendToDiscord()
関数を汎用化し、異なる種類の通知でも再利用可能にした
3. 実行方法
Google Apps Script の トリガー機能 を使って、毎日定期的にニュースページをチェックするように設定します。
-
okWhiskyNotifier()
→ 1日1回実行 (ニュースページをスクレイピング)
使ってみて
このスクリプトを運用し始めてから、ウイスキー抽選を見逃すことがなくなりました!毎日ニュースページをチェックする手間もなくなり、安心してウイスキー抽選に申し込めるようになったのが大きなメリットです。
しかし、できればウイスキーが抽選販売ではなく、気軽に購入できる日が来ることを願っています。
同じように抽選販売を見逃しがちな方は、ぜひこの方法を試してみてください!