|
@@ -1,4 +1,5 @@
|
|
|
|
|
|
|
|
+import FingerprintJS from '@fingerprintjs/fingerprintjs';
|
|
// 通用 JSBridge
|
|
// 通用 JSBridge
|
|
window.JSBridge = {
|
|
window.JSBridge = {
|
|
getOS: function () {
|
|
getOS: function () {
|
|
@@ -39,6 +40,42 @@ function getUrlParam(name) {
|
|
if (r != null) return decodeURIComponent(r[2]);
|
|
if (r != null) return decodeURIComponent(r[2]);
|
|
return null;
|
|
return null;
|
|
}
|
|
}
|
|
|
|
+ async function getFingerprintId() {
|
|
|
|
+ // 原FingerprintJS方案
|
|
|
|
+ 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({
|
|
|
|
+ // 去掉项目区分和域名区分
|
|
|
|
+ preprocessor: null,
|
|
|
|
+ // 禁用域名相关的指纹组件
|
|
|
|
+ components: {
|
|
|
|
+ domain: false,
|
|
|
|
+ subdomain: false,
|
|
|
|
+ path: false,
|
|
|
|
+ queryKey: false,
|
|
|
|
+ queryValue: false,
|
|
|
|
+ hash: false,
|
|
|
|
+ },
|
|
|
|
+ });
|
|
|
|
+ const result = await fp.get();
|
|
|
|
+ fingerprint = result.visitorId;
|
|
|
|
+ try {
|
|
|
|
+ localStorage.setItem("fingerprint_id", fingerprint);
|
|
|
|
+ } catch (e) {}
|
|
|
|
+ return fingerprint;
|
|
|
|
+ } catch (e) {
|
|
|
|
+ return "";
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ return "";
|
|
|
|
+ }
|
|
|
|
+ }
|
|
function getCookie(name) {
|
|
function getCookie(name) {
|
|
const matches = document.cookie.match(new RegExp(
|
|
const matches = document.cookie.match(new RegExp(
|
|
`(?:^|; )${name.replace(/([.$?*|{}()[]\\\/\+^])/g, '\\$1')}=([^;]*)`
|
|
`(?:^|; )${name.replace(/([.$?*|{}()[]\\\/\+^])/g, '\\$1')}=([^;]*)`
|
|
@@ -127,8 +164,8 @@ function getBrowserInfo() {
|
|
function UtmTracker() {}
|
|
function UtmTracker() {}
|
|
|
|
|
|
// 获取UTM参数
|
|
// 获取UTM参数
|
|
-UtmTracker.prototype.getParams = function() {
|
|
|
|
- return {
|
|
|
|
|
|
+UtmTracker.prototype.getParams = async function() {
|
|
|
|
+ const params = {
|
|
utm_source: getUrlParam('utm_source') || '',
|
|
utm_source: getUrlParam('utm_source') || '',
|
|
utm_medium: getUrlParam('utm_medium') || '',
|
|
utm_medium: getUrlParam('utm_medium') || '',
|
|
utm_campaign: getUrlParam('utm_campaign') || '',
|
|
utm_campaign: getUrlParam('utm_campaign') || '',
|
|
@@ -137,13 +174,15 @@ UtmTracker.prototype.getParams = function() {
|
|
referrer: document.referrer || '',
|
|
referrer: document.referrer || '',
|
|
browser: getBrowserInfo(),
|
|
browser: getBrowserInfo(),
|
|
timestamp: new Date().toISOString(),
|
|
timestamp: new Date().toISOString(),
|
|
- url: window.location.href
|
|
|
|
|
|
+ url: window.location.href,
|
|
};
|
|
};
|
|
|
|
+ params.fingerprint = await getFingerprintId();
|
|
|
|
+ return params;
|
|
};
|
|
};
|
|
|
|
|
|
// 静态方法:快速获取(无需实例化)
|
|
// 静态方法:快速获取(无需实例化)
|
|
-UtmTracker.get = function() {
|
|
|
|
- return new UtmTracker().getParams();
|
|
|
|
|
|
+UtmTracker.get = async function() {
|
|
|
|
+ return await new UtmTracker().getParams();
|
|
};
|
|
};
|
|
|
|
|
|
class Tracker {
|
|
class Tracker {
|
|
@@ -342,8 +381,8 @@ class Tracker {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
_sendDataNow(data, headers = {}) {
|
|
_sendDataNow(data, headers = {}) {
|
|
- this.queueIdleTask(() => {
|
|
|
|
- const UTMP = UtmTracker.get();
|
|
|
|
|
|
+ this.queueIdleTask(async () => {
|
|
|
|
+ const UTMP = await UtmTracker.get();
|
|
const params = {
|
|
const params = {
|
|
...data,
|
|
...data,
|
|
...UTMP,
|
|
...UTMP,
|