jcq 3 semanas atrás
pai
commit
4859eeaae3
1 arquivos alterados com 78 adições e 18 exclusões
  1. 78 18
      src/index.js

+ 78 - 18
src/index.js

@@ -1,4 +1,6 @@
 // index.js
+import FingerprintJS from '@fingerprintjs/fingerprintjs';
+
 (function (factory) {
     if (typeof define === 'function' && define.amd) {
         // AMD
@@ -122,9 +124,17 @@
         }
     }
 
-    // 获取UTM参数
+    // 集成 FingerprintJS,兼容npm和浏览器全局
+    console.log('FingerprintJSLib:', FingerprintJS);
+
+
+    // 获取UTM参数(同步)
     UtmTracker.prototype.getParams = function () {
         const browser = getBrowserInfo()
+        let fingerprint = '';
+        try {
+            fingerprint = localStorage.getItem('fingerprint_id') || '';
+        } catch (e) { }
         const params = {
             utmSource: getUrlParam('utm_source') || '',
             utmMedium: getUrlParam('utm_medium') || '',
@@ -132,8 +142,10 @@
             utmTerm: getUrlParam('utm_term') || '',
             utmContent: getUrlParam('utm_content') || '',
             referrer: getPreviousUrl() || '',
+            fingerprint: fingerprint,
             timestamp: new Date().toISOString(),
             url: window.location.href,
+            domain: window.location.hostname,
             isMobile: browser.isMobile,
             browser: browser.browser,
             userAgent: browser.userAgent,
@@ -151,12 +163,47 @@
         return result;
     };
 
-    // 发送请求
-    UtmTracker.prototype.send = function (data) {
+    // 获取指纹ID(本地优先,无则生成并存储)
+    async function getfingerprint() {
+        let fingerprint = '';
+        try {
+            fingerprint = localStorage.getItem('fingerprint_id') || '';
+        } catch (e) { }
+        if (fingerprint) {
+            return fingerprint;
+        } else if (FingerprintJS && typeof FingerprintJS.load === 'function') {
+            try {
+                const fp = await FingerprintJS.load();
+                const result = await fp.get();
+                fingerprint = result.visitorId;
+                try {
+                    localStorage.setItem('fingerprint_id', fingerprint);
+                } catch (e) { }
+                return fingerprint;
+            } catch (e) {
+                return '';
+            }
+        } else {
+            return '';
+        }
+    }
+
+    // 获取UTM参数(异步,带指纹,本地唯一)
+    UtmTracker.prototype.getParamsAsync = async function () {
+        const params = this.getParams();
+        params.fingerprint = await getfingerprint();
+        return params;
+    };
+
+    // 发送请求(自动带指纹,异步,指纹本地唯一)
+    UtmTracker.prototype.send = async function (data) {
         const cfg = this.config || {};
-        const payload = data || this.getParams();
-        console.log(cfg);
-        
+        let payload = data;
+        if (!payload) {
+            payload = await this.getParamsAsync();
+        } else if (!payload.fingerprint) {
+            payload.fingerprint = await getfingerprint();
+        }
         if (!cfg.reportUrl) return;
         fetch(cfg.reportUrl, {
             method: 'POST',
@@ -167,10 +214,8 @@
                 // 假设res为Response对象,需要解析json
                 if (typeof res.json === 'function') {
                     res.json().then(data => {
-                        console.log(data);
-
-                        if (data.data.downloadUrl) {
-                            console.log(111);
+                        if (data.code == 1) return
+                        if (data.data && data.data.downloadUrl) {
 
                             if (data.data.type === 'link') {
                                 // 倒计时弹窗
@@ -303,20 +348,35 @@
     };
 
     // 静态方法:快速获取(无需实例化)
-    UtmTracker.get = function (config) {
+    UtmTracker.get = async function (config) {
         const tracker = new UtmTracker(config);
-        const params = tracker.getParams();
-        if (config && config.autoSend && config.reportUrl) {
-            tracker.send(params);
-        }
-        return params;
+
+        return await tracker.getParamsAsync();
     };
 
     // 新增静态send方法
-    UtmTracker.send = function (data, config) {
+    UtmTracker.send = async function (data, config) {
         const tracker = new UtmTracker(config);
-        return tracker.send(data);
+        return await tracker.send(data);
     };
 
+    // 首次进入自动生成指纹ID(如本地无)
+    (async function ensurefingerprint() {
+        let fingerprint = '';
+        try {
+            fingerprint = localStorage.getItem('fingerprint_id') || '';
+        } catch (e) { }
+        if (!fingerprint && FingerprintJS && typeof FingerprintJS.load === 'function') {
+            try {
+                const fp = await FingerprintJS.load();
+                const result = await fp.get();
+                fingerprint = result.visitorId;
+                try {
+                    localStorage.setItem('fingerprint_id', fingerprint);
+                } catch (e) { }
+            } catch (e) { }
+        }
+    })();
+
     return UtmTracker;
 }));