Help
RSS
API
Feed
Maltego
Contact
Domain > 9xbetd.com
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2025-04-21
18.160.225.96
(
ClassC
)
2025-11-25
3.169.173.25
(
ClassC
)
Port 80
HTTP/1.1 301 Moved PermanentlyServer: CloudFrontDate: Tue, 25 Nov 2025 23:07:38 GMTContent-Type: text/htmlContent-Length: 167Connection: keep-aliveLocation: https://9xbetd.com/X-Cache: Redirect from cloudfrontVia: 1.1 6957b6fac4a3f8180355a074ea5833e2.cloudfront.net (CloudFront)X-Amz-Cf-Pop: HIO52-P4Alt-Svc: h3:443; ma86400X-Amz-Cf-Id: QgQjGz0CaGOn0weE5fXYITEy06mSRF44x5u_7PBKFiLWioB1hr1WqA html>head>title>301 Moved Permanently/title>/head>body>center>h1>301 Moved Permanently/h1>/center>hr>center>CloudFront/center>/body>/html>
Port 443
HTTP/1.1 200 OKContent-Type: text/htmlContent-Length: 50746Connection: keep-aliveServer: nginxLast-Modified: Thu, 20 Nov 2025 02:29:54 GMTAccept-Ranges: bytesDate: Tue, 25 Nov 2025 14:26:09 GMTETag: 691e7d22-c63aVary: Accept-EncodingX-Cache: Hit from cloudfrontVia: 1.1 cb2339b8008ceeabfc2dd9e6cfbc465c.cloudfront.net (CloudFront)X-Amz-Cf-Pop: HIO52-P4Alt-Svc: h3:443; ma86400X-Amz-Cf-Id: zssNRo_aKmENMN3MkvCtncpiAJ425Vo-DOK7kN5EjTqk_QAOq1L64gAge: 31289 !DOCTYPE html>html langpt>head>meta charsetutf-8>link relicon hrefdata:image/png;base64,>meta nameviewport contentwidthdevice-width,initial-scale1,viewport-fitcover>meta nameapple-mobile-web-app-capable contentyes>meta nameapple-mobile-web-app-status-bar-style contentblack-translucent>meta nameformat-detection contenttelephoneno>meta namerenderer contentwebkit>meta nameforce-rendering contentwebkit>meta http-equivX-UA-Compatible contentIEedge,chrome1>meta namemsapplication-tap-highlight contentno>meta nameapple-touch-fullscreen contentyes>meta namefull-screen contentyes>meta namex5-fullscreen contenttrue>meta name360-fullscreen contenttrue>meta namex5-page-mode contentapp>meta nametheme-color content#0E131B>link relicon typeimage/svg+xml sizes192x192 href/static/images/advertisement/down.png>link relicon typeimage/svg+xml sizes512x512 href/static/images/advertisement/down.png>meta http-equivCache-Control contentno-cache, no-store, must-revalidate>meta http-equivPragma contentno-cache>meta http-equivExpires content0>link relicon typeimage/svg+xml href/static/images/advertisement/down.png>meta propertyog:title contentBET98>meta propertyog:image content/static/images/advertisement/down.png>link relapple-touch-startup-image media(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait) href/static/images/advertisement/down.png>link relapple-touch-startup-image media(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape) href/static/images/advertisement/down.png>link relapple-touch-startup-image media(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait) href/static/images/advertisement/down.png>link relapple-touch-startup-image media(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape) href/static/images/advertisement/down.png>link relapple-touch-startup-image href/static/images/advertisement/down.png>link relshortcut icon typeimage/x-icon href./bitbug_favicon.ico>meta nametheme-color content#000000>link relapple-touch-icon sizes180x180 href/static/images/advertisement/down.png>link relapple-touch-icon sizes152x152 href/static/images/advertisement/down.png>link relapple-touch-icon sizes144x144 href/static/images/advertisement/down.png>link relapple-touch-icon sizes120x120 href/static/images/advertisement/down.png>link relapple-touch-icon sizes114x114 href/static/images/advertisement/down.png>link relapple-touch-icon sizes76x76 href/static/images/advertisement/down.png>link relapple-touch-icon sizes72x72 href/static/images/advertisement/down.png>link relapple-touch-icon sizes60x60 href/static/images/advertisement/down.png>link relapple-touch-icon sizes57x57 href/static/images/advertisement/down.png>link relapple-touch-icon href/static/images/advertisement/down.png>meta nameapple-mobile-web-app-title contentBET98>meta nameapplication-name contentBET98>meta namemsapplication-TileColor content#000000>meta namemsapplication-TileImage content/static/images/advertisement/down.png>meta nametwitter:title contentBET98>title>BET98/title>script>var coverSupport CSS in window && typeof CSS.supports function && (CSS.supports(top: env(a)) || CSS .supports(top: constant(a))) document.write( meta nameviewport contentwidthdevice-width, user-scalableno, initial-scale1.0, maximum-scale1.0, minimum-scale1.0 + (coverSupport ? , viewport-fitcover : ) + />)/script>link relstylesheet href/static/index.2da1efab.css>script src/static/js/particles.js>/script>script srchttps://image.pghermes7.com/common/js/lottie.min.js>/script>meta namegoogle-signin-client_id content307712042532-qmjcna4bcltnakhdjrbi5tgan9pg5jpu.apps.googleusercontent.com>/head>style>body::after { content: none; } /* Prevent iOS from taking screenshots for startup images */ body { -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } /* 状态栏样式 */ @supports (padding-top: env(safe-area-inset-top)) { body { padding-top: env(safe-area-inset-top); padding-bottom: env(safe-area-inset-bottom); } } /* iOS standalone模式的特殊样式 */ body.standalone-mode, body.ios-standalone { padding-top: env(safe-area-inset-top); padding-bottom: env(safe-area-inset-bottom); } /* PWA添加到主屏幕提示样式 */ .pwa-install-prompt { position: fixed; bottom: 0; left: 0; right: 0; background: linear-gradient(135deg, #0E131B 0%, #1a1a2e 100%); color: #ffffff; padding: 20px; box-shadow: 0 -4px 20px rgba(0, 0, 0, 0.3); z-index: 10000; font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, sans-serif; animation: slideUpFromBottom 0.4s ease-out; border-top-left-radius: 20px; border-top-right-radius: 20px; } @keyframes slideUpFromBottom { from { transform: translateY(100%); opacity: 0; } to { transform: translateY(0); opacity: 1; } } @keyframes slideDownToBottom { from { transform: translateY(0); opacity: 1; } to { transform: translateY(100%); opacity: 0; } }/style>script async srchttps://www.googletagmanager.com/gtag/js?idG-6GDR027JWN>/script>script>window.dataLayer window.dataLayer || ; function gtag() { dataLayer.push(arguments); } gtag(js, new Date()); const hostname location.hostname gtag(config, G-6GDR027JWN, { debug_mode: false, site_name: hostname });/script>script>function addAppDownParameter() { const url new URL(window.location.href); const isStandalone window.navigator.standalone || window.matchMedia((display-mode: standalone)).matches; // 检查是否已经添加了 appDown 参数 if (isStandalone && !url.searchParams.has(appDown)) { url.searchParams.set(appDown, 1); window.location.href url.toString(); // alert(url.toString()) } } // 调用函数 addAppDownParameter(); // 检测是否是iOS设备 const isIOS /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream; // 检测是否是从主屏幕启动的应用 const isStandalone window.navigator.standalone; // 设置全屏模式 function setupFullscreen() { // 如果是iOS设备从主屏幕启动 if (isIOS && isStandalone) { document.body.classList.add(standalone-mode); } // 防止页面滚动和缩放 // document.addEventListener(touchmove, function (e) { // if (e.scale ! 1) { // e.preventDefault(); // } // }, { passive: false }); } // 页面加载完成后执行 window.addEventListener(load, setupFullscreen); window.addEventListener(resize, setupFullscreen); window.addEventListener(orientationchange, setupFullscreen);/script>body>noscript>strong>/strong>/noscript>div idapp>/div>script>/** * PWA管理器 - 内联版本 * 处理PWA相关功能和链接参数保持 */ class PWAManager { constructor() { this.isIOS this.detectIOS() this.isStandalone this.detectStandalone() this.originalParams null this.manifestGenerated false this.storageKey pwa_link_params this.expireTime 30 * 24 * 60 * 60 * 1000 // 30天 this.init() } /** * 初始化PWA管理器 */ init() { console.log(Initializing PWA Manager, { isIOS: this.isIOS, isStandalone: this.isStandalone, }) // 保存当前URL参数 this.saveCurrentParams() // 动态生成manifest this.generateDynamicManifest() // 设置添加到主屏幕的提示 this.setupAddToHomeScreenPrompt() // 处理standalone模式的启动 if (this.isStandalone) { this.handleStandaloneStart() } // 监听beforeinstallprompt事件 this.setupInstallPrompt() } /** * 检测是否为iOS设备 */ detectIOS() { return /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream } /** * 检测是否为standalone模式 */ detectStandalone() { return window.navigator.standalone true || window.matchMedia((display-mode: standalone)).matches } /** * 保存当前URL参数 */ saveCurrentParams() { const url new URL(window.location.href) const params {} // 提取所有URL参数 url.searchParams.forEach((value, key) > { paramskey value }) if (Object.keys(params).length > 0) { this.originalParams params // 保存到localStorage(持久化) this.saveToMultipleStorages(params) console.log(Original params saved:, params) } } /** * 保存到多个存储位置 */ saveToMultipleStorages(params) { const dataToSave { params: params, timestamp: Date.now(), originalUrl: window.location.href, } try { // localStorage localStorage.setItem(this.storageKey, JSON.stringify(dataToSave)) // sessionStorage sessionStorage.setItem(this.storageKey + _session, JSON.stringify(dataToSave)) // Cookie (30天过期) const expires new Date() expires.setTime(expires.getTime() + this.expireTime) document.cookie this.storageKey + + encodeURIComponent(JSON.stringify(dataToSave)) + ; expires + expires.toUTCString() + ; path/; console.log(Params saved to multiple storages, dataToSave) } catch (error) { console.error(Error saving params:, error) } } /** * 从存储中恢复参数 */ restoreParamsFromStorage() { // 尝试从localStorage恢复 let savedData this.getFromStorage(localStorage, this.storageKey) // 如果localStorage没有,尝试sessionStorage if (!savedData) { savedData this.getFromStorage(sessionStorage, this.storageKey + _session) } // 如果还没有,尝试从cookie恢复 if (!savedData) { savedData this.getFromCookie() } if (savedData && savedData.params) { // 检查是否过期 if (Date.now() - savedData.timestamp this.expireTime) { this.applyParamsToURL(savedData.params) return savedData.params } else { console.log(Saved params expired) this.clearAllStorages() } } return null } /** * 从存储获取数据 */ getFromStorage(storage, key) { try { const data storage.getItem(key) return data ? JSON.parse(data) : null } catch (error) { console.error(Error reading from storage:, error) return null } } /** * 从cookie获取数据 */ getFromCookie() { try { const cookies document.cookie.split(;) for (const cookie of cookies) { const name, value cookie.trim().split() if (name this.storageKey) { return JSON.parse(decodeURIComponent(value)) } } } catch (error) { console.error(Error reading from cookie:, error) } return null } /** * 应用参数到当前URL */ applyParamsToURL(params) { const currentUrl new URL(window.location.href) let hasChanges false Object.keys(params).forEach((key) > { if (!currentUrl.searchParams.has(key)) { currentUrl.searchParams.set(key, paramskey) hasChanges true } }) if (hasChanges) { window.history.replaceState({}, , currentUrl.toString()) console.log(URL updated with restored params:, currentUrl.toString()) // 触发自定义事件 window.dispatchEvent( new CustomEvent(pwa-params-restored, { detail: { params, source: storage }, }), ) } } /** * 动态生成manifest文件 */ generateDynamicManifest() { if (this.manifestGenerated) return // 构建start_url,包含当前参数和appDown1 let startUrl / // 创建新的参数对象,appDown1放在最前面 const params { appDown: 1 } // 添加其他原始参数 if (this.originalParams) { Object.keys(this.originalParams).forEach((key) > { if (key ! appDown) { // 避免重复添加appDown paramskey this.originalParamskey } }) } if (Object.keys(params).length > 0) { const paramString new URLSearchParams(params).toString() startUrl /? + paramString } // 创建动态manifest const manifest { name: BET98, short_name: BET98, description: BET98 - Your Gaming Platform, start_url: startUrl, display: standalone, background_color: #0E131B, theme_color: #000000, orientation: portrait, scope: /, icons: { src: ./static/images/advertisement/down.png, sizes: 192x192, type: image/png, }, { src: ./static/images/advertisement/down.png, sizes: 512x512, type: image/png, }, , } // 创建blob URL const manifestBlob new Blob(JSON.stringify(manifest), { type: application/json, }) const manifestURL URL.createObjectURL(manifestBlob) // 更新或创建manifest link let manifestLink document.querySelector(linkrelmanifest) if (!manifestLink) { manifestLink document.createElement(link) manifestLink.rel manifest document.head.appendChild(manifestLink) } manifestLink.href manifestURL console.log(Dynamic manifest generated with start_url:, startUrl) this.manifestGenerated true } /** * 设置添加到主屏幕的提示 */ setupAddToHomeScreenPrompt() { if (!this.isIOS || this.isStandalone) return // 检查是否已经显示过提示 const hasShownPrompt localStorage.getItem(pwa_add_prompt_shown) if (hasShownPrompt) return // 检查是否有参数需要保存,或者当前URL没有appDown参数 const currentUrl new URL(window.location.href) const hasAppDown currentUrl.searchParams.has(appDown) if ((this.originalParams && Object.keys(this.originalParams).length > 0) || !hasAppDown) { // 延迟显示提示 setTimeout(() > { // this.showAddToHomeScreenPrompt() }, 3000) } } /** * 显示添加到主屏幕的提示 */ showAddToHomeScreenPrompt() { // 创建包含appDown1的参数对象,确保appDown1在最前面 const paramsForDisplay { appDown: 1 } // 添加其他原始参数 if (this.originalParams) { Object.keys(this.originalParams).forEach((key) > { if (key ! appDown) { // 避免重复添加appDown paramsForDisplaykey this.originalParamskey } }) } const paramString new URLSearchParams(paramsForDisplay).toString() const promptHTML div idadd-to-homescreen-prompt style + position: fixed; + bottom: 0; + left: 0; + right: 0; + background: linear-gradient(135deg, #0E131B 0%, #1a1a2e 100%); + color: #ffffff; + padding: 20px; + box-shadow: 0 -4px 20px rgba(0,0,0,0.3); + z-index: 10000; + font-family: -apple-system, BlinkMacSystemFont, \Segoe UI\, Roboto, sans-serif; + animation: slideUpFromBottom 0.4s ease-out; + border-top-left-radius: 20px; + border-top-right-radius: 20px; + > + div styletext-align: center; margin-bottom: 15px;> + div stylefont-size: 48px; margin-bottom: 10px;>📱/div> + h3 stylemargin: 0; font-size: 18px; font-weight: bold; color: #ffd700;>添加到主屏幕/h3> + p stylemargin: 5px 0 0 0; font-size: 14px; opacity: 0.8;> + 保持您的专属链接参数 + /p> + /div> + div stylebackground: rgba(255,215,0,0.1); padding: 12px; border-radius: 8px; margin-bottom: 15px;> + p stylemargin: 0; font-size: 12px; line-height: 1.4;> + strong stylecolor: #ffd700;>当前参数:/strong> + paramString + /p> + /div> + div styletext-align: center; margin-bottom: 20px;> + p stylemargin: 0; font-size: 14px; line-height: 1.5;> + 1. 点击底部的分享按钮 span stylefont-size: 20px;>⬆️/span>br> + 2. 选择添加到主屏幕br> + 3. 点击添加完成 + /p> + /div> + div styledisplay: flex; gap: 10px;> + button idadd-prompt-close style + flex: 1; + padding: 12px; + background: transparent; + border: 1px solid #ffd700; + color: #ffd700; + border-radius: 8px; + font-size: 14px; + cursor: pointer; + >稍后/button> + button idadd-prompt-ok style + flex: 1; + padding: 12px; + background: #ffd700; + border: none; + color: #0E131B; + border-radius: 8px; + font-size: 14px; + font-weight: bold; + cursor: pointer; + >知道了/button> + /div> + /div> document.body.insertAdjacentHTML(beforeend, promptHTML) // 绑定事件 document.getElementById(add-prompt-close).onclick () > { this.hideAddToHomeScreenPrompt() } document.getElementById(add-prompt-ok).onclick () > { this.hideAddToHomeScreenPrompt() localStorage.setItem(pwa_add_prompt_shown, true) } // 15秒后自动隐藏 setTimeout(() > { this.hideAddToHomeScreenPrompt() }, 15000) } /** * 隐藏添加到主屏幕的提示 */ hideAddToHomeScreenPrompt() { const prompt document.getElementById(add-to-homescreen-prompt) if (prompt) { prompt.style.animation slideDownToBottom 0.4s ease-in setTimeout(() > { prompt.remove() }, 400) } } /** * 处理standalone模式的启动 */ handleStandaloneStart() { console.log(App started in standalone mode) // 检查当前URL是否包含参数 const currentUrl new URL(window.location.href) const hasCurrentParams currentUrl.searchParams.toString().length > 0 if (!hasCurrentParams) { // 如果当前URL没有参数,尝试从存储中恢复 setTimeout(() > { this.restoreParamsFromStorage() }, 100) } // 标记为standalone访问 localStorage.setItem(pwa_standalone_access, true) localStorage.setItem(pwa_last_standalone_access, Date.now().toString()) } /** * 设置安装提示(Android等) */ setupInstallPrompt() { let deferredPrompt null window.addEventListener(beforeinstallprompt, (e) > { console.log(beforeinstallprompt event fired) e.preventDefault() deferredPrompt e // 显示自定义安装按钮 // this.showInstallButton(deferredPrompt) }) window.addEventListener(appinstalled, (e) > { console.log(PWA was installed) deferredPrompt null }) } /** * 显示安装按钮 */ showInstallButton(deferredPrompt) { // 创建安装按钮 const installButton document.createElement(button) installButton.id pwa-install-button installButton.innerHTML 📱 安装应用 installButton.style.cssText position: fixed; + top: 20px; + right: 20px; + background: #ffd700; + color: #0E131B; + border: none; + padding: 10px 15px; + border-radius: 20px; + font-weight: bold; + z-index: 9999; + box-shadow: 0 2px 10px rgba(0,0,0,0.2); + cursor: pointer; installButton.onclick async () > { if (deferredPrompt) { deferredPrompt.prompt() const { outcome } await deferredPrompt.userChoice console.log(User choice:, outcome) deferredPrompt null installButton.remove() } } document.body.appendChild(installButton) // 5秒后自动隐藏 setTimeout(() > { if (installButton.parentNode) { installButton.remove() } }, 5000) } /** * 获取注册时使用的参数(包含appDown1) */ getRegistrationParams() { const currentUrl new URL(window.location.href) // 创建新的参数对象,appDown1放在最前面 const params { appDown: 1 } // 获取当前URL参数 currentUrl.searchParams.forEach((value, key) > { if (key ! appDown) { // 避免重复添加appDown paramskey value } }) // 如果当前URL没有参数,尝试从存储恢复 if (Object.keys(params).length 1) { // 只有appDown1 const savedData this.getFromStorage(localStorage, this.storageKey) if (savedData && savedData.params) { Object.keys(savedData.params).forEach((key) > { if (key ! appDown) { // 避免重复添加appDown paramskey savedData.paramskey } }) } } console.log(Registration params:, params) return params } /** * 获取当前保存的参数 */ getSavedParams() { try { const saved localStorage.getItem(this.storageKey) return saved ? JSON.parse(saved) : null } catch (error) { console.error(Error getting saved params:, error) return null } } /** * 检查是否为standalone访问 */ isStandaloneAccess() { return localStorage.getItem(pwa_standalone_access) true } /** * 清理存储的参数 */ clearAllStorages() { try { localStorage.removeItem(this.storageKey) sessionStorage.removeItem(this.storageKey + _session) // 清除cookie document.cookie this.storageKey + ; expiresThu, 01 Jan 1970 00:00:00 UTC; path/; console.log(All storages cleared) } catch (error) { console.error(Error clearing storages:, error) } } /** * 手动更新保存的参数 */ updateSavedParams(params) { if (!params || typeof params ! object) { console.warn(Invalid params provided to updateSavedParams:, params) return } this.originalParams params this.saveToMultipleStorages(params) // 重新生成manifest this.manifestGenerated false this.generateDynamicManifest() console.log(PWA params updated:, params) } /** * 获取调试信息 */ getDebugInfo() { return { isIOS: this.isIOS, isStandalone: this.isStandalone, originalParams: this.originalParams, currentURL: window.location.href, savedParams: this.getSavedParams(), registrationParams: this.getRegistrationParams(), } } } /** * iOS快捷方式管理器 - 内联版本 * 专门处理iOS添加到主屏幕的特殊逻辑 */ class IOSShortcutManager { constructor() { this.pwaManager new PWAManager() this.isIOS /iPad|iPhone|iPod/.test(navigator.userAgent) this.isStandalone window.navigator.standalone true this.init() } init() { if (!this.isIOS) return console.log(Initializing iOS Shortcut Manager) // 监听页面加载完成 if (document.readyState loading) { document.addEventListener(DOMContentLoaded, () > { this.handlePageLoad() }) } else { this.handlePageLoad() } // 监听参数恢复事件 window.addEventListener(pwa-params-restored, (e) > { this.handleParamsRestored(e.detail) }) // 监听页面可见性变化 document.addEventListener(visibilitychange, () > { if (!document.hidden) { this.handlePageVisible() } }) } /** * 处理页面加载 */ handlePageLoad() { console.log(iOS page loaded, { isStandalone: this.isStandalone, hasParams: window.location.search.length > 0, }) if (this.isStandalone) { // 从快捷方式启动 this.handleShortcutLaunch() } else { // 普通浏览器访问 this.handleBrowserAccess() } } /** * 处理快捷方式启动 */ handleShortcutLaunch() { console.log(Launched from iOS shortcut) // 添加特殊的CSS类标识 document.body.classList.add(ios-standalone) // 设置状态栏样式 this.setStatusBarStyle() // 检查并恢复参数 setTimeout(() > { this.checkAndRestoreParams() }, 100) } /** * 处理浏览器访问 */ handleBrowserAccess() { console.log(Accessed from iOS browser) // 检查是否应该显示添加到主屏幕的提示 this.checkAddToHomeScreenPrompt() } /** * 设置iOS状态栏样式 */ setStatusBarStyle() { // 设置状态栏为黑色内容(适合浅色背景) let metaTag document.querySelector(metanameapple-mobile-web-app-status-bar-style) if (!metaTag) { metaTag document.createElement(meta) metaTag.name apple-mobile-web-app-status-bar-style document.head.appendChild(metaTag) } metaTag.content black-translucent // 设置视口 let viewportTag document.querySelector(metanameviewport) if (!viewportTag) { viewportTag document.createElement(meta) viewportTag.name viewport document.head.appendChild(viewportTag) } viewportTag.content widthdevice-width, initial-scale1.0, user-scalableno, viewport-fitcover } /** * 检查并恢复参数 */ checkAndRestoreParams() { const currentUrl new URL(window.location.href) const hasCurrentParams currentUrl.searchParams.toString().length > 0 if (!hasCurrentParams) { // 尝试从多个来源恢复参数 this.restoreParamsFromMultipleSources() } else { console.log(Current URL already has params:, currentUrl.search) } } /** * 从多个来源恢复参数 */ restoreParamsFromMultipleSources() { // 1. 从PWAManager恢复 const restoredParams this.pwaManager.restoreParamsFromStorage() if (restoredParams) { console.log(Params restored via PWAManager:, restoredParams) return } // 2. 从sessionStorage恢复 try { const sessionParams sessionStorage.getItem(ios_shortcut_params) if (sessionParams) { const params JSON.parse(sessionParams) this.applyParams(params, sessionStorage) return } } catch (error) { console.error(Error reading from sessionStorage:, error) } // 3. 从cookie恢复 const cookieParams this.getParamsFromCookie() if (cookieParams) { this.applyParams(cookieParams, cookie) return } console.log(No saved params found to restore) } /** * 应用参数到当前URL */ applyParams(params, source) { console.log(Applying params from + source + :, params) const currentUrl new URL(window.location.href) Object.keys(params).forEach((key) > { currentUrl.searchParams.set(key, paramskey) }) // 使用replaceState更新URL window.history.replaceState({}, , currentUrl.toString()) // 触发自定义事件 window.dispatchEvent( new CustomEvent(ios-shortcut-params-applied, { detail: { params, source }, }), ) console.log(URL updated with params:, currentUrl.toString()) } /** * 从cookie获取参数 */ getParamsFromCookie() { try { const cookies document.cookie.split(;) for (const cookie of cookies) { const name, value cookie.trim().split() if (name ios_shortcut_params) { return JSON.parse(decodeURIComponent(value)) } } } catch (error) { console.error(Error reading params from cookie:, error) } return null } /** * 保存参数到多个位置 */ saveParamsToMultipleSources(params) { if (!params || typeof params ! object) { console.warn(Invalid params provided to saveParamsToMultipleSources:, params) return } // 1. 通过PWAManager保存 this.pwaManager.updateSavedParams(params) // 2. 保存到sessionStorage try { sessionStorage.setItem(ios_shortcut_params, JSON.stringify(params)) } catch (error) { console.error(Error saving to sessionStorage:, error) } // 3. 保存到cookie(30天过期) try { const expires new Date() expires.setTime(expires.getTime() + 30 * 24 * 60 * 60 * 1000) document.cookie ios_shortcut_params + encodeURIComponent(JSON.stringify(params)) + ; expires + expires.toUTCString() + ; path/ } catch (error) { console.error(Error saving to cookie:, error) } console.log(Params saved to multiple sources:, params) } /** * 检查添加到主屏幕提示 */ checkAddToHomeScreenPrompt() { // 检查当前URL是否有参数 const currentUrl new URL(window.location.href) const params {} currentUrl.searchParams.forEach((value, key) > { paramskey value }) if (Object.keys(params).length > 0) { // 保存参数到多个位置 this.saveParamsToMultipleSources(params) // PWAManager会处理显示提示 console.log(Parameters saved, PWAManager will handle install prompt) } } /** * 处理参数恢复事件 */ handleParamsRestored(detail) { console.log(iOS shortcut params restored:, detail) // 可以在这里添加额外的处理逻辑 // 比如更新UI、发送分析事件等 } /** * 处理页面可见 */ handlePageVisible() { if (this.isStandalone) { // 从快捷方式返回前台时,重新检查参数 setTimeout(() > { this.checkAndRestoreParams() }, 100) } } /** * 获取注册参数(通过PWAManager) */ getRegistrationParams() { return this.pwaManager.getRegistrationParams() } /** * 获取调试信息 */ getDebugInfo() { return { isIOS: this.isIOS, isStandalone: this.isStandalone, pwaManagerDebug: this.pwaManager.getDebugInfo(), sessionParams: this.getFromSessionStorage(), cookieParams: this.getParamsFromCookie(), } } /** * 从sessionStorage获取参数 */ getFromSessionStorage() { try { const data sessionStorage.getItem(ios_shortcut_params) return data ? JSON.parse(data) : null } catch (error) { console.error(Error reading from sessionStorage:, error) return null } } } // 创建注册助手 class RegistrationHelper { constructor() { this.iosShortcutManager null this.pwaManager null } init(iosShortcutManager) { this.iosShortcutManager iosShortcutManager this.pwaManager iosShortcutManager.pwaManager } /** * 获取注册时需要的所有参数 */ getRegistrationData(formData) { // 获取链接参数(包含appDown1) const linkParams this.iosShortcutManager.getRegistrationParams() // 创建新的注册数据对象,appDown1放在最前面 const registrationData { appDown: 1, // 确保appDown1在最前面 ...formData, // 添加注册时间戳 registrationTimestamp: Date.now(), // 添加访问方式标识 accessMethod: this.getAccessMethod(), // 添加设备信息 deviceInfo: this.getDeviceInfo(), } // 添加其他链接参数(除了appDown) Object.keys(linkParams).forEach((key) > { if (key ! appDown && !registrationData.hasOwnProperty(key)) { registrationDatakey linkParamskey } }) console.log(Complete registration data:, registrationData) return registrationData } /** * 获取访问方式 */ getAccessMethod() { const isIOS /iPad|iPhone|iPod/.test(navigator.userAgent) const isStandalone window.navigator.standalone true || window.matchMedia((display-mode: standalone)).matches if (isIOS && isStandalone) { return ios_shortcut } else if (isIOS) { return ios_browser } else if (isStandalone) { return pwa_standalone } else { return web_browser } } /** * 获取设备信息 */ getDeviceInfo() { return { userAgent: navigator.userAgent, platform: navigator.platform, language: navigator.language, screenWidth: window.screen.width, screenHeight: window.screen.height, viewportWidth: window.innerWidth, viewportHeight: window.innerHeight, pixelRatio: window.devicePixelRatio || 1, timezone: Intl.DateTimeFormat().resolvedOptions().timeZone, } } /** * 发送注册请求 */ async submitRegistration(formData) { try { // 获取完整的注册数据 const registrationData this.getRegistrationData(formData) // 发送注册请求 const response await fetch(/api/auth/register, { method: POST, headers: { Content-Type: application/json, }, body: JSON.stringify(registrationData), }) const result await response.json() if (result.success) { console.log(Registration successful:, result) return result } else { throw new Error(result.message || Registration failed) } } catch (error) { console.error(Registration error:, error) throw error } } /** * 获取调试信息 */ getDebugInfo() { return { iosShortcutManager: this.iosShortcutManager ? this.iosShortcutManager.getDebugInfo() : null, pwaManager: this.pwaManager ? this.pwaManager.getDebugInfo() : null, accessMethod: this.getAccessMethod(), deviceInfo: this.getDeviceInfo(), } } } // 初始化所有管理器 console.log(Initializing PWA managers...) // iOS快捷方式管理器会自动创建PWAManager实例 window.iosShortcutManager new IOSShortcutManager() // 也可以直接访问PWAManager window.pwaManager window.iosShortcutManager.pwaManager // 创建全局注册助手实例 window.registrationHelper new RegistrationHelper() window.registrationHelper.init(window.iosShortcutManager) // 监听参数恢复事件 window.addEventListener(pwa-params-restored, (e) > { console.log(PWA params restored:, e.detail) }) window.addEventListener(ios-shortcut-params-applied, (e) > { console.log(iOS shortcut params applied:, e.detail) }) console.log(PWA managers initialized successfully) // 调试函数 window.debugPWA function () { console.log( PWA Debug Info ) console.log(iOS Shortcut Manager:, window.iosShortcutManager.getDebugInfo()) console.log(PWA Manager:, window.pwaManager.getDebugInfo()) console.log(Registration Helper:, window.registrationHelper.getDebugInfo()) }/script>script>// 定义用于rem计算的基础设计宽度,例如uni-app的750rpx const designBaseWidth 750; // 定义最大内容宽度,这是您希望保留的硬性上限 const maxContentWidthPx 512.1814092953523; function adjustMaxWidth() { const root document.documentElement; const screenWidth window.innerWidth; const screenHeight window.innerHeight; let calculatedPageMaxWidth; // 当屏幕宽度大于750px时,应用最大宽度限制和比例计算 if (screenWidth > designBaseWidth) { // 计算基于屏幕宽度和0.68比例的潜在内容宽度 let potentialWidth screenWidth * 0.68; // 结合所有最大宽度限制: // 1. potentialWidth (screenWidth * 0.68) // 2. maxContentWidthPx (512.1814092953523) // 3. screenHeight * 0.68 (考虑纵横比的限制) calculatedPageMaxWidth Math.min(potentialWidth, maxContentWidthPx, screenHeight * 0.68); } else { // 当屏幕宽度小于或等于750px时,内容完全铺满屏幕 calculatedPageMaxWidth screenWidth; } // 设置 --pageMaxWidth 和 --pageMaxWidth2 为计算出的宽度 root.style.setProperty(--pageMaxWidth, calculatedPageMaxWidth + px); root.style.setProperty(--pageMaxWidth2, calculatedPageMaxWidth + px); // 根据最终确定的内容宽度来计算rem的基准字体大小 // 这样使用rem的元素会根据这个有效的宽度进行缩放 let remFontSize (calculatedPageMaxWidth / designBaseWidth) * 100; root.style.fontSize remFontSize + px; // 计算并设置视口高度单位 (vh) let vh screenHeight * 0.01; // 保持vh的最小限制,如果这是您希望的行为 vh vh 1.5 ? 1.5 : vh; root.style.setProperty(--lobby__vh, vh + px); root.style.setProperty(--lobby__screen-height, screenHeight + px); } adjustMaxWidth(); window.onload function () { adjustMaxWidth(); // 确保图标在页面加载后也被检查 if (typeof ensureFavicon function) { ensureFavicon(); } }; window.onresize adjustMaxWidth; window.addEventListener(orientationchange, adjustMaxWidth);/script>script src/static/js/chunk-vendors.9f0ab423.js>/script>script src/static/js/index.fc397b02.js>/script>/body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]