このページは?

iPhone Safari用の機能拡張「Userscripts」に対応したユーザースクリプトを配布しています

初めての方へ
ユーザースクリプトはブラウザへ専用の機能拡張(拡張機能)アプリをインストールし、そこに個々のスクリプトを登録して使用します
利用が初めての方は、始めにユーザースクリプトの使い方をご確認ください

iPhone Safari 向けの画面付き手順を掲載しています
質問や不明な点がありましたら、X(旧Twitter)のアカウント@nyanyanya919 までお知らせください
おことわり
可能な限り安全に配慮した上で作成し動作確認済みのものを公開しておりますが、利用および動作結果については自己責任でお願いいたします

ユーザースクリプトの使い方

ユーザースクリプト一覧

注意
これらのユーザースクリプトは単体では動作しません
必ずユーザースクリプトに対応した機能拡張アプリ(Userscriptsまたは同等機能のもの)を導入し使用する必要があります。導入がまだの方は上記の「初めての方へ」を参照ください
(PC用ブラウザやAndroid用の一部のブラウザでユーザースクリプトを使用する場合は、「Tampermonkey」や「Violentmonkey」「Greasemonkey」という拡張機能(アドオン)が有名です)
バージョン履歴

2024/04/23 version 0.1 初回リリース版

2024年4月ごろから、一部のブラウザで予約サイトの待合室ページの表示が真っさらなまま固まり、タブを閉じるまで重くなったり何も操作できなくなる事象が発生しています
(PC版Chrome、Firefox、Edge、Android版Crhomeなど)
このユーザースクリプトではその問題を可能な限り回避します
・残念ながらAndroid版Chromeでは拡張機能が使えないため、このユーザースクリプトは利用できません
  Androidの場合は、FirefoxやKiwiブラウザなどであれば拡張機能が利用可能です
・iPhoneでは発生の報告がないため、発生していない場合は対策は不要です
動作対象となるURL:
  • https://reserve-q.tokyodisneyresort.jp/?~
    (待合室での待機中状態のページ)
(補足)これでもまだ回避出来ない場合

Tampermonkeyを使用している場合は、「ダッシュボード」→「設定」から「設定のモード」を「上級者」に変更し、「実験的」の中にある「注入方法」を「標準」から「即時」に変えてみてください

Tampermonkeyの設定

Violentmonkeyを使用している場合は、ダッシュボード画面から「設定」→「高度な設定」→「基本設定」の「page 同期モード (シークレットモードやクッキー無効中のサイトを除く)」にチェックを入れてください

Violentmonkeyの設定

ソースコード
Userscript(JavaScript)コード
コピー
// ==UserScript==
// @name        待合室ページの画面フリーズ回避
// @namespace   https://twitter.com/nyanyanya919/
// @version     0.1
// @author      にゃにゃにゃ
// @description 待合室のページの表示で画面が固まり操作できなくなる問題を可能な限り回避する
// @run-at      document-start
// @match       https://reserve-q.tokyodisneyresort.jp/?*
// @downloadURL https://nya3.pages.dev/tools/userscripts/prevent_queue_freeze.js
// @updateURL   https://nya3.pages.dev/tools/userscripts/prevent_queue_freeze.js
// @supportURL  https://twitter.com/nyanyanya919/
// ==/UserScript==
(function () {

  // チャレンジ中のアニメーションエリアが見えない かつ body.challenge以外のbodyが見えない
  if (!document.querySelector('#divChallenge') && !document.querySelector('body:not(.challenge)')) {
    // チャレンジアニメーションエリアを直接挿入
    const html = `<div id="divChallenge_Content">
                          <div id="challenge-widget-container">
                              <div id="challenge-container"></div>
                              <div class="hidden" id="three-bar-loader-container">
                                  <div class="three-bar-loader"></div>
                                  <div class="three-bar-loader"></div>
                                  <div class="three-bar-loader"></div>
                              </div>
                          </div>
                      </div>
              `
    const el = document.createElement('div');
    el.id = 'divChallenge_dummy';
    el.innerHTML = html;
    if (document.body) {
      document.body.appendChild(el);
    } else {
      const body = document.createElement('body');
      body.appendChild(el);
      document.body = body;
    }

    // ページ読み込み後、ダミーの内容を本来のエリアに移して削除する
    window.addEventListener('load', () => {
      // 本体が見えたらダミー内容をコピーしダミーを削除する
      const org_el = document.querySelector('#divChallenge');
      if (org_el) {
        // HTMLをコピー
        const dummy_el = document.querySelector('#divChallenge_dummy');
        org_el.innerHTML = dummy_el.innerHTML;
        // ダミーを削除
        dummy_el.remove();
      }
    });
  } else {
    // 対処不要
  };

})();
バージョン履歴

2024/04/11 version 0.1 初回リリース版

ホテルの「日付・価格から検索」ページ表示時、検索処理でエラーが発生した場合に、読み込み中(グルグル)表示から永遠に変わらなかったり、空室では無いのに全客室タイプが空室表示になる現象があります。(前者はサーバー混雑時に発生しやすいです)
このユーザースクリプトでは、エラーが発生したことをアラートで表示し、ページのリロードが必要ということをお知らせします
アラート表示の例
iPhone Safariの場合
Windows Chromeの場合

「403 Forbidden」は「Access Denied」と同じで、アクセスが拒否されていることを示します

動作対象となるURL:
(PC向け/スマホ向けホテル検索ページ)
  • https://reserve.tokyodisneyresort.jp/hotel/list/
  • https://reserve.tokyodisneyresort.jp/sp/hotel/list/
ソースコード

簡単な解説

  • ページ読み込み時、問題のコードの読み込み完了をチェックし、見つかったらエラー処理を挿入する

Userscript(JavaScript)コード
コピー
// ==UserScript==
// @name        ホテル日付指定検索エラー時のアラート表示
// @namespace   https://twitter.com/nyanyanya919/
// @version     0.1
// @author      にゃにゃにゃ
// @description ホテルの日付指定での検索時、空室検索処理がエラーの場合にアラートで表示する
// @run-at      document-start
// @match       https://reserve.tokyodisneyresort.jp/hotel/list/*
// @match       https://reserve.tokyodisneyresort.jp/sp/hotel/list/*
// @downloadURL https://nya3.pages.dev/tools/userscripts/hotel_search_error_alert.js
// @updateURL   https://nya3.pages.dev/tools/userscripts/hotel_search_error_alert.js
// @supportURL  https://twitter.com/nyanyanya919/
// ==/UserScript==
(function () {

  const checkTimeout = 5000;
  const checkInterval = 100;

  let startTime = new Date();
  let intervalId;

  // インターセプトタイミングを調整中
  intervalId = setInterval(() => {
    const now = new Date();
    if ((now - startTime) > checkTimeout) {
      clearInterval(intervalId);
      return;
    }
    if (typeof HotelPriceStockQuery !== 'undefined') {
      if (Hotel.Util.handleError) {
        const orig_handleError = Hotel.Util.handleError;
        Hotel.Util.handleError = function (data) {
          alert('空室検索でデータエラーが発生しました\n\n再検索またはページをリロードしてください');
          return orig_handleError(data);
        }
      }
      if ($ && $.lifeobs.ajax) {
        const orig_ajax = $.lifeobs.ajax;
        $.lifeobs.ajax = function (e) {
          // errorコールバックを定義
          if (e.url.endsWith('/hotel/api/queryHotelPriceStock/') && !('stockQueryType' in (e.data ?? {})) && !(e.error)) {
            e.error = function (xhr, status, error) {
              if (xhr.readyState == 4) {
                alert(`空室検索でエラーが発生しました\n${xhr.status} ${error}\n\n再検索またはページをリロードしてください`);
              }
            }
          }
          return orig_ajax(e);
        }
      }
      clearInterval(intervalId);
    }
  }, checkInterval);

  // ページ読み込み完了時に対象外ページの場合(混雑ページ等)は即終了する
  window.addEventListener('load', () => {
    if (!document.querySelector('form#reserveSearchForm')) {
      clearInterval(intervalId);
      return;
    }
  });

})();