转盘抽奖

This commit is contained in:
zhx 2026-05-19 19:51:04 +08:00
parent e4a2f913bb
commit 53fdaa24e8
6 changed files with 131 additions and 4 deletions

View File

@ -33,7 +33,7 @@
<script src="vendor/vue-router.min.js"></script>
<script src="vendor/vue-lazyload.js"></script>
<script src="vendor/svga.lite.min.js"></script>
<script src="js/api_bridge.js?v=2026051508"></script>
<script src="js/api_bridge.js?v=20260519-idempotency"></script>
<script>
_hash = {"arcss":"5ad945a2","arjs":"dfdcd2f3","encss":"f82f3966","enjs":"4449b2e0","idcss":"dd3e2a9c","idjs":"e5c1c281","ptcss":"6bdd5fc3","ptjs":"d65c8bb1","rucss":"32a5b8c8","rujs":"5a9689d5","trcss":"92877d34","trjs":"7bf64c5a","vendorjs":"9d74e93a","vicss":"8395579b","vijs":"295b368f","zhcss":"c8078dd0","zhjs":"3049d299"}
</script>

View File

@ -33,7 +33,7 @@
<script src="vendor/vue-router.min.js"></script>
<script src="vendor/vue-lazyload.js"></script>
<script src="vendor/svga.lite.min.js"></script>
<script src="js/api_bridge.js?v=2026051508"></script>
<script src="js/api_bridge.js?v=20260519-idempotency"></script>
<script>
_hash = {"arcss":"5ad945a2","arjs":"dfdcd2f3","encss":"f82f3966","enjs":"4449b2e0","idcss":"dd3e2a9c","idjs":"e5c1c281","ptcss":"6bdd5fc3","ptjs":"d65c8bb1","rucss":"32a5b8c8","rujs":"5a9689d5","trcss":"92877d34","trjs":"7bf64c5a","vendorjs":"9d74e93a","vicss":"8395579b","vijs":"295b368f","zhcss":"c8078dd0","zhjs":"3049d299"}
</script>

View File

@ -266,6 +266,32 @@
url.searchParams.set(key, value)
}
function hasIdempotencyKey(url) {
return !!(
url.searchParams.get('idempotencyKey') ||
url.searchParams.get('idempotency_key') ||
url.searchParams.get('requestId') ||
url.searchParams.get('request_id') ||
url.searchParams.get('nonce')
)
}
function randomPart() {
try {
if (window.crypto && window.crypto.getRandomValues) {
var values = new Uint32Array(2)
window.crypto.getRandomValues(values)
return values[0].toString(16) + values[1].toString(16)
}
} catch (error) {}
return Math.floor(Math.random() * 0x100000000).toString(16) +
Math.floor(Math.random() * 0x100000000).toString(16)
}
function createIdempotencyKey(activity) {
return ['h5', activity, resolveUID() || 'guest', Date.now(), randomPart()].join('-').slice(0, 128)
}
function isLegacySmashUrl(url) {
return (
url.pathname === '/index.php' &&
@ -280,6 +306,19 @@
)
}
function isSmashDrawUrl(url) {
return (
(url.pathname === '/index.php' && url.searchParams.get('action') === 'Action/TreasureHunt.startHunt') ||
url.pathname === '/app/smash-golden-egg/draw' ||
url.pathname === '/h5/smash-golden-egg/draw'
)
}
function ensureDrawIdempotency(url) {
if (!isSmashDrawUrl(url) || hasIdempotencyKey(url)) return
url.searchParams.set('idempotencyKey', createIdempotencyKey('smash-egg'))
}
function rewriteLegacyActionToSemanticPath(url) {
var action = String(url.searchParams.get('action') || '')
var pathname = legacySemanticRoutes[action]
@ -423,6 +462,7 @@
rewriteSemanticPathToLegacyAction(parsed)
}
replaceQueryPlaceholders(parsed)
ensureDrawIdempotency(parsed)
return gatewayBase + gatewayPrefix + parsed.pathname + parsed.search
}

View File

@ -1 +1 @@
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1,maximum-scale=1,minimum-scale=1"><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><meta name=apple-mobile-web-app-capable content=yes><meta name=apple-mobile-web-app-status-bar-style content=black><title>Yumi</title><link rel=icon href=./src/assets/logoFavicon.ico><link href=/agencypanel/static/css/app.a5e99046d79db05830c062cb43887024.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/agencypanel/static/js/wheel-gateway-api.js?v=20260515-prod-api></script><script type=text/javascript src=/agencypanel/static/js/wheel-target-fix.js?v=20260515-target></script><script type=text/javascript src=/agencypanel/static/js/wheel-tab-filter.js></script><script type=text/javascript src=/agencypanel/static/js/manifest.50b03fb9228447d5e5bd.js></script><script type=text/javascript src=/agencypanel/static/js/vendor.26202bf12488c03c4627.js></script><script type=text/javascript src=/agencypanel/static/js/app.114c97eb0e121b96529d.js></script></body></html>
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1,maximum-scale=1,minimum-scale=1"><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><meta name=apple-mobile-web-app-capable content=yes><meta name=apple-mobile-web-app-status-bar-style content=black><title>Yumi</title><link rel=icon href=./src/assets/logoFavicon.ico><link href=/agencypanel/static/css/app.a5e99046d79db05830c062cb43887024.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/agencypanel/static/js/wheel-gateway-api.js?v=20260519-idempotency></script><script type=text/javascript src=/agencypanel/static/js/wheel-target-fix.js?v=20260515-target></script><script type=text/javascript src=/agencypanel/static/js/wheel-tab-filter.js></script><script type=text/javascript src=/agencypanel/static/js/manifest.50b03fb9228447d5e5bd.js></script><script type=text/javascript src=/agencypanel/static/js/vendor.26202bf12488c03c4627.js></script><script type=text/javascript src=/agencypanel/static/js/app.114c97eb0e121b96529d.js></script></body></html>

View File

@ -1 +1 @@
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1,maximum-scale=1,minimum-scale=1"><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><meta name=apple-mobile-web-app-capable content=yes><meta name=apple-mobile-web-app-status-bar-style content=black><title>Yumi Wheel Local</title><link rel=icon href=./src/assets/logoFavicon.ico><link href=static/css/app.a5e99046d79db05830c062cb43887024.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=static/js/wheel-gateway-api.js?v=20260514-gateway-headers></script><script type=text/javascript src=static/js/wheel-target-fix.js?v=20260515-target></script><script type=text/javascript src=static/js/wheel-tab-filter.js></script><script type=text/javascript src=static/js/manifest.local.js></script><script type=text/javascript src=static/js/vendor.26202bf12488c03c4627.js></script><script type=text/javascript src=static/js/app.114c97eb0e121b96529d.js></script></body></html>
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1,maximum-scale=1,minimum-scale=1"><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><meta name=apple-mobile-web-app-capable content=yes><meta name=apple-mobile-web-app-status-bar-style content=black><title>Yumi Wheel Local</title><link rel=icon href=./src/assets/logoFavicon.ico><link href=static/css/app.a5e99046d79db05830c062cb43887024.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=static/js/wheel-gateway-api.js?v=20260519-idempotency></script><script type=text/javascript src=static/js/wheel-target-fix.js?v=20260515-target></script><script type=text/javascript src=static/js/wheel-tab-filter.js></script><script type=text/javascript src=static/js/manifest.local.js></script><script type=text/javascript src=static/js/vendor.26202bf12488c03c4627.js></script><script type=text/javascript src=static/js/app.114c97eb0e121b96529d.js></script></body></html>

View File

@ -329,6 +329,85 @@
return '';
}
function randomPart() {
try {
if (window.crypto && window.crypto.getRandomValues) {
var values = new Uint32Array(2);
window.crypto.getRandomValues(values);
return values[0].toString(16) + values[1].toString(16);
}
} catch (error) {}
return Math.floor(Math.random() * 0x100000000).toString(16) +
Math.floor(Math.random() * 0x100000000).toString(16);
}
function createIdempotencyKey(activity) {
var uid = String(params._login_uid || params.uid || params.userId || params.loginUid || 'guest').trim();
return ['h5', activity, uid || 'guest', Date.now(), randomPart()].join('-').slice(0, 128);
}
function queryHasIdempotencyKey(url) {
try {
var parsed = new URL(url, window.location.href);
return !!(
parsed.searchParams.get('idempotencyKey') ||
parsed.searchParams.get('idempotency_key') ||
parsed.searchParams.get('requestId') ||
parsed.searchParams.get('request_id') ||
parsed.searchParams.get('nonce')
);
} catch (error) {
return false;
}
}
function bodyHasIdempotencyKey(body) {
if (!body) return false;
if (typeof FormData !== 'undefined' && body instanceof FormData) {
return !!(
body.get('idempotencyKey') ||
body.get('idempotency_key') ||
body.get('requestId') ||
body.get('request_id') ||
body.get('nonce')
);
}
if (typeof URLSearchParams !== 'undefined' && body instanceof URLSearchParams) {
return !!(
body.get('idempotencyKey') ||
body.get('idempotency_key') ||
body.get('requestId') ||
body.get('request_id') ||
body.get('nonce')
);
}
if (typeof body === 'string') {
try {
var payload = JSON.parse(body);
if (payload && typeof payload === 'object') {
return !!(
payload.idempotencyKey ||
payload.idempotency_key ||
payload.requestId ||
payload.request_id ||
payload.nonce
);
}
} catch (error) {}
try {
var params = new URLSearchParams(body);
return !!(
params.get('idempotencyKey') ||
params.get('idempotency_key') ||
params.get('requestId') ||
params.get('request_id') ||
params.get('nonce')
);
} catch (innerError) {}
}
return false;
}
function firstDrawReward(drawResult) {
drawResult = drawResult || {};
if (Array.isArray(drawResult.records) && drawResult.records.length > 0) {
@ -445,6 +524,7 @@
var nextUrl = rewriteUrl(url);
this.__wheelGatewayRequest = nextUrl !== url && isWheelApiPath(originalPath);
this.__wheelGatewayDrawRequest = this.__wheelGatewayRequest && isWheelDrawPath(originalPath);
this.__wheelGatewayUrl = nextUrl;
this.__wheelGatewayHeaders = {};
this.__wheelGatewayHeaderValues = {};
if (this.__wheelGatewayRequest) {
@ -498,6 +578,13 @@
nativeSetRequestHeader.call(this, 'req-version', this.__wheelGatewayHeaderValues['req-version'] || params.reqVersion || defaultReqVersion);
nativeSetRequestHeader.call(this, 'req-zone', resolveReqZone(this.__wheelGatewayHeaderValues['req-zone']));
nativeSetRequestHeader.call(this, 'req-lang', resolveReqLang(this.__wheelGatewayHeaderValues['req-lang']));
if (this.__wheelGatewayDrawRequest &&
!this.__wheelGatewayHeaders['idempotency-key'] &&
!this.__wheelGatewayHeaders['x-idempotency-key'] &&
!queryHasIdempotencyKey(this.__wheelGatewayUrl) &&
!bodyHasIdempotencyKey(arguments[0])) {
nativeSetRequestHeader.call(this, 'Idempotency-Key', createIdempotencyKey('wheel'));
}
if (explicitAuthorization) {
try {
window.sessionStorage.setItem('Authorization', explicitAuthorization);