ホテルDBを週次で更新する仕組み(Cron Worker と忘れないメール)
ホテル検索ツールを公開して、最初に直面した地味な問題が「データが古くなる」ことでした。楽天トラベルから取得した37,000軒分の情報を1つの公開JSONにまとめているのですが、料金もキャンセルポリシーも日々動きます。1ヶ月放置のJSONを見せ続けるのは、ユーザーにとっても自分にとっても気持ち悪い。
ただ、こちらは個人運営。自分は絶対に「更新するの忘れた」をやる ── そう前提に置いて、運用を組みました。
仕組みの全体像
3つのパーツでできています。
- Cron Worker(賢いリマインダー):毎週月曜12時 JST にメールを送る。ただ送るだけでなく、いま公開JSONが何日前のものか をチェックしてから、緊急度を変えてくる
- ワンクリック更新スクリプト:Mac で
更新.commandをダブルクリックすると、データ取得 → 公開JSON生成 → デプロイまで25分で完走 - 古さを警告するUI:JSONに記録された生成日時が7日以上前なら、ホテル検索画面が赤文字で「データが古いです」と知らせる
1. ただ吠えるだけじゃないリマインダー
Cloudflare Workers の Cron 機能で、毎週月曜の昼12時(JST)に自動起動。中身は数十行の JavaScript ですが、地味な工夫として メールを送る前に公開JSONを取りに行って generated_at フィールドを読み、いま何日前のデータかを計算 しています。
メールの件名はその結果で変わります:
- 7日未満:🟢 良好(更新は任意)
- 7日以上:🔴 更新推奨(推奨アクション付き)
- 取得失敗:⚠️ 確認要(エラー内容を本文に同梱)
「毎週月曜にとりあえず吠える bot」だと、状況がよくても悪くても同じ顔で来るので、3週目あたりから無視されはじめます。状態を反映してくる bot にしておくと、緑のメールが続いている間は安心、赤が来た瞬間に手が動く、という素直な行動につながります。
メール送信は Cloudflare Email Routing の Send 機能(cloudflare:email モジュール)を使っていて、別途メール配信サービスを契約する必要がありません。Workers の無料枠と Email Routing の無料枠だけで完結します。
手動でテスト発火できる URL(/trigger)も用意してあるので、文面の調整やリンク切れチェックは月曜を待たずにすぐできます。
2. ワンクリック更新スクリプト
メールを見て「更新するか」と思ったら、Mac の Finder で 更新.command をダブルクリックします。ターミナルが立ち上がって、以下を順に実行してくれます:
update_hotels.py:楽天ウェブサービスAPIから差分取得(既存DBに無いホテルだけ追加)build_data.py:公開用JSONを再生成。一休由来データの除外、東京駅起点で所要時間を再計算、約6MBに gzip 圧縮wrangler pages deploy:Cloudflare Pages に静的ファイルをアップロード
合計でだいたい 25分。お昼休みの始まりに走らせれば、午後にはユーザーが新しいデータを見られる、というリズムです。
.command ファイルにしておくと、ターミナルの操作を覚えていなくても、Finder からダブルクリックで動かせるのが地味に便利。家族のMacからも同じ操作で動かせます。
3. UI 側の鮮度警告
公開JSONには generated_at を入れてあって、ブラウザ側で「今日との差が7日以上なら赤文字バナーを出す」処理を仕込んであります。
これは「自分が忘れたとき用」の最後の保険でもあります。月曜のリマインダーメールを見落としても、サイトを開けば必ず警告が出るので、一週間以上の放置に絶対気づける構造になっています。
苦労した点:楽天APIとの付き合い方
楽天ウェブサービスAPIは、利用規約上 取得データの長期キャッシュを推奨していません。基本はリアルタイムに近い形での利用が想定されています。
ただ、37,000軒すべてをリクエストごとに取り直すと、APIレート制限に即抵触します。現実解として、
- 公開DBは 週1回更新
- 料金や空室の最終確認は、リンク先の楽天で見てもらう
- サイトに 「表示価格は参考値」 と注記
- ホテル名リンクには 楽天アフィリエイト経由 で正規ルートを確保
という運用に落ち着きました。データの新鮮さとAPIへの負荷、どちらも極端にせず、1週間というほどよい間隔を選んだ形です。
仕組みを作って気づいたこと
「自分が忘れる前提で組む」のは、個人運営のツールではかなり大事だと感じています。気合と根性で運用を回そうとすると、3週間後には必ず破綻します。メールが届く・ボタン1つで終わる・忘れてもUIが警告する、の三段構えにしたことで、しばらく経った今も破綻していません。
Cloudflare の Cron Worker は無料枠で動くので、こういう「自分宛てリマインダー」を量産するのにとても向いています。次は楽天アフィリエイトの月次レポートも自動取得して、メールで届くようにしようかと考えています。
← 他の制作記を見る | トップ | ツールのリクエスト