← 制作記一覧へ

ホテルDBを週次で更新する仕組み(Cron Worker と忘れないメール)

2026-04-25 ホテル検索Cloudflare WorkersCron運用自動化

ホテル検索ツールを公開して、最初に直面した地味な問題が「データが古くなる」ことでした。楽天トラベルから取得した37,000軒分の情報を1つの公開JSONにまとめているのですが、料金もキャンセルポリシーも日々動きます。1ヶ月放置のJSONを見せ続けるのは、ユーザーにとっても自分にとっても気持ち悪い。

ただ、こちらは個人運営。自分は絶対に「更新するの忘れた」をやる ── そう前提に置いて、運用を組みました。

仕組みの全体像

3つのパーツでできています。

  1. Cron Worker(賢いリマインダー):毎週月曜12時 JST にメールを送る。ただ送るだけでなく、いま公開JSONが何日前のものか をチェックしてから、緊急度を変えてくる
  2. ワンクリック更新スクリプト:Mac で 更新.command をダブルクリックすると、データ取得 → 公開JSON生成 → デプロイまで25分で完走
  3. 古さを警告するUI:JSONに記録された生成日時が7日以上前なら、ホテル検索画面が赤文字で「データが古いです」と知らせる

1. ただ吠えるだけじゃないリマインダー

Cloudflare Workers の Cron 機能で、毎週月曜の昼12時(JST)に自動起動。中身は数十行の JavaScript ですが、地味な工夫として メールを送る前に公開JSONを取りに行って generated_at フィールドを読み、いま何日前のデータかを計算 しています。

メールの件名はその結果で変わります:

「毎週月曜にとりあえず吠える bot」だと、状況がよくても悪くても同じ顔で来るので、3週目あたりから無視されはじめます。状態を反映してくる bot にしておくと、緑のメールが続いている間は安心、赤が来た瞬間に手が動く、という素直な行動につながります。

メール送信は Cloudflare Email Routing の Send 機能(cloudflare:email モジュール)を使っていて、別途メール配信サービスを契約する必要がありません。Workers の無料枠と Email Routing の無料枠だけで完結します。

手動でテスト発火できる URL(/trigger)も用意してあるので、文面の調整やリンク切れチェックは月曜を待たずにすぐできます。

2. ワンクリック更新スクリプト

メールを見て「更新するか」と思ったら、Mac の Finder で 更新.command をダブルクリックします。ターミナルが立ち上がって、以下を順に実行してくれます:

  1. update_hotels.py:楽天ウェブサービスAPIから差分取得(既存DBに無いホテルだけ追加)
  2. build_data.py:公開用JSONを再生成。一休由来データの除外、東京駅起点で所要時間を再計算、約6MBに gzip 圧縮
  3. wrangler pages deploy:Cloudflare Pages に静的ファイルをアップロード

合計でだいたい 25分。お昼休みの始まりに走らせれば、午後にはユーザーが新しいデータを見られる、というリズムです。

.command ファイルにしておくと、ターミナルの操作を覚えていなくても、Finder からダブルクリックで動かせるのが地味に便利。家族のMacからも同じ操作で動かせます。

3. UI 側の鮮度警告

公開JSONには generated_at を入れてあって、ブラウザ側で「今日との差が7日以上なら赤文字バナーを出す」処理を仕込んであります。

これは「自分が忘れたとき用」の最後の保険でもあります。月曜のリマインダーメールを見落としても、サイトを開けば必ず警告が出るので、一週間以上の放置に絶対気づける構造になっています。

苦労した点:楽天APIとの付き合い方

楽天ウェブサービスAPIは、利用規約上 取得データの長期キャッシュを推奨していません。基本はリアルタイムに近い形での利用が想定されています。

ただ、37,000軒すべてをリクエストごとに取り直すと、APIレート制限に即抵触します。現実解として、

という運用に落ち着きました。データの新鮮さとAPIへの負荷、どちらも極端にせず、1週間というほどよい間隔を選んだ形です。

仕組みを作って気づいたこと

自分が忘れる前提で組む」のは、個人運営のツールではかなり大事だと感じています。気合と根性で運用を回そうとすると、3週間後には必ず破綻します。メールが届く・ボタン1つで終わる・忘れてもUIが警告する、の三段構えにしたことで、しばらく経った今も破綻していません。

Cloudflare の Cron Worker は無料枠で動くので、こういう「自分宛てリマインダー」を量産するのにとても向いています。次は楽天アフィリエイトの月次レポートも自動取得して、メールで届くようにしようかと考えています。


← 他の制作記を見るトップツールのリクエスト