| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966 |
- // var window.mode_env = 'development';
- window.mode_env = 'production';
- let API_URL=window.themeConfig.api;
- // if (
- // window.location.href.indexOf('localhost') >= 0 ||
- // window.location.href.indexOf('192.168.1.') >= 0 ||
- // window.location.href.indexOf('192.168.11.') >= 0 ||
- // window.location.href.indexOf('10.10.100.') >= 0 ||
- // window.location.href.indexOf('bigwinga.me') >= 0 ||
- // window.location.href.indexOf('thekongfu.com') >= 0 ||
- // window.location.href.indexOf('kysdkllc.com') >= 0
- // ) {
- // window.mode_env = 'development';
- // } else {
- // window.mode_env = 'production';
- // }
- // 初始化 渠道信息
- var SingletonChannelInfo = (function () {
- // 存储单例实例的变量
- var instance;
- // 初始化实例的函数
- function init(newh2, newh3, newh4) {
- var h2 = newh2 || 'h5';
- var h3 = newh3 || 'web';
- var h4 = newh4 || '';
- return {
- // 公有方法和属性
- h2,
- h3,
- h4
- };
- }
- return {
- // 获取单例的实例的方法
- getInstance: function (...args) {
- if (!instance && args.length > 0) {
- instance = init(...args); // 如果实例不存在,创建它
- }
- if (!instance && args.length === 0) {
- instance = init();
- }
- return instance; // 返回单例实例
- }
- };
- })();
- // function getCookie(key) {
- // const cookie = document.cookie;
- // const cookieArr = cookie.split(";");
- // const cookieObj = {};
- // cookieArr.forEach((item) => {
- // const [key, value] = item.split("=");
- // cookieObj[key.trim()] = value;
- // });
- // return key ? cookieObj[key] : cookieObj;
- // }
- window.hasFixexpire = false;
- function getCookie(key) {
- const cookie = document.cookie;
- const cookieArr = cookie.split(';');
- const cookieObj = {};
- cookieArr.forEach(item => {
- const [k, v] = item.split('=');
- const trimmedKey = k ? k.trim() : '';
- const trimmedValue = v ? v.trim() : '';
- if (trimmedKey && trimmedValue) cookieObj[trimmedKey] = trimmedValue;
- });
- if (!window.hasFixexpire) {
- if (cookieObj['winus_uuid']) {
- setCookie('winus_uuid', cookieObj['winus_uuid']);
- }
- if (cookieObj['us_h5_sourceurl_key']) {
- setCookie('us_h5_sourceurl_key', cookieObj['us_h5_sourceurl_key']);
- }
- window.hasFixexpire = true;
- }
- return key ? cookieObj[key] : cookieObj;
- }
- function setCookie(key, value, expires = 365 * 24 * 60 * 60 * 1000) {
- const date = new Date();
- date.setTime(date.getTime() + expires);
- document.cookie = `${key}=${value};path=/;domain=.${window.location.hostname.split('.').slice(-2).join('.')};expires=${date.toUTCString()};SameSite=None;Secure;`;
- }
- function isInApk() {
- if (!window.android) return false;
- if (!window.android?.getDeviceID || !window.android?.saveUserID) return false;
- return true;
- }
- function getSubscriptionInfo() {
- var installed = isPwaInstall();
- var cacheKey = 'submit_subscription_' + udatadict.channel + '_' + udatadict.userid + '_' + installed;
- return localStorage.getItem(cacheKey) === '1';
- }
- function getIsPostData() {
- var installed = isPwaInstall();
- var cacheKey = 'submit_subscription_post_' + udatadict.channel + '_' + udatadict.userid + '_' + installed;
- return localStorage.getItem(cacheKey) === '1';
- }
- function setIsPostData() {
- var installed = isPwaInstall();
- var cacheKey = 'submit_subscription_post_' + udatadict.channel + '_' + udatadict.userid + '_' + installed;
- localStorage.setItem(cacheKey, '1');
- }
- // 获取全局唯一标识
- var getUniqueID = (function () {
- // 缓存全局唯一标识
- let __global_unique_ID;
- // 缓存 promise 避免多次执行
- let promiseInProgress = null;
- return function () {
- if (__global_unique_ID) {
- return Promise.resolve(__global_unique_ID);
- }
- // 如果已经有全局唯一标识, 直接返回
- var cookie_md5_val = getCookie('winus_uuid');
- // if(!cookie_md5_val){
- // cookie_md5_val=getLocalUUID();
- // if(cookie_md5_val){
- // setCookie('winus_uuid', cookie_md5_val, 604800000);
- // }
- // }
- if (cookie_md5_val) {
- __global_unique_ID = cookie_md5_val;
- return Promise.resolve(__global_unique_ID);
- }
- if (promiseInProgress) {
- return promiseInProgress;
- }
- if (isInApk()) {
- // apk 环境下, 直接返回
- promiseInProgress = new Promise(resolve => {
- try {
- // IPA 环境
- if (window?.android?.isIpa) {
- // 确保回调函数在调用 getDeviceID 之前就绑定好
- window.android.deviceIdCallback = function (deviceId) {
- console.log('deviceIdCallback', deviceId);
- // 如果禁止了第三方cookie, 则将全局唯一标识保存到 当前域名下 cookie 中
- if (deviceId) setCookie('winus_uuid', deviceId, 604800000);
- resolve(deviceId);
- };
- window.android.getDeviceID?.();
- return;
- }
- // 普通 APK 环境
- const deviceId = window?.android?.getDeviceID?.();
- if (deviceId) {
- // 如果禁止了第三方cookie, 则将全局唯一标识保存到 当前域名下 cookie 中
- setCookie('winus_uuid', deviceId, 604800000);
- resolve(deviceId);
- }
- } catch (error) {
- console.log(error);
- }
- });
- return promiseInProgress;
- }
- promiseInProgress = new Promise(function (resolve) {
- var iframe = document.createElement('iframe');
- iframe.src = window.location.protocol + '//' + 'cen.greatus777.com' + '/storage';
- // iframe.src = window.location.protocol + '//' + 'dev.winus777.com' + '/storage';
- iframe.style.display = 'none';
- document.body.appendChild(iframe);
- iframe.addEventListener('load', function () {
- iframe.contentWindow.postMessage('getUniqueID', '*');
- });
- function messageHandler(event) {
- if (event && event.data && event.data !== 'undefined') {
- const data = event.data;
- __global_unique_ID = data.md5val;
- // 如果禁止了第三方cookie, 则将全局唯一标识保存到 当前域名下 cookie 中
- setCookie('winus_uuid', __global_unique_ID, 604800000);
- resolve(__global_unique_ID);
- window.removeEventListener('message', messageHandler);
- document.body.removeChild(iframe);
- }
- }
- // 监听 iframe 的消息
- window.addEventListener('message', messageHandler);
- });
- return promiseInProgress;
- };
- })();
- /**
- * 上报订阅信息
- * @param {*} data
- * {
- * userid: 1, // 用户ID
- * result: 1, // 1 接受 2未接受 3 不支持 4 拒绝
- * machineserial 机器码
- * ish5 0:app(w2a),1:h5(pwa)
- * p_source
- * }
- */
- function uploadSubscription(data) {
- if (+data.ish5 !== 0 && +data.ish5 !== 1) return;
- const ajax = new XMLHttpRequest();
- const callback = data.callback;
- ajax.open('POST', API_URL+"/api/upload_subscribe_state", true);
- ajax.setRequestHeader('Content-Type', 'application/json');
- ajax.onreadystatechange = function () {
- if (ajax.readyState === 4 && ajax.status === 200) {
- setIsPostData();
- }
- callback && callback();
- };
- ajax.onerror = function () {
- callback && callback();
- };
- ajax.send(JSON.stringify(data));
- }
- function isIOS() {
- try {
- let u = navigator.userAgent;
- let isIOS = false;
- // 检查是否包含 iPhone, iPad, iPod 或 Mac OS X (通常Safari在iOS上运行)
- if (/(iPhone|iPad|iPod|iOS)/i.test(u)) {
- isIOS = true;
- }
- // 排除 Android,避免误判
- if (u.indexOf('Android') > -1 || u.indexOf('Adr') > -1) {
- isIOS = false;
- }
- return isIOS
- } catch (t) {
- return false
- }
- }
- function openUrlUseSafari(url = "", isNewTab = true, isBFP = true) {
- if (url == null || url === "") url = window.location.href;
- if (global.BFP != null && global.BFP !== "" && isBFP) {
- if (url.indexOf("?") === -1) url += "?bfp=" + global.BFP;
- else url += "&bfp=" + global.BFP;
- }
- if (isIOS()) {
- const safariUrl = url.startsWith('https')
- ? url.replace('https://', 'x-safari-https://')
- : url.replace('http://', 'x-safari-https://');
- if (isNewTab) {
- window.open(safariUrl, '_blank');
- } else {
- window.location.href = safariUrl;
- }
- }
- }
- function openChrome() {
- var url = location.href;
- if (isIOS()) {
- let r = "googlechromes://" + url.replace(/^https?:\/\//, "");
- window.open(r, "_blank");
- } else {
- url = url.replace('https://', '');
- url = url.replace('http://', '');
- var newLink =
- 'intent://' + url + '#Intent;scheme=https;action=android.intent.action.VIEW;component=com.android.chrome;end';
- var a = document.getElementById('pwaIFrame');
- a ||
- (((a = document.createElement('iframe')).id = 'pwaIFrame'),
- (a.style.width = '0'),
- (a.style.height = '0'),
- (a.style.opacity = '0'),
- (a.name = 'pwaIFrame'),
- document.body.appendChild(a)),
- (a.src = newLink);
- }
- setTimeout(() => {
- if (!document.hidden) {
- uploadSubscription({
- userid: udatadict.userid || '',
- result: 3,
- machineserial: udatadict.machineserial,
- ish5: 1,
- p_source: udatadict.channel
- });
- }
- }, 1000);
- document.body.removeEventListener('click', openChrome);
- }
- // 判断是否在 chrome 浏览器中
- function isInChromeBrowser() {
- return /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);
- }
- var pushOfFingerprint = '';
- var udatadict = {};
- var pushLogOpen = true;
- function pushmlog(...args) {
- if (pushLogOpen) {
- console.log('Push log:', ...args);
- }
- }
- function errorpushlog(...args) {
- if (true) {
- console.error('Push error log:', ...args);
- }
- }
- // 将URL Base64编码的字符串转换为Uint8Array
- function urlBase64ToUint8Array(base64String) {
- var padding = '='.repeat((4 - (base64String.length % 4)) % 4);
- var base64 = (base64String + padding).replace(/\-/g, '+').replace(/_/g, '/');
- var rawData = window.atob(base64);
- var outputArray = new Uint8Array(rawData.length);
- for (var i = 0; i < rawData.length; ++i) {
- outputArray[i] = rawData.charCodeAt(i);
- }
- return outputArray;
- }
- // 判断是否在PWA模式下运行
- function isPwaInstall() {
- if (
- window.matchMedia('(display-mode: standalone)').matches ||
- window.navigator.standalone ||
- document.referrer.includes('android-app://')
- ) {
- return 1;
- } else {
- return 0;
- }
- }
- // 获取平台
- function getPlatform() {
- var ua = navigator.userAgent;
- if (ua.match(/Android/i)) {
- return 'Android';
- } else if (ua.match(/iPhone|iPad|iPod/i)) {
- return 'iOS';
- } else {
- return 'Other';
- }
- }
- // 将订阅信息发送到服务器
- function submitSubscription(subscription, channel, userid) {
- // 注意落地页和游戏内的指纹算法保持一致!!!
- var fingerprint = pushOfFingerprint;
- var website = window.location.href;
- // 发送订阅信息到服务器
- // xmlhttprequest
- var xhr = new XMLHttpRequest();
- // 墨西哥订阅地址
- if (window.mode_env === 'development') {
- xhr.open('POST', API_URL+'/api/push_subscribe', true);
- } else {
- xhr.open('POST', API_URL+'/api/push_subscribe', true);
- }
- xhr.setRequestHeader('Content-Type', 'application/json');
- var contentData = {
- fingerprint: fingerprint,
- userid: userid, // 如果有用户登录,可以传用户ID
- subscibe_info: JSON.stringify(subscription),
- channel: channel,
- web_site: website,
- platform: getPlatform(),
- installed: isPwaInstall()
- };
- xhr.onreadystatechange = function () {
- if (xhr.readyState === 4 && xhr.status === 200) {
- pushmlog('Subscription info sent to server:', xhr.responseText);
- var installed = isPwaInstall();
- var cacheKey = 'submit_subscription_' + channel + '_' + userid + '_' + installed;
- localStorage.setItem(cacheKey, '1');
- }
- };
- xhr.onerror = function () {
- errorpushlog('Failed to send subscription info');
- };
- xhr.send(JSON.stringify(contentData));
- }
- // 埋点日志
- function recordEvent(eventName, channel, remark, userid) {
- var info = SingletonChannelInfo.getInstance();
- var h2 = info.h2;
- var h3 = info.h3;
- var h4 = info.h4 || channel;
- var host = 'us_' + h2 + '_' + h3 + '_' + h4;
- var url =
- API_URL+'/api/weblog?host=' + host + '&act=' + eventName + '&remark=' + remark + '&orderid=' + userid;
- var xhr = new XMLHttpRequest();
- xhr.open('GET', url, true);
- xhr.send();
- }
- // 请求用户授权订阅推送通知
- function requestNotificationPermission(registration, channel, userid, machineserial, ish5) {
- // 检查浏览器是否支持Notification API
- if ('Notification' in window) {
- // 请求授权
- Notification.requestPermission().then(function (permission) {
- if (permission === 'granted') {
- pushmlog('User has authorized push notifications');
- // 注册Service Worker
- registration.pushManager
- .subscribe({
- userVisibleOnly: true,
- applicationServerKey: urlBase64ToUint8Array(
- 'BEKE0qlrGMp-XyUHppeFMscDiJg-sL98jr4b51glbvicHnD69oNZ9JiLHKIQ9_3K0ImSZlo0Ggw-RE3FxYOUwJo'
- )
- })
- .then(function (subscription) {
- var saveSubScription = JSON.stringify(subscription);
- localStorage.setItem('subscription', saveSubScription);
- pushmlog('User has subscribed to push notifications:', subscription);
- // 将订阅信息发送到服务器
- submitSubscription(subscription, channel, userid);
- uploadSubscription({
- userid: userid || '',
- result: 1,
- machineserial,
- ish5,
- p_source: channel,
- callback: function () {
- if (+ish5 === 1 || +ish5 === 0) {
- // 如果是H5游戏, 则打开网址
- if (+ish5 === 1) {
- if (udatadict.returnurl) {
- setTimeout(() => {
- location.href = udatadict.returnurl;
- }, 1000);
- }
- } else {
- // 打开游戏
- const div = document.createElement('div');
- div.style =
- 'position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.5); z-index: 9999;';
- div.innerHTML = `<div
- style="padding: 6px 10px; border-radius: 4px; background: rgba(89, 92, 115, 0.65); position: absolute; left: 50%;transform: translateX(-50%); color: #fff;font-size: 14px;top: 10%;">
- Go back to the game
- </div>`;
- document.body.appendChild(div);
- setTimeout(function () {
- document.body.removeChild(div);
- }, 3000);
- }
- }
- }
- });
- });
- recordEvent('push_permission', channel, 'allow', userid);
- } else if (permission === 'denied') {
- pushmlog('User denied push notifications', userid, machineserial, ish5, channel);
- recordEvent('push_permission', channel, 'deny', userid);
- uploadSubscription({
- userid: userid || '',
- result: 4,
- machineserial,
- ish5,
- p_source: channel,
- callback: function () {
- if (+ish5 === 1 || +ish5 === 0) {
- // 如果是H5游戏, 则打开网址
- if (+ish5 === 1) {
- if (udatadict.returnurl) {
- setTimeout(() => {
- location.href = udatadict.returnurl;
- }, 1000);
- }
- } else {
- // 打开游戏
- const div = document.createElement('div');
- div.style =
- 'position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.5); z-index: 9999;';
- div.innerHTML = `<div
- style="padding: 6px 10px; border-radius: 4px; background: rgba(89, 92, 115, 0.65); position: absolute; left: 50%;transform: translateX(-50%); color: #fff;font-size: 14px;top: 10%;">
- Go back to the game
- </div>`;
- document.body.appendChild(div);
- setTimeout(function () {
- document.body.removeChild(div);
- }, 3000);
- }
- }
- }
- });
- } else {
- pushmlog('User has not decided whether to authorize push notifications');
- uploadSubscription({
- userid: userid || '',
- result: 2,
- machineserial,
- ish5,
- p_source: channel,
- callback: function () {
- if (+ish5 === 1 || +ish5 === 0) {
- // 如果是H5游戏, 则打开网址
- if (+ish5 === 1) {
- if (udatadict.returnurl) {
- setTimeout(() => {
- location.href = udatadict.returnurl;
- }, 1000);
- }
- } else {
- // 打开游戏
- const div = document.createElement('div');
- div.style =
- 'position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.5); z-index: 9999;';
- div.innerHTML = `<div
- style="padding: 6px 10px; border-radius: 4px; background: rgba(89, 92, 115, 0.65); position: absolute; left: 50%;transform: translateX(-50%); color: #fff;font-size: 14px;top: 10%;">
- Go back to the game
- </div>`;
- document.body.appendChild(div);
- setTimeout(function () {
- document.body.removeChild(div);
- }, 3000);
- }
- }
- }
- });
- recordEvent('push_permission', channel, 'pending', userid);
- }
- });
- }
- }
- var isCheckingPushPermission = false; // 如果正在检查推送权限, 则不再检查, 避免在未收到结果前再次调用,会有多个订阅上报
- /**
- * 外部调用 检查推送权限
- * @param {string} channel 渠道标识
- * @param {number} userid 用户ID
- * @param {string} machineserial 机器码
- * @param {number} type 0:app(w2a),1:h5(pwa)
- * @param {object} options 其他参数
- * */
- function checkPushPermission(channel, userid, machineserial, type, options) {
- var returnurl = options && options.returnurl;
- var endCallback = options && options.endCallback;
- try {
- if (userid == undefined) {
- userid = 0;
- }
- if (channel == undefined) {
- channel = 'default';
- }
- getUniqueID().then(fingerprint => {
- pushOfFingerprint = fingerprint; // 先记录下来
- // 如果有连续调用, 那么只记录最后一次的 udatadict
- udatadict.userid = userid;
- udatadict.channel = channel;
- udatadict.fingerprint = fingerprint;
- udatadict.machineserial = machineserial;
- udatadict.type = type;
- udatadict.returnurl = returnurl;
- // 保存到 localstorage
- localStorage.setItem('pushudatadict', JSON.stringify(udatadict));
- if ('serviceWorker' in navigator)
- navigator.serviceWorker.ready
- .then(function (registration) {
- if (isCheckingPushPermission) {
- return;
- }
- isCheckingPushPermission = true;
- // 检查是否支持service worker
- if (registration == undefined || registration == null || registration.pushManager == undefined) {
- !isInApk() &&
- setTimeout(() => {
- document.body.addEventListener('click', openChrome);
- }, 500);
- errorpushlog('registration or pushManager is undefined');
- return;
- }
- var installed = isPwaInstall();
- var cacheKey = 'submit_subscription_' + udatadict.channel + '_' + udatadict.userid + '_' + installed;
- registration.pushManager.getSubscription().then(function (subscription) {
- isCheckingPushPermission = false; // 已经有结果了
- if (subscription) {
- var subscriptionOld = localStorage.getItem('subscription');
- endCallback && endCallback('subscription');
- // 用户已经订阅推送通知
- pushmlog('User has already subscribed to push notifications');
- // 判断 当前渠道+当前用户 是否已经上报过授权. 如果未上报过, 则上报一次
- var cacheValue = localStorage.getItem(cacheKey);
- if (cacheValue && subscriptionOld && subscriptionOld == JSON.stringify(subscription)) {
- pushmlog('User has already reported subscription info');
- return;
- }
- recordEvent('push_permission', udatadict.channel, 'update', udatadict.userid);
- localStorage.setItem('subscription', JSON.stringify(subscription)); // 更新
- submitSubscription(subscription, udatadict.channel, udatadict.userid); // 已经授权过就再上报一次 如果未上报
- var ispost = getIsPostData();
- if (!ispost) {
- uploadSubscription({
- userid: udatadict.userid || '',
- result: 1,
- machineserial: udatadict.machineserial,
- ish5: udatadict.type,
- p_source: udatadict.channel
- });
- }
- return;
- } else {
- // 用户尚未订阅推送通知
- pushmlog('User has not yet subscribed to push notifications');
- localStorage.removeItem(cacheKey);
- // 判断 通知状态
- if (Notification.permission === 'denied') {
- endCallback && endCallback('denied');
- var ispost = getIsPostData();
- if (!ispost) {
- uploadSubscription({
- userid: udatadict.userid || '',
- result: 4,
- machineserial: udatadict.machineserial,
- ish5: udatadict.type,
- p_source: udatadict.channel
- });
- }
- pushmlog('User has already denied push notifications');
- } else {
- endCallback && endCallback('pending');
- // 状态是授权或者用户未决定, 但是拿不到订阅信息, 重新请求授权
- requestNotificationPermission(registration, udatadict.channel, udatadict.userid, machineserial, type);
- }
- }
- });
- })
- .catch(e => {
- console.log(e);
- });
- });
- } catch (error) {
- errorpushlog('Failed to check push permission:', error);
- isCheckingPushPermission = false;
- }
- }
- // 外部调用。每次
- function checkAlive(userid, vippoint, channel, score) {
- try {
- if (udatadict.fingerprint == undefined) {
- var udatadictstr = localStorage.getItem('pushudatadict');
- if (udatadictstr) {
- udatadict = JSON.parse(udatadictstr);
- }
- if (udatadict.fingerprint == undefined) {
- errorpushlog('udatadict.fingerprint is undefined');
- return;
- }
- }
- if (userid == undefined) {
- errorpushlog('userid is undefined');
- return;
- }
- // 1 小时最多上报一次
- var isInstalled = isPwaInstall();
- var reportkey = 'lastreporttime_' + userid + '_' + channel + '_' + isInstalled;
- var lastreporttime = localStorage.getItem(reportkey);
- var now = new Date().getTime();
- if (lastreporttime) {
- var last = parseInt(lastreporttime);
- if (now - last < 1000 * 60 * 60) {
- return;
- }
- }
- localStorage.setItem(reportkey, now);
- // 请求用户活跃接口
- var xhr = new XMLHttpRequest();
- xhr.open('POST', 'https://pushme.us3slot77.com/alive', true);
- xhr.setRequestHeader('Content-Type', 'application/json');
- var contentData = {
- userid: userid,
- vippoint: vippoint,
- channel: channel,
- fingerprint: udatadict.fingerprint,
- installed: isInstalled,
- platform: getPlatform(),
- score: score,
- client_active_time: new Date().toISOString()
- };
- xhr.send(JSON.stringify(contentData));
- xhr.onreadystatechange = function () {
- if (xhr.readyState === 4 && xhr.status === 200) {
- pushmlog('User activity info sent to server:', xhr.responseText);
- }
- };
- } catch (error) {
- errorpushlog('Failed to check user activity:', error);
- }
- }
- //简单加密
- const encrypt = (str, pwd) => {
- if (str == '') {
- return '';
- }
- str = encodeURIComponent(str);
- if (!pwd || pwd == '') {
- pwd = 'xbd4jl';
- }
- pwd = encodeURIComponent(pwd);
- if (pwd == '' || pwd.length <= 0) {
- return '';
- }
- var prand = '';
- for (var i = 0, len = pwd.length; i < len; i += 1) {
- prand += pwd.charCodeAt(i).toString();
- }
- var sPos = Math.floor(prand.length / 5);
- var mult = parseInt(prand.charAt(sPos) + prand.charAt(sPos * 2) + prand.charAt(sPos * 3) +
- prand.charAt(sPos * 4) + prand.charAt(sPos * 5));
- var incr = Math.ceil(pwd.length / 2);
- var modu = Math.pow(2, 31) - 1;
- if (mult < 2) {
- return '';
- }
- var salt = Math.round(Math.random() * 1000000000) % 100000000;
- prand += salt;
- while (prand.length > 10) {
- let left = prand;
- let num = 0;
- while (left.length > 0) {
- let temp = parseInt(left.substring(0, 10));
- num = num + temp;
- left = left.substring(10, left.length);
- }
- prand = num.toString();
- }
- prand = (mult * prand + incr) % modu;
- var encChr = '';
- var encStr = '';
- for (var i = 0, len = str.length; i < len; i += 1) {
- encChr = parseInt(str.charCodeAt(i) ^ Math.floor((prand / modu) * 255));
- if (encChr < 16) {
- encStr += '0' + encChr.toString(16);
- } else {
- encStr += encChr.toString(16);
- }
- prand = (mult * prand + incr) % modu;
- }
- salt = salt.toString(16);
- while (salt.length < 8) {
- salt = "0" + salt;
- }
- encStr += salt;
- return encStr;
- }
- //简单解密
- const decrypt = (str, pwd) => {
- if (str == '') {
- return '';
- }
- if (!pwd || pwd == '') {
- pwd = 'xbd4jl';
- }
- pwd = encodeURIComponent(pwd);
- if (str == undefined || str.length < 8) {
- return '';
- }
- if (pwd == undefined || pwd.length <= 0) {
- return '';
- }
- var prand = '';
- for (var i = 0, len = pwd.length; i < len; i += 1) {
- prand += pwd.charCodeAt(i).toString();
- }
- var sPos = Math.floor(prand.length / 5);
- // console.log(prand.length+"sPos____"+sPos+"prand"+prand);
- var mult = parseInt(prand.charAt(sPos) + prand.charAt(sPos * 2) + prand.charAt(sPos * 3) +
- prand.charAt(sPos * 4) + prand.charAt(sPos * 5));
- var incr = Math.round(pwd.length / 2);
- var modu = Math.pow(2, 31) - 1;
- var salt = parseInt(str.substring(str.length - 8, str.length), 16);
- str = str.substring(0, str.length - 8);
- // console.log("prand"+prand);
- prand += salt;
- // console.log("prand"+prand);
- while (prand.length > 10) {
- let left = prand;
- let num = 0;
- while (left.length > 0) {
- let temp = parseInt(left.substring(0, 10));
- num = num + temp;
- left = left.substring(10, left.length);
- }
- prand = num.toString();
- }
- // console.log("prand"+prand);
- prand = (mult * prand + incr) % modu;
- var encChr = '';
- var encStr = '';
- for (var i = 0, len = str.length; i < len; i += 2) {
- encChr = parseInt(parseInt(str.substring(i, i + 2), 16) ^ Math.floor((prand / modu) * 255));
- encStr += String.fromCharCode(encChr);
- prand = (mult * prand + incr) % modu;
- }
- return decodeURIComponent(encStr);
- }
- const LOCAL_VISTOR_ID = "LOCAL_VISTOR_ID";
- const head = "a6072637";
- const isenc = true;
- const localStorageGet = (key, defaultValue = "") => {
- let value = localStorage.getItem(key);
- if (value == null) value = defaultValue;
- else {
- if (value.startsWith(head)) {
- try {
- value = decrypt(value.substring(head.length));
- }
- catch (err) {
- //如果出错返回空
- value = "";
- }
- }
- }
- return value;
- }
- const localStorageSet = (key, value) => {
- if (isenc) {
- if (value != null && value !== "") {
- if (typeof value !== "string") value = value.toString();
- try {
- value = head + encrypt(value);
- }
- catch (err) { }
- }
- }
- localStorage.setItem(key, value);
- }
- const localStorageRemove = (key) => {
- localStorage.removeItem(key);
- }
- const getLocalUUID = () => {
- let bfp=localStorageGet(LOCAL_VISTOR_ID, "");
- if(!bfp){
- localStorageSet(LOCAL_VISTOR_ID, generateUUIDv7());
- bfp=localStorageGet(LOCAL_VISTOR_ID, "")
- }
- return bfp;
- }
- let params={}
- let urlParams=new URLSearchParams(window.location.search)
- for (const [key, value] of urlParams.entries()) {
- params[key] = value
- }
- const LOCAL_ACTIVITY_C = "LOCAL_ACTIVITY_C";
- const DEFAULT_CHANNEL = "100";
- function ProcessChannel() {
- let storedChannel = localStorageGet(LOCAL_ACTIVITY_C, "");
- let channelFromUrl = params["c"] || "";
- let finalChannel = channelFromUrl || storedChannel || DEFAULT_CHANNEL;
- // 保存渠道号(如有变化)
- if (finalChannel && finalChannel !== storedChannel) {
- localStorageSet(LOCAL_ACTIVITY_C, finalChannel);
- }
- window.APKCHSource = finalChannel;
- window.channel = finalChannel;
- }/**
- * 生成 UUID v7 (基于时间排序)
- * 格式: 48位时间戳 | 4位版本(7) | 12位随机数 | 2位变体(10) | 62位随机数
- */
- function generateUUIDv7() {
- const bytes = new Uint8Array(16);
- // 1. 填充随机数 (16 字节)
- crypto.getRandomValues(bytes);
- // 2. 写入 48 位毫秒时间戳 (大端序)
- const now = Date.now();
- bytes[0] = (now / 0x10000000000) & 0xff;
- bytes[1] = (now / 0x100000000) & 0xff;
- bytes[2] = (now / 0x1000000) & 0xff;
- bytes[3] = (now / 0x10000) & 0xff;
- bytes[4] = (now / 0x100) & 0xff;
- bytes[5] = now & 0xff;
- // 3. 设置版本号 (Version 7)
- // 清除前 4 位并设为 0111 (0x70)
- bytes[6] = (bytes[6] & 0x0f) | 0x70;
- // 4. 设置变体号 (Variant 10xx)
- // 清除前 2 位并设为 10 (0x80)
- bytes[8] = (bytes[8] & 0x3f) | 0x80;
- // 5. 转换为 8-4-4-4-12 字符串格式
- return Array.from(bytes)
- .map((b, i) => {
- let s = b.toString(16).padStart(2, '0');
- // 在特定位置添加连字符
- if (i === 3 || i === 5 || i === 7 || i === 9) return s + '-';
- return s;
- })
- .join('');
- }
- if (isIOS()) {
- window.location.href = window.location.origin + '/' + window.location.search;
- }
|