https://bobobet555.com/

提交的 URL:
https://bobobet555.com/
报告完成时间:

链接 · 找到 0 个

从页面中识别出的传出链接

JavaScript 变量 · 找到 16 个

在页面窗口对象上加载的全局 JavaScript 变量是在函数外部声明的变量,可以从当前范围内的代码中的任何位置访问

控制台日志消息 · 找到 5 条

记录到 Web 控制台的消息

HTML

页面的原始 HTML 正文

<!DOCTYPE html><html lang="en"><head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no viewport-fit=cover">
    <!--    <meta name="theme-color" content="#000" />-->
    <title>...</title>
    <link id="favicon" rel="icon" type="image/x-icon" href="front/face/all/current/z54/favicon.ico">
    <style>
      * {
        box-sizing: border-box;
      }
      html,
      body {
        height: 100%;
        width: 100%;
        margin: 0;
        padding: 0;
        overflow: hidden;
      }
      #app-iframe {
        position: relative;
        width: 100%;
        height: 100%;
        border: 0;
      }
      img {
        display: none;
      }
      body.bodyLandscape {
        padding-top: 10vh !important;
        height: 110vh;
        width: calc(100% - 80px);
        margin: 0 40px;
        padding: 0;
        overflow: auto;
      }
      .bodyScrolled {
        width: 100% !important;
        margin: 0 !important;
      }
      #app-iframe {
        position: relative;
        width: 100%;
        height: 100%;
        border: 0;
      }
      img {
        display: none;
      }
      @keyframes drag_animation {
        0% {
          transform: scale(1);
        }

        25% {
          transform: scale(1.5);
        }

        30% {
          transform: scale(1);
        }

        60% {
          opacity: 1;
        }

        to {
          transform: translateY(-200px);
          opacity: 0;
        }
      }
      .iosfullscreen {
        position: absolute;
        display: block;
        height: 150vh;
        pointer-events: all;
        color: #fff;
        top: 0;
        left: 0;
        width: 100%;
        background-color: #000;
        z-index: 1500;
        overflow: scroll;
      }

      .iosdragFullscreen {
        position: fixed;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
      }

      .iosscrollarea {
        position: relative;
        top: 0;
        left: 0;
        width: 100%;
        height: 100vh;
      }
      .iosscrollarea .warning {
        position: fixed;
        width: 60vw;
        height: 30vw;
        top: calc(50% - 15vw);
        left: calc(50% - 30vw);
        text-align: center;
      }
      .iosscrollarea .animation {
        position: absolute;
        top: 50vh;
        right: 15px;
        width: 50px;
        height: 50px;
        background-size: 100% 100%;
        background-position: 50%;
        background-repeat: no-repeat;
        background-image: url("./casinohand.webp");
        animation-name: drag_animation;
        animation-duration: 4s;
        animation-iteration-count: infinite;
      }
      #iphoneTest {
        display: none;
      }
    </style>
  <link rel="apple-touch-icon" href="front/face/all/current/z54/favicon.ico"></head>
  <body>
    <div id="iphoneTest" style="overflow: scroll" class="background iosfullscreen">
      <div class="element iosdragFullscreen">
        <div class="element background iosscrollarea">
          <div class="warning">
            <span id="drag-fullscreen-title" class="element title text-title">This game needs to be in fullscreen </span>
            <br>
            <span id="drag-fullscreen-message" class="element body text-title-1"> Use your finger to drag the screen </span>
          </div>
          <div class="animation"></div>
        </div>
      </div>
    </div>
    <script>
      let [domain, supportHa] = checkDomain();
      const haList = ["s1", "s2"];
      const af = /#af=([^#]*)/.exec(window.location.href);
      if (af && af[1]) {
        sessionStorage.afId = af[1];
      }

      function checkDomain() {
        let _domain = window.location.host;
        if (_domain === "localhost" || _domain === "192.168.2.12") return [_domain, false];
        const tempHostArray = window.location.host.split(".");

        if (["s1", "s2", "devel", "intern", "shop", "terminal"].includes(tempHostArray[0])) {
          _domain = tempHostArray.slice(1).join(".");
          return [_domain, false];
        }
        if (tempHostArray[0] === "www") {
          _domain = tempHostArray.slice(1).join(".");
        }
        return [_domain, true];
      }

      async function selectHaUrl(_haList) {
        if (supportHa) {
          const rand = Math.floor(Math.random() * _haList.length);
          if (_haList[rand]) {
            const url = `${window.location.protocol}//${_haList[rand]}.${domain}/`;
            if (!(await checkUrl(url))) {
              _haList.splice(rand, rand + 1);
              if (_haList.length === 1) {
                return `${window.location.protocol}//${_haList[0]}.${domain}/`;
              } else {
                return selectHaUrl(_haList);
              }
            }
            return url;
          } else {
            alert("Can't connect with server");
          }
        } else {
          return "";
        }
      }

      // TODO: remove
      function checkUrl(_url) {
        // TODO: fix cors error
        return true;
        const controller = new AbortController();
        const timeoutId = setTimeout(() => controller.abort(), 5000);
        return fetch(`${_url}index.html`, { signal: controller.signal })
          .then((r) => {
            return true;
          })
          .catch((e) => {
            console.error(e);
            return false;
          });
      }

      function loadIframe(path) {
        if (document.getElementById("app-iframe")) {
          document.getElementById("app-iframe").remove();
        }
        const iframe = document.createElement("iframe");
        iframe.src = selectApp(path);
        iframe.id = "app-iframe";
        iframe.name = "app";
        iframe.scrolling = "yes";
        iframe.allow = "fullscreen";
        iframe.allowFullscreen = true;
        document.body.appendChild(iframe);
      }

      function selectApp(path) {
        let core = +localStorage.core_v === 2 ? "sp/fmcore/current" : "portal";
        // core = "portal";
        if (localStorage.user_type === "manager") {
          const params = window.location.href.split("?")[1] || "";
          if (params.includes("sbooking")) {
            return `${path}front/${core}/index.html`;
          }
          // return `${path}front/${core}/index.html`;
          return `${path}front/mng/index.html`;
        }
        return `${path}front/${core}/index.html`;
      }

      async function login({ username, password, shard, part, haUrl, saveDevice }) {
        haUrl = haUrl || (await selectHaUrl(haList));
        if (typeof haUrl === "undefined") {
          return;
        }
        const headers = {
          "Content-Type": "application/json",
        };
        if (localStorage["Auth-Usr"]) {
          headers["Auth-Usr"] = localStorage["Auth-Usr"];
        }
        fetch(`${haUrl}aaa/login`, {
          method: "POST",
          headers,
          body: JSON.stringify({ username, password, shard, part: part * 1 }),
        })
          .then((response) => {
            if (response.status === 200) {
              return response;
            } else {
              throw new Error(`Can't login!:${response.status}`);
            }
          })
          .then((response) => response.json())
          .then(async (data) => {
            if (data.rToken) {
              try {
                const user = JSON.parse(atob(data.rToken.split(".")[1]));
                if ([10, 11, 12].includes(user.role * 1)) {
                  localStorage.user_type = "manager";
                }
                localStorage.token = data.rToken;
                localStorage.user = JSON.stringify(user);
                localStorage.lastUser = user.id;
                localStorage["Auth-Usr"] = `${shard}${part}:${user.id}`;
                if (saveDevice) {
                  await trustDevice(haUrl, username, password, data.rToken);
                }
                window.location.reload();
              } catch (error) {
                console.log(error);
                alert(error.message);
              }
            }
          })
          .catch((error) => {
            console.log(error);
            alert(error.message);
          });
      }

      function trustDevice(haUrl, username, password, rToken) {
        const headers = {
          "Content-Type": "application/json",
          "x-access-token": rToken,
        };
        if (localStorage["Auth-Usr"]) {
          headers["Auth-Usr"] = localStorage["Auth-Usr"];
        }
        return fetch(`${haUrl}aaa/login_trust`, {
          method: "POST",
          headers,
          body: JSON.stringify({ username, password }),
        })
          .then((response) => {
            if (response.status === 200) {
              return response;
            } else {
              throw new Error(`Device not saved!:${response.status}`);
            }
          })
          .then((response) => response.json())
          .then(async (data) => {
            if (data.rToken) {
              try {
                const user = JSON.parse(atob(data.rToken.split(".")[1]));
                localStorage.token = data.rToken;
                localStorage.user = JSON.stringify(user);
              } catch (error) {
                console.log(error);
                alert(error.message);
              }
            }
          })
          .catch((error) => {
            console.log(error);
            alert(error.message);
          });
      }

      async function logout(haUrl, rToken) {
        haUrl = haUrl || (await selectHaUrl(haList));
        const headers = {
          "Content-Type": "application/json",
          "x-access-token": rToken,
        };
        if (localStorage["Auth-Usr"]) {
          headers["Auth-Usr"] = localStorage["Auth-Usr"];
        }
        return fetch(`${haUrl}aaa/logout`, {
          method: "POST",
          headers,
        }).catch((error) => {
          console.log(error);
          alert(error.message);
        });
      }

      async function u_logout(haUrl, rToken) {
        haUrl = haUrl || (await selectHaUrl(haList));
        const headers = {
          "Content-Type": "application/json",
          "x-access-token": rToken,
        };
        if (localStorage["Auth-Usr"]) {
          headers["Auth-Usr"] = localStorage["Auth-Usr"];
        }
        return fetch(`${haUrl}aaa/u_logout`, {
          method: "POST",
          headers,
        })
          .then((response) => response.json())
          .catch((error) => {
            console.log(error);
            alert(error.message);
          });
      }

      async function bookTicket(dataToSend, haUrl) {
        if (!haUrl) {
          haUrl = await selectHaUrl(haList);
        }
        if (typeof haUrl === "undefined") {
          return;
        }
        const method = "back/.in?action=nologin_call&subaction=set_book_ticket";
        const headers = {};
        if (localStorage["Auth-Usr"]) {
          headers["Auth-Usr"] = localStorage["Auth-Usr"];
        }
        return fetch(haUrl + method, {
          method: "POST",
          body: dataToSend,
          headers,
        }).then((response) => response.json());
      }

      async function searchTicket(data) {
        let { ticketNr, ticketCode, haUrl } = data;
        if (!haUrl) {
          haUrl = await selectHaUrl(haList);
        }
        if (typeof haUrl === "undefined") {
          return { Error: true, Message: "API Url Error!" };
        }
        let method = "back/.in?action=nologin_call&subaction=search_ticket";
        method += "&ticket_code=" + ticketCode;

        if (Number.isNaN(+ticketNr)) {
          method += "&ticket_name=" + ticketNr;
        } else {
          method += "&ticket_id=" + ticketNr;
        }
        const headers = {};
        if (localStorage["Auth-Usr"]) {
          headers["Auth-Usr"] = localStorage["Auth-Usr"];
        }
        return fetch(haUrl + method, {
          method: "POST",
          headers,
        }).then((response) => response.json());
      }

      async function getJackpot(data) {
        let { haUrl, model } = data;
        if (!haUrl) {
          haUrl = await selectHaUrl(haList);
        }
        let method = `back/.in?action=nologin_call&subaction=jackpot&model=${model}`;

        const headers = {};
        if (localStorage["Auth-Usr"]) {
          headers["Auth-Usr"] = localStorage["Auth-Usr"];
        }
        return fetch(haUrl + method, {
          method: "POST",
          headers,
        }).then((response) => response.json());
      }

      // init
      (async () => {
        let path = "";
        if (localStorage.token) {
          path = await selectHaUrl(haList);
        }
        loadIframe(path);
      })();

      window.addEventListener("message", async (event) => {
        switch (event.data.action) {
          case "fmcore-loaded": {
            const out = {
              action: "app-init",
              payload: {
                domain,
                token: localStorage.token,
                user: localStorage.user,
                facePath: "../../../face/",
                appsPath: "../../../",
              },
            };
            if (window.location.href.split("?").length > 1) {
              out.payload.params = window.location.href.split("?")[1];
            }
            window.frames.app.postMessage(out, "*");

            out.action = "fmcore-init";
            window.frames.app.postMessage(out, "*");

            // disable back button
            history.pushState(null, document.title, location.href);
            window.addEventListener("popstate", function () {
              history.pushState(null, document.title, location.href);
            });
            break;
          }
          case "app-init": {
            const out = {
              action: "app-init",
              payload: {
                domain,
                token: localStorage.token,
                user: localStorage.user,
                facePath: "../face/",
              },
            };
            if (window.location.href.split("?").length > 1) {
              out.payload.params = window.location.href.split("?")[1];
            }
            window.frames.app.postMessage(out, "*");

            out.action = "fmcore-init";
            window.frames.app.postMessage(out, "*");

            // disable back button
            history.pushState(null, document.title, location.href);
            window.addEventListener("popstate", function () {
              history.pushState(null, document.title, location.href);
            });
            break;
          }
          case "login": {
            if (event.data.payload.hasOwnProperty("shard") && event.data.payload.hasOwnProperty("part")) {
              await login(event.data.payload);
            } else {
              alert("Missing domain configurations!");
            }
            break;
          }
          case "logout": {
            const { haUrl, shard, part } = event.data.payload || {};
            if (shard && part) {
              await logout(haUrl, localStorage.token);
            }
            delete localStorage.token;
            delete localStorage.user_type;
            window.location.reload();
            break;
          }
          case "u_logout": {
            const { haUrl, rToken } = event.data.payload;
            if (event.data.payload.hasOwnProperty("shard") && event.data.payload.hasOwnProperty("part")) {
              const message = await u_logout(haUrl, rToken);
              const out = {
                action: "u_logout_response",
                payload: {
                  message,
                },
              };
              window.frames.app.postMessage(out, "*");
            }
            break;
          }
          case "delete-cred": {
            delete localStorage.token;
            delete localStorage.user_type;
            break;
          }
          case "reload": {
            window.location.reload();
            break;
          }
          case "book-ticket-api": {
            const { data, haUrl } = event.data.payload;
            let formData = new FormData();
            formData.append("data", JSON.stringify(data));
            const response = await bookTicket(formData, haUrl);
            if (event.ports?.[0]) {
              event.ports[0].postMessage(response);
            } else {
              const out = {
                action: "book-ticket-response",
                payload: { data: response },
              };
              window.frames.app.postMessage(out, "*");
            }
            break;
          }
          case "search-ticket-api": {
            const response = await searchTicket(event.data.payload);
            if (event.ports?.[0]) {
              event.ports[0].postMessage(response);
            } else {
              const out = {
                action: "search-ticket-response",
                payload: response,
              };
              window.frames.app.postMessage(out, "*");
            }
            break;
          }
          case "get-sessionStorage": {
            const { param } = event.data.payload;
            if (event.ports && event.ports[0]) {
              event.ports[0].postMessage(sessionStorage.getItem(param));
            }
            break;
          }
          case "get-localStorage-async": {
            const { param } = event.data.payload;
            if (event.ports && event.ports[0]) {
              event.ports[0].postMessage(localStorage.getItem(param));
            }
            break;
          }
          case "get-localStorage": {
            const { param } = event.data.payload;
            const out = {
              action: "get-localStorage",
              payload: {
                [param]: localStorage[param],
              },
            };

            window.frames.app.postMessage(out, "*");
            break;
          }
          case "set-sessionStorage": {
            const { param, value } = event.data.payload;
            sessionStorage[param] = value;
            break;
          }
          case "del-sessionStorage": {
            const { param } = event.data.payload;
            sessionStorage.removeItem(param);
            break;
          }
          case "del-localStorage": {
            const { param } = event.data.payload;
            localStorage.removeItem(param);
            break;
          }
          case "set-localStorage": {
            const { param, value } = event.data.payload;
            localStorage[param] = value;
            break;
          }
          case "set-title": {
            document.title = event.data.payload.title;
            break;
          }
          case "set-meta": {
            const { name, value } = event.data.payload;
            if (document.querySelector(`meta[name="${name}"]`)) {
              document.querySelector(`meta[name="${name}"]`).content = value;
            } else {
              const meta = document.createElement("meta");
              meta.setAttribute("name", name);
              meta.content = value;
              document.getElementsByTagName("head")[0].appendChild(meta);
            }
            break;
          }
          case "set-favicon": {
            const { path } = event.data.payload;
            document.getElementById("favicon").href = `front/face/${path}`;
            let head = window.parent.document.getElementsByTagName("head")[0];
            let link = window.parent.document.createElement("link");
            link.rel = "apple-touch-icon";
            link.href = `front/face/${path}`;
            head.appendChild(link);
            break;
          }
          case "printPost": {
            window.parent.postMessage(event.data.payload, "*");
            break;
          }
          case "open-sl": {
            const { type } = event.data.payload;
            const url = `${window.location.protocol}://${window.location.host}/?screen&type=${type}`;
            window.open(url);
            break;
          }
          case "open-sl-param": {
            const { param } = event.data.payload;
            const url = `${window.location.protocol}//${window.location.host}/${param}`;
            window.open(url);
            break;
          }
          case "open-window": {
            const { path, setCookie } = event.data.payload;
            if (setCookie) {
              document.cookie = `obs_wa=${localStorage.token};path=/;domain=${domain}`;
            }
            const url = `${await selectHaUrl(haList)}${path}`;
            window.open(url, "_blank", "height=600,width=600");
            // console.log('open-sl')
            break;
          }
          case "redirect": {
            const { path } = event.data.payload;
            window.location.href = path;
            break;
          }
          case "load-chat-smartsupp": {
            const { key, offset = "" } = event.data.payload;

            window._smartsupp = window._smartsupp || {};
            const [x, y] = offset.split(",");
            if (x) window._smartsupp.offsetX = x;
            if (y) window._smartsupp.offsetY = y;
            window._smartsupp.key = key;
            window.smartsupp ||
              (function (d) {
                let smartsupp;
                var s,
                  c,
                  o = (smartsupp = function () {
                    o._.push(arguments);
                  });
                o._ = [];
                s = d.getElementsByTagName("script")[0];
                c = d.createElement("script");
                c.type = "text/javascript";
                c.charset = "utf-8";
                c.async = true;
                c.src = "//www.smartsuppchat.com/loader.js?";
                s.parentNode.insertBefore(c, s);
              })(document);
            break;
          }
          case "load-google-tag-manager": {
            const { key } = event.data.payload;
            (function (w, d, s, l, i) {
              w[l] = w[l] || [];
              w[l].push({ "gtm.start": new Date().getTime(), event: "gtm.js" });
              var f = d.getElementsByTagName(s)[0],
                j = d.createElement(s),
                dl = l !== "dataLayer" ? "&l=" + l : "";
              j.async = true;
              j.src = "https://www.googletagmanager.com/gtm.js?id=" + i + dl;
              f.parentNode.insertBefore(j, f);
            })(window, document, "script", "dataLayer", key);
            break;
          }
          case "get-jackpot": {
            const response = await getJackpot(event.data.payload);
            if (event.ports?.[0]) {
              event.ports[0].postMessage(response);
            } else {
              const out = {
                action: "get-jackpot-response",
                payload: response,
              };
              window.frames.app.postMessage(out, "*");
            }
            break;
          }
          default:
            break;
        }
      });
    </script><iframe src="front/portal/index.html" id="app-iframe" name="app" scrolling="yes" allow="fullscreen" allowfullscreen=""></iframe>
  

</body></html>