restaurant-booking について
restaurant-bookingは、Notteのブラウザー自動化でレストランを予約するスキルです。OpenTableでの手順とResyを使う代替フローに加え、予約後のカレンダー登録も案内します。
主な機能
- 01Notteブラウザーセッションの開始
- 02レストラン、日付、時刻、人数の選択
- 03連絡先の入力と予約送信
- 04ページ取得による予約確認
- 05予約後のカレンダー登録
活用シーン
- 01OpenTableで席を予約
- 02Resyを使ったレストラン予約
- 03予約確定の確認
- 04予約をカレンダーに追加
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ gooseworks-ai/ goose-skills --skill restaurant-bookingインストール後、Claude Code で/restaurant-bookingを入力して読み込まれたか確認します。
同梱ファイルskill.meta.json
詳細
レストランの予約
セットアップ
認証情報を ~/.gooseworks/credentials.json から読み込みます。
export GOOSEWORKS_API_KEY=$(python3 -c "import json;print(json.load(open('$HOME/.gooseworks/credentials.json'))['api_key'])")
export GOOSEWORKS_API_BASE=$(python3 -c "import json;print(json.load(open('$HOME/.gooseworks/credentials.json')).get('api_base','https://api.gooseworks.ai'))")
~/.gooseworks/credentials.json が存在しない場合は、npx gooseworks login を実行するようユーザーに伝えてください。
すべてのエンドポイントで Bearer 認証を使用します:-H "Authorization: Bearer $GOOSEWORKS_API_KEY"
Orthogonal 経由の Notte ブラウザー自動化を使って予約します。
要件
- Orthogonal CLI(
npm install -g @orth/cli)または API キー - 予約者情報:名前、メールアドレス、電話番号
クイックフロー
- Notte セッションを開始する
- 予約サイトに移動する(OpenTable を推奨)
- 日付、時刻、人数を選択する
- 連絡先フォームに入力する
- 送信して確認する
CLI の方法(推奨)
1. Notte セッションを開始する
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
-H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"api":"notte","path":"/sessions/start"}'
--body '{"browser_type":"chromium","headless":true,"solve_captchas":true,"idle_timeout_minutes":10}'
レスポンスから session_id を保存します。
2. OpenTable に移動する
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
-H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"api":"notte","path":"/sessions/{session_id}/page/execute"}'
--body '{"type":"goto","url":"https://www.opentable.com/r/{restaurant}?datetime=2026-02-17T19:00&covers=2"}'
3. 時間帯をクリックする
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
-H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"api":"notte","path":"/sessions/{session_id}/page/execute"}'
--body '{"type":"click","selector":"button:has-text(\"7:00 PM\")"}'
4. 座席を選択する(表示された場合)
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
-H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"api":"notte","path":"/sessions/{session_id}/page/execute"}'
--body '{"type":"click","selector":"button:has-text(\"Select\")"}'
5. フォームに入力する
# First name
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
-H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"api":"notte","path":"/sessions/{session_id}/page/execute"}'
--body '{"type":"fill","selector":"input#firstName","value":"John"}'
# Last name
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
-H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"api":"notte","path":"/sessions/{session_id}/page/execute"}'
--body '{"type":"fill","selector":"input#lastName","value":"Doe"}'
# Email
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
-H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"api":"notte","path":"/sessions/{session_id}/page/execute"}'
--body '{"type":"fill","selector":"input#email","value":"[email protected]"}'
# Phone
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
-H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"api":"notte","path":"/sessions/{session_id}/page/execute"}'
--body '{"type":"fill","selector":"input#phoneNumber","value":"4155551234"}'
6. 利用規約に同意する
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
-H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"api":"notte","path":"/sessions/{session_id}/page/execute"}'
--body '{"type":"click","selector":"text=I agree to the restaurant"}'
7. 予約を送信する
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
-H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"api":"notte","path":"/sessions/{session_id}/page/execute"}'
--body '{"type":"click","selector":"button:has-text(\"Complete reservation\")"}'
8. 確認を検証する
curl -s -X POST $GOOSEWORKS_API_BASE/v1/proxy/orthogonal/run \
-H "Authorization: Bearer $GOOSEWORKS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"api":"notte","path":"/sessions/{session_id}/page/scrape"}'
--body '{"only_main_content":true}'
レスポンスに「confirmed」と表示されていることを確認します。
API の方法(curl)
# Start session
curl -X POST "https://api.orth.sh/v1/run" \
-H "Content-Type: application/json" \
-d '{
"api": "notte",
"path": "/sessions/start",
"body": {
"browser_type": "chromium",
"headless": true,
"solve_captchas": true,
"idle_timeout_minutes": 10
}
}'
# Execute actions (same pattern)
curl -X POST "https://api.orth.sh/v1/run" \
-H "Content-Type: application/json" \
-d '{
"api": "notte",
"path": "/sessions/{session_id}/page/execute",
"body": {"type":"goto","url":"https://www.opentable.com/..."}
}'
主なセレクター(OpenTable)
| 項目 | セレクター |
|---|---|
| 名 | input#firstName |
| 姓 | input#lastName |
| メールアドレス | input#email |
| 電話番号 | input#phoneNumber |
| 利用規約のチェックボックス | text=I agree to the restaurant |
| 送信 | button:has-text('Complete reservation') |
| 時間帯 | button:has-text('7:00 PM') |
| 座席の選択 | button:has-text('Select') |
レストラン ID の確認
OpenTable を検索して、URL から抽出します:
restref=1906→ Foreign Cinema- URL パス内のレストランのスラッグ
URL の形式例:
https://www.opentable.com/r/{restaurant-slug}?restref={id}&datetime={YYYY-MM-DDTHH:MM}&covers={n}
ヒント
- OpenTable ではテーブルが 5 分間確保されます。すばやく進めてください
fillアクションではvalueパラメーターを使います(textを指定したtypeではありません)- 利用規約にはチェックボックスを直接ではなく、ラベルのテキストをクリックして同意します
- クレジットカードは不要です。予約は無料です
- 確認メールは自動送信されます
Resy を使う場合
レストランが Resy を使用している場合:
https://resy.com/cities/{city}/venues/{restaurant}?date={YYYY-MM-DD}&seats={n}
流れは同様ですが、セレクターが異なります。まずページをスクレイピングして、フォームのフィールドを確認してください。
予約後
gog calendar createでカレンダーの予定を作成します- 参加者と場所を追加します
- 説明に確認番号を記載します
コメント
Markdown 対応