🚀

5. 万博自動化検証 ― ページ遷移に沿った処理フロー(来場日時変更編)

に公開

5. 万博自動化検証 ― ページ遷移に沿った処理フロー(来場日時変更編)

📌 前回の記事4. 万博自動化検証 ― 万博サイトでの自動化概要


来場日変更の自動化パターン

対象となると考えられるURL(@match)


https://ticket.expo2025.or.jp/ticket_visiting_reservation/*


処理概要

来場日を変更する流れでは、以下のような処理が考えられます。

  1. 自動リロードの管理

    • 毎分決まった秒数に合わせてリロードを実行。
    • ページ右下に残り秒数を表示し、クリックで停止できるようにする。
    • 万博サイトで人が人手で操作できる間隔であること
      毎分3〜4秒あたりで更新されている様子がうかがえた(2025年9月中旬時点)。
  2. 成功ログと通知

    • 成功回数や履歴を localStorage に保存。
    • 成功時に外部通知(Discord Webhook など)を送る。
  3. ページ内の監視とクリック制御

    • 日付ボタンや時間帯ボタンを定期的に監視。
    • 条件に合致したら一度だけクリック。
  4. 「日付変更」確定処理

    • 確認画面でボタンが有効になるのを待機。
    • 押下後、完了ダイアログを一定時間後に閉じる。
  5. エラーモーダルの処理

    • 「定員超過」などのモーダルを検出して履歴を残す。
    • 一定回数ごとに外部通知を送信。
  6. クリックの時間同期

    • 「毎分○秒にクリック」といったタイミング制御を行い、サーバー更新タイミングに合わせて操作。

サンプルコード

// ==UserScript==
// @name         万博自動化検証 - 来場日変更
// @namespace    http://tampermonkey.net/
// @version      0.1
// @match        https://ticket.expo2025.or.jp/ticket_visiting_reservation/*
// @grant        none
// ==/UserScript==

(function() {
  'use strict';

  // --- UI: 残り秒数カウント ---
  function setupTimerPanel() {
    const panel = document.createElement('div');
    panel.style.position = 'fixed';
    panel.style.bottom = '10px';
    panel.style.right = '10px';
    panel.style.background = 'rgba(0,0,0,0.5)';
    panel.style.color = '#fff';
    panel.style.padding = '10px';
    panel.style.zIndex = '9999';
    document.body.appendChild(panel);
    return panel;
  }
  const timerPanel = setupTimerPanel();

  // --- ページの定期リロード ---
  function scheduleReload() {
    setInterval(() => {
      console.log("⏳ ページをリロードします");
      location.reload();
    }, 60 * 1000); // 例: 60秒ごと
  }

  // --- 成功ログ保存 ---
  let successCount = 0;
  function addSuccessLog(msg) {
    successCount++;
    localStorage.setItem("successCount", successCount);
    console.log("✅ 成功:", msg);

    // 外部通知処理(例: Discord Webhook 送信など)
    // 詳細内容は省略
  }

  // --- ボタン監視とクリック ---
  function watchAndClick(selector, label) {
    const interval = setInterval(() => {
      const btn = document.querySelector(selector);
      if (btn && !btn.disabled) {
        console.log(`${label} ボタンをクリック`);
        btn.click();
        addSuccessLog(label);
        clearInterval(interval);
      }
    }, 500);
  }

  // --- エラーモーダル検出 ---
  function watchFailModal() {
    const modalObserver = new MutationObserver(() => {
      const modal = document.querySelector(".fail-modal");
      if (modal) {
        console.log("⚠️ 定員超過モーダルを検出しました");
        // 詳細内容は省略
      }
    });
    modalObserver.observe(document.body, { childList: true, subtree: true });
  }

  // --- 初期化 ---
  function init() {
    scheduleReload();

    // セレクタ詳細内容は省略
    watchAndClick("button.change-date", "日付変更");
    watchAndClick("button.time-slot", "時間帯選択");

    watchFailModal();
  }

  window.addEventListener("load", init);
})();

考察

  • 上記では日付変更には成功しないと考えられます
  • SNSなどでは「空席が出たページを開いたまま予約リクエストを繰り返す」動作がささやかれています。
  • こうした規約違反の挙動をしている利用者に対しては、正攻法の自動化ではどうしても勝てないでしょう。
  • 結果的に「規約に則った方法では取得できなさそう」というのは残念ですが、これはしょうがないことだと考えます。

免責事項

本記事は Web 自動化の学習記録をまとめたものであり、Expo 2025 チケット予約システムの不正利用を助長する意図は一切ありません。
実際にスクリプトを利用する場合は、万博公式の規定や利用規約に従うことが必須です。
本記事を参考にしたことによって生じたいかなる不利益・損害についても、筆者は責任を負いません。


Discussion