待合室通過タイミング微調整 (確認ダイアログ強制表示)

PC向け/スマホ向けサイト両対応

概要

待合室で順番が来たときに、サイトへすすむかの確認ダイアログを強制表示し、待合室を通過する(サイトへ入る)タイミングを数分間だけ調整(先延ばし)できるようにします
※確認ダイアログは、通常ではブラウザが最小化されている場合などに表示されるものです

動作イメージ
注意
待合室の順番が来て確認ダイアログが表示されてからの通過可能時間はサイトによって異なります。
東京ディズニーリゾート オンライン予約・購入サイトでは5分となっており、このブックマークレットでは5分で計算しています。
他のサイトで利用するために制限時間を変更したい場合は、下記の「カスタマイズ」の内容を参考に、数字部分を変更してブックマークレットの登録を行ってください


※ブックマークレットの登録・利用方法が分からない場合は、基本的な使い方のページを参考にしてください

ブックマークレット文字列

以下の文字列でブックマークレットを登録し、待合室ページで使用してください

ダミー登録用の空ページのリンク
スマホの場合
iPhone Safari / Chrome および Android Chrome など
ブックマークレット文字列
PCブラウザの場合
以下のリンクボタンを、ブラウザのブックマークバーへドラッグ&ドロップして登録してください
(カスタマイズ)通過までの制限時間を5分以外に変更する場合
他サイトで利用する場合など、制限時間を5分以外に変更する場合は、ブックマークレット登録時に文字列の末尾にある「5」の部分を書き換えてから登録してください
(サイトへの可能となる制限時間は、サイトによって異なります)

使い方

待合室に入ったら、ブックマークレットを呼び出してください
実行されると「実行しました」とアラートメッセージが表示されます
このメッセージは閉じてください



待合室の順番が来ると、自動的にサイトへすすむための確認のダイアログが表示されます
制限時間内に、タイミングを調整し「すすむ」等、確認ボタンをタップ/クリックして待合室を通過(サイトへ入る)してください


通過期限が切れると「期限切れ」と表示されます。サーバー側で持っている期限を過ぎてからすすむと、再度順番待ちをすることになります。
ブックマークレットを使用すると自動通過はされなくなります
一度実行したものの、調整が不要になった場合は待合室のページをリロードしてください(通常の状態に戻ります)

ソースコードおよび処理概要

ブックマークレット化前のソースコードです
ご自身で表示等カスタマイズされたい方はご自由にご利用ください
※ブックマークレット化の方法については記載していません

簡単な解説

JavaScriptコード
コピー
javascript: (function (confirmLimitMin) {
  if (document.getElementById('windowStartTimeDetail') || !document.querySelector('span#MainPart_lbExpectedServiceTime')) {
    alert('すでに実行されているか、対象のページではありません');
    return;
  };
  if (window.QueueIt.Queue.InactivityDetector) {
    window.QueueIt.Queue.InactivityDetector.prototype.isHidden = () => { return true };
  } else {
    alert('[エラー] 実行できませんでした(QueueIt.Queue.InactivityDetector が見つかりませんでした');
    return;
  };

  const insertAfter = (elem, posElem) => {
    posElem.parentElement.insertBefore(elem, posElem.nextSibling);
  };

  let pos1 = document.querySelector('#pConfirmRedirectTime');
  const area1 = document.createElement('span');
  area1.setAttribute('id', 'windowStartTimeDetail');
  area1.style.cssText = 'text-align:center; font-weight:bold; color:blue;';
  area1.innerHTML = '';
  pos1.appendChild(area1);

  const area2 = document.createElement('div');
  area2.setAttribute('id', 'windowStartTimeRemain');
  area2.style.cssText = 'font-size:1.5rem; text-align:center; font-weight:bold; color:blue; margin-top:10px;';
  area2.innerHTML = '';
  insertAfter(area2, pos1);

  let timetId;
  let windowStartTime;
  var origOpen = XMLHttpRequest.prototype.open;
  XMLHttpRequest.prototype.open = function () {
    const dateFormat = (date, format) => {
      const _fmt = {
        hh: date => { return ('0' + date.getHours()).slice(-2) },
        mm: date => { return ('0' + date.getMinutes()).slice(-2) },
        ss: date => { return ('0' + date.getSeconds()).slice(-2) },
        dd: date => { return ('0' + date.getDate()).slice(-2) },
        yyyy: date => { return date.getFullYear() + '' },
        MM: date => { return ('0' + (date.getMonth() + 1)).slice(-2) },
      };
      const _priority = ['dd', 'yyyy', 'MM', 'hh', 'mm', 'ss'];
      return _priority.reduce((res, fmt) => res.replace(fmt, _fmt[fmt](date)), format);
    };
    const getHMS = (total_sec) => {
      const hours = Math.floor(total_sec / 60 / 60);
      const minutes = Math.floor((total_sec - hours * 60 * 60) / 60);
      const seconds = Math.floor(total_sec - (hours * 60 + minutes) * 60);
      return [hours, minutes, seconds]
    };

    this.addEventListener('load', () => {
      if (!timetId) {
        try {
          const res = JSON.parse(this.responseText);
          if (res.ticket) {
            const { windowStartTimeUTC } = res.ticket;
            if (windowStartTimeUTC) {
              windowStartTime = new Date(windowStartTimeUTC);

              // インターバルタイマー起動(1回だけ)
              timetId = setInterval(() => {
                const windowStartTimeDetail = document.getElementById('windowStartTimeDetail');
                windowStartTimeDetail.innerHTML = `
案内開始時刻: ${dateFormat(windowStartTime, 'hh:mm:ss')}`; const windowStartTimeRemain = document.getElementById('windowStartTimeRemain'); const now = new Date(); const confirmLimitTime = new Date(windowStartTimeUTC); confirmLimitTime.setMinutes(confirmLimitTime.getMinutes() + confirmLimitMin); const remain_sec = (windowStartTime - now + confirmLimitMin * 60 * 1000) / 1000; const [hours, minutes, seconds] = getHMS(remain_sec); if (remain_sec >= 0) { windowStartTimeRemain.innerHTML = `通過期限: ${dateFormat(confirmLimitTime, 'hh:mm:ss')}
(残り: ${minutes}分 ${seconds}秒)`; } else { windowStartTimeRemain.style.color = 'red'; windowStartTimeRemain.innerHTML = `通過期限: ${dateFormat(confirmLimitTime, 'hh:mm:ss')}まで
(*** 期限切れ ***)`; }; }, 1000); }; }; } catch (err) { } }; }); origOpen.apply(this, arguments); }; alert('実行しました\n(このメッセージは閉じてください)'); })(5);