簡単な解説
// ==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;
}
});
})();