このページは?

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

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

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

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

ユーザースクリプト一覧

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

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;
    }
  });

})();