# utm-params-extractor-test 一个功能强大的 UTM 参数提取和浏览器指纹生成库,支持自动上报、跨环境指纹一致性、多种使用方式。 ## ✨ 主要特性 - 🔍 **UTM 参数自动提取** - 支持 utm_source、utm_medium、utm_campaign、utm_term、utm_content - 🌐 **浏览器信息识别** - 自动识别浏览器类型、操作系统、设备类型 - 🎯 **唯一指纹生成** - 基于设备特征生成稳定的浏览器指纹 - 📊 **自动上报功能** - 支持自动/手动数据上报到后端 - 🔄 **跨环境一致性** - 同一设备在不同项目环境下生成相同指纹 - 📱 **多端支持** - 支持 PC、移动端、各种浏览器环境 - 🛠 **灵活配置** - 支持多种使用方式和自定义配置 - 📦 **多模块支持** - 支持 ES6、CommonJS、UMD 等多种模块规范 ## 📦 安装 ```bash # 安装主包 npm install utm-params-extractor-test # 安装依赖(FingerprintJS) npm install @fingerprintjs/fingerprintjs ``` ## 🚀 快速开始 ### 基础用法 ```javascript import UtmTracker from 'utm-params-extractor-test'; // 创建实例 const tracker = new UtmTracker({ reportUrl: 'https://your-api.com/collect', autoSend: false }); // 获取参数 const params = tracker.getParams(); console.log('UTM参数:', params); // 手动上报 tracker.send(); ``` ### 自动上报 ```javascript // 实例化时自动上报 new UtmTracker({ reportUrl: 'https://your-api.com/collect', autoSend: true }); ``` ### 静态方法 ```javascript // 快速获取参数 const params = await UtmTracker.get({ reportUrl: 'https://your-api.com/collect', autoSend: true }); ``` ## 📋 API 文档 ### UtmTracker 构造函数 ```javascript new UtmTracker(config) ``` #### 配置参数 (config) | 参数 | 类型 | 必填 | 默认值 | 说明 | |------|------|------|--------|------| | `reportUrl` | string | ✅ | `''` | 数据上报的接口地址 | | `autoSend` | boolean | ❌ | `true` | 是否在实例化时自动上报 | | `method` | string | ❌ | `'POST'` | 请求方法,支持 'POST' 或 'GET' | | `headers` | object | ❌ | `{ 'Content-Type': 'application/json' }` | 请求头设置 | | `extra` | object | ❌ | `{}` | 额外的自定义参数 | | `onParams` | function | ❌ | `null` | 获取参数后的回调函数 | | `onSend` | function | ❌ | `null` | 发送成功后的回调函数 | | `onError` | function | ❌ | `null` | 发送失败后的回调函数 | ### 实例方法 #### `getParams()` - 同步获取参数 ```javascript const params = tracker.getParams(); ``` 返回当前页面的 UTM 参数和浏览器信息(不包含指纹)。 #### `getParamsAsync()` - 异步获取参数(含指纹) ```javascript const params = await tracker.getParamsAsync(); ``` 返回包含浏览器指纹的完整参数对象。 #### `send(data)` - 发送数据 ```javascript // 发送默认参数 tracker.send(); // 发送自定义数据 tracker.send(customData); ``` ### 静态方法 #### `UtmTracker.get(config)` - 快速获取参数 ```javascript const params = await UtmTracker.get({ reportUrl: 'https://your-api.com/collect', autoSend: true }); ``` #### `UtmTracker.send(data, config)` - 快速发送数据 ```javascript await UtmTracker.send(customData, { reportUrl: 'https://your-api.com/collect' }); ``` ## 📊 返回数据结构 ### 基础参数结构 ```javascript { // UTM 参数 utmSource: "google", // UTM 来源 utmMedium: "cpc", // UTM 媒介 utmCampaign: "summer_sale", // UTM 活动 utmTerm: "shoes", // UTM 关键词 utmContent: "ad1", // UTM 内容 // 页面信息 referrer: "https://www.google.com/", // 来源页面 url: "https://yoursite.com/?utm_source=google", // 当前页面 domain: "yoursite.com", // 当前域名 timestamp: "2024-01-01T12:00:00.000Z", // 时间戳 // 设备信息 isMobile: true, // 是否移动端 browser: "Chrome", // 浏览器类型 browserVersion: "120.0.0.0", // 浏览器版本号 userAgent: "Mozilla/5.0...", // 用户代理 osType: "Android", // 操作系统类型 osVersion: "13", // 操作系统版本 // 指纹信息 fingerprint: "stable_fp_1a2b3c4d5e" // 浏览器唯一指纹 } ``` ### 浏览器类型支持 | 浏览器 | 识别标识 | |--------|----------| | Chrome | `Chrome` | | Safari | `Safari` | | Firefox | `Firefox` | | Edge | `Edge` | | IE | `IE` | | 微信 | `WeChat` | | QQ浏览器 | `QQBrowser` | | UC浏览器 | `UCBrowser` | | 华为浏览器 | `HuaweiBrowser` | | Telegram | `Telegram` | ### 操作系统支持 | 系统 | 识别标识 | 版本获取 | |------|----------|----------| | iOS | `iOS` | ✅ | | Android | `Android` | ✅ | | HarmonyOS | `HarmonyOS` | ✅ | | 其他 | `Unknown` | ❌ | ## 🔧 使用示例 ### Vue.js 项目 ```vue ``` ### React 项目 #### 安装依赖 ```bash npm install utm-params-extractor-test @fingerprintjs/fingerprintjs ``` #### 使用示例 ```jsx import { useEffect, useState } from 'react'; import 'utm-params-extractor-test'; // 引入后会挂载到 window 上 function App() { const [tracker, setTracker] = useState(null); useEffect(() => { // 实例化追踪器,并保存实例到状态 // @ts-ignore const trackerInstance = new window.UtmTracker({ reportUrl: '发送地址', autoSend: false }); // @ts-ignore setTracker(trackerInstance); // 存入实例,而非类本身 console.log('初始化完成:', trackerInstance); }, []); const onClickSend = () => { if (tracker) { // @ts-ignore tracker.send(); // 调用实例方法 } else { console.warn('UtmTracker 尚未初始化'); } }; return (
); } export default App; ``` #### 常见问题解决 **问题1:`UtmTracker is not defined` 或 `is not a constructor` 错误** 如果遇到这些错误,请尝试以下解决方案: ```jsx // 方案1:标准导入(推荐) import UtmTracker from 'utm-params-extractor-test'; // 方案2:如果标准导入失败,使用 require const UtmTracker = require('utm-params-extractor-test'); // 方案3:如果使用 CDN 或全局引入 const UtmTracker = window.UtmTracker; // 方案4:动态导入 import('utm-params-extractor-test').then(module => { const UtmTracker = module.default || module; // 使用 UtmTracker }); // 方案5:检查导入的模块 console.log('UtmTracker:', UtmTracker); console.log('typeof UtmTracker:', typeof UtmTracker); ``` **问题2:FingerprintJS 依赖问题** 确保安装了 FingerprintJS 依赖: ```bash npm install @fingerprintjs/fingerprintjs ``` **问题3:ESLint 配置** 如果 ESLint 报错,可以在 `.eslintrc.js` 中添加: ```javascript module.exports = { globals: { UtmTracker: 'readonly' } }; ``` **问题4:调试导入问题** 如果遇到导入问题,可以添加以下调试代码: ```jsx // 在组件顶部添加调试代码 console.log('=== 调试信息 ==='); console.log('window.UtmTracker:', window.UtmTracker); console.log('typeof window.UtmTracker:', typeof window.UtmTracker); // 尝试不同的导入方式 try { const module = require('utm-params-extractor-test'); console.log('require result:', module); console.log('module.default:', module.default); } catch (e) { console.log('require failed:', e); } try { import('utm-params-extractor-test').then(module => { console.log('dynamic import result:', module); console.log('module.default:', module.default); }); } catch (e) { console.log('dynamic import failed:', e); } ``` ### 普通 JavaScript ```html UTM 参数追踪

UTM 参数追踪



    
    
    


```

## 🎯 浏览器指纹说明

### 指纹生成原理

本库使用两种指纹生成方式:

1. **FingerprintJS 方式**(默认)
   - 使用 FingerprintJS 库生成
   - 基于多种浏览器特征
   - 更准确和稳定

2. **自定义稳定指纹**
   - 基于设备固定特征
   - 确保跨环境一致性
   - 包含屏幕信息、用户代理、时区等

### 指纹特征

指纹生成基于以下稳定特征:
- 屏幕分辨率、颜色深度
- 用户代理字符串(前50字符)
- 时区信息
- 语言设置
- 平台信息
- CPU核心数
- 设备内存
- Canvas指纹
- WebGL渲染器信息

### 指纹存储

- 指纹生成后存储在 `localStorage` 中
- 键名:`fingerprint_id`
- 后续请求优先使用已存储的指纹
- 清除 localStorage 后重新生成

## 🔄 跨环境一致性

### 问题背景

在不同项目环境下,同一设备可能生成不同的指纹ID,影响用户追踪的准确性。

### 解决方案

本库通过以下方式确保跨环境一致性:

1. **使用稳定的设备特征**
   - 避免使用可能变化的特征
   - 对长字符串进行截取,减少细微差异

2. **统一的指纹算法**
   - 相同的哈希算法
   - 相同的特征组合方式

3. **环境无关性**
   - 不依赖域名、路径等环境相关特征
   - 专注于设备本身的稳定特征

### 测试验证

```javascript
// 在项目A中
const trackerA = new UtmTracker({ reportUrl: 'http://localhost:3000/api' });
const paramsA = await trackerA.getParamsAsync();
console.log('项目A指纹:', paramsA.fingerprint);

// 在项目B中(同一设备)
const trackerB = new UtmTracker({ reportUrl: 'http://localhost:3001/api' });
const paramsB = await trackerB.getParamsAsync();
console.log('项目B指纹:', paramsB.fingerprint);

// 两个指纹应该相同
console.log('指纹一致:', paramsA.fingerprint === paramsB.fingerprint);
```

## 🛠 高级配置

### 自定义请求头

```javascript
const tracker = new UtmTracker({
  reportUrl: 'https://your-api.com/collect',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer your-token',
    'X-Custom-Header': 'custom-value'
  }
});
```

### 添加额外参数

```javascript
const tracker = new UtmTracker({
  reportUrl: 'https://your-api.com/collect',
  extra: {
    userId: '12345',
    sessionId: 'abc123',
    customField: 'customValue'
  }
});
```

### 自定义回调处理

```javascript
const tracker = new UtmTracker({
  reportUrl: 'https://your-api.com/collect',
  onParams: (params) => {
    // 参数获取后的处理
    console.log('获取到参数:', params);
    
    // 可以修改参数
    params.customField = 'modified';
    
    // 可以存储到其他地方
    localStorage.setItem('utm_params', JSON.stringify(params));
  },
  onSend: (response, params) => {
    // 发送成功的处理
    console.log('发送成功:', response);
    
    // 可以触发其他操作
    if (response.success) {
      showSuccessMessage('数据上报成功');
    }
  },
  onError: (error, params) => {
    // 发送失败的处理
    console.error('发送失败:', error);
    
    // 可以重试或显示错误信息
    showErrorMessage('数据上报失败,请重试');
  }
});
```

## 🔧 构建和部署

### 开发环境

```bash
# 安装依赖
npm install

# 构建项目
npm run build

# 运行测试
npm test
```

### 生产环境

```bash
# 构建生产版本
npm run build

# 构建后的文件在 dist/ 目录
# - main.js: 主文件
# - main.js.map: 源码映射文件
```

### Webpack 配置

```javascript
// webpack.config.js
module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'main.js',
    path: path.resolve(__dirname, 'dist'),
    library: {
      name: 'UtmTracker',
      type: 'umd',
    },
    globalObject: 'this',
  },
  // ... 其他配置
};
```

## 🐛 常见问题

### Q: 指纹ID在不同环境下不一致怎么办?

**A:** 确保使用相同版本的库,并检查是否有环境特定的配置影响了指纹生成。

### Q: 如何自定义指纹生成算法?

**A:** 可以修改源码中的 `generateStableFingerprint()` 函数,或通过配置参数调整 FingerprintJS 的设置。

### Q: 上报失败如何处理?

**A:** 使用 `onError` 回调函数处理错误,可以实现重试机制或错误提示。

### Q: 如何禁用指纹功能?

**A:** 目前不支持完全禁用指纹功能,但可以通过配置调整指纹生成方式。

### Q: 支持哪些浏览器?

**A:** 支持所有现代浏览器,包括 Chrome、Firefox、Safari、Edge 等,以及移动端浏览器。


**注意:** 使用本库时请遵守相关法律法规和隐私政策,确保用户数据的安全和隐私保护。