|
@@ -1,4 +1,6 @@
|
|
// index.js
|
|
// index.js
|
|
|
|
+import FingerprintJS from '@fingerprintjs/fingerprintjs';
|
|
|
|
+
|
|
(function (factory) {
|
|
(function (factory) {
|
|
if (typeof define === 'function' && define.amd) {
|
|
if (typeof define === 'function' && define.amd) {
|
|
// AMD
|
|
// AMD
|
|
@@ -122,9 +124,17 @@
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- // 获取UTM参数
|
|
|
|
|
|
+ // 集成 FingerprintJS,兼容npm和浏览器全局
|
|
|
|
+ console.log('FingerprintJSLib:', FingerprintJS);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ // 获取UTM参数(同步)
|
|
UtmTracker.prototype.getParams = function () {
|
|
UtmTracker.prototype.getParams = function () {
|
|
const browser = getBrowserInfo()
|
|
const browser = getBrowserInfo()
|
|
|
|
+ let fingerprint = '';
|
|
|
|
+ try {
|
|
|
|
+ fingerprint = localStorage.getItem('fingerprint_id') || '';
|
|
|
|
+ } catch (e) { }
|
|
const params = {
|
|
const params = {
|
|
utmSource: getUrlParam('utm_source') || '',
|
|
utmSource: getUrlParam('utm_source') || '',
|
|
utmMedium: getUrlParam('utm_medium') || '',
|
|
utmMedium: getUrlParam('utm_medium') || '',
|
|
@@ -132,8 +142,10 @@
|
|
utmTerm: getUrlParam('utm_term') || '',
|
|
utmTerm: getUrlParam('utm_term') || '',
|
|
utmContent: getUrlParam('utm_content') || '',
|
|
utmContent: getUrlParam('utm_content') || '',
|
|
referrer: getPreviousUrl() || '',
|
|
referrer: getPreviousUrl() || '',
|
|
|
|
+ fingerprint: fingerprint,
|
|
timestamp: new Date().toISOString(),
|
|
timestamp: new Date().toISOString(),
|
|
url: window.location.href,
|
|
url: window.location.href,
|
|
|
|
+ domain: window.location.hostname,
|
|
isMobile: browser.isMobile,
|
|
isMobile: browser.isMobile,
|
|
browser: browser.browser,
|
|
browser: browser.browser,
|
|
userAgent: browser.userAgent,
|
|
userAgent: browser.userAgent,
|
|
@@ -151,12 +163,47 @@
|
|
return result;
|
|
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 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;
|
|
if (!cfg.reportUrl) return;
|
|
fetch(cfg.reportUrl, {
|
|
fetch(cfg.reportUrl, {
|
|
method: 'POST',
|
|
method: 'POST',
|
|
@@ -167,10 +214,8 @@
|
|
// 假设res为Response对象,需要解析json
|
|
// 假设res为Response对象,需要解析json
|
|
if (typeof res.json === 'function') {
|
|
if (typeof res.json === 'function') {
|
|
res.json().then(data => {
|
|
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') {
|
|
if (data.data.type === 'link') {
|
|
// 倒计时弹窗
|
|
// 倒计时弹窗
|
|
@@ -303,20 +348,35 @@
|
|
};
|
|
};
|
|
|
|
|
|
// 静态方法:快速获取(无需实例化)
|
|
// 静态方法:快速获取(无需实例化)
|
|
- UtmTracker.get = function (config) {
|
|
|
|
|
|
+ UtmTracker.get = async function (config) {
|
|
const tracker = new UtmTracker(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方法
|
|
// 新增静态send方法
|
|
- UtmTracker.send = function (data, config) {
|
|
|
|
|
|
+ UtmTracker.send = async function (data, config) {
|
|
const tracker = new UtmTracker(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;
|
|
return UtmTracker;
|
|
}));
|
|
}));
|