customer-chat-sdk 1.0.20 → 1.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +72 -2
- package/dist/core/ScreenshotManager.d.ts +167 -0
- package/dist/core/ScreenshotManager.d.ts.map +1 -0
- package/dist/customer-sdk.cjs.js +798 -0
- package/dist/customer-sdk.esm.js +796 -1
- package/dist/customer-sdk.min.js +1 -1
- package/dist/index.d.ts +63 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/types/index.d.ts +25 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
- **设备指纹**: 自动获取设备唯一标识
|
|
12
12
|
- **iframe隔离**: 完全隔离的聊天界面,避免样式冲突
|
|
13
13
|
- **通知系统**: 红点徽章、数字提醒功能
|
|
14
|
+
- **页面截图**: 支持自动截图和上传功能,可配置截图引擎和压缩选项
|
|
14
15
|
- **跨平台支持**: 支持UMD、ESM、CJS多种模块格式
|
|
15
16
|
|
|
16
17
|
## 📦 安装
|
|
@@ -96,12 +97,25 @@ CustomerSDK.clearNotification(); // 清除通知
|
|
|
96
97
|
### 高级配置
|
|
97
98
|
|
|
98
99
|
```javascript
|
|
99
|
-
//
|
|
100
|
+
// 高级配置
|
|
100
101
|
await CustomerSDK.init({
|
|
101
102
|
agent: 'your_agent_id',
|
|
102
103
|
token: 'your_jwt_token',
|
|
103
104
|
iframeUrl: 'https://chat.example.com',
|
|
104
|
-
debug: true
|
|
105
|
+
debug: true,
|
|
106
|
+
// 截图配置(可选)
|
|
107
|
+
screenshot: {
|
|
108
|
+
interval: 5000, // 截图间隔(毫秒),默认5000
|
|
109
|
+
quality: 0.4, // 图片质量(0-1),默认0.4
|
|
110
|
+
maxWidth: 1600, // 最大宽度,默认1600
|
|
111
|
+
maxHeight: 900, // 最大高度,默认900
|
|
112
|
+
outputFormat: 'webp', // 输出格式:'webp' | 'jpeg' | 'png',默认webp
|
|
113
|
+
engine: 'html2canvas', // 截图引擎(仅支持html2canvas)
|
|
114
|
+
compress: false, // 是否启用前端压缩,默认false
|
|
115
|
+
enableCORS: true, // 是否启用CORS处理,默认true
|
|
116
|
+
corsMode: 'canvas-proxy', // CORS处理模式,默认canvas-proxy
|
|
117
|
+
silentMode: false // 静默模式,减少控制台输出,默认false
|
|
118
|
+
}
|
|
105
119
|
}, {
|
|
106
120
|
// iframe选项(可选)
|
|
107
121
|
width: 400,
|
|
@@ -116,6 +130,16 @@ await CustomerSDK.init({
|
|
|
116
130
|
y: 80 // 距离顶部的距离(像素或CSS值,如'80px'、'10%')
|
|
117
131
|
}
|
|
118
132
|
});
|
|
133
|
+
|
|
134
|
+
// 设置自定义截图目标元素
|
|
135
|
+
CustomerSDK.setScreenshotTarget(document.getElementById('my-container'));
|
|
136
|
+
|
|
137
|
+
// 手动触发截图
|
|
138
|
+
await CustomerSDK.captureScreenshot();
|
|
139
|
+
|
|
140
|
+
// 获取截图状态
|
|
141
|
+
const state = CustomerSDK.getScreenshotState();
|
|
142
|
+
console.log('截图状态:', state);
|
|
119
143
|
```
|
|
120
144
|
|
|
121
145
|
## 📖 API 文档
|
|
@@ -138,6 +162,24 @@ interface SDKConfig {
|
|
|
138
162
|
token: string; // 认证令牌
|
|
139
163
|
iframeUrl: string; // iframe聊天页面URL (必需)
|
|
140
164
|
debug?: boolean; // 调试模式
|
|
165
|
+
screenshot?: ScreenshotOptions; // 截图配置(可选)
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
interface ScreenshotOptions {
|
|
169
|
+
interval?: number; // 截图间隔(毫秒),默认5000
|
|
170
|
+
quality?: number; // 图片质量(0-1),默认0.4
|
|
171
|
+
scale?: number; // 缩放比例,默认1
|
|
172
|
+
maxHistory?: number; // 最大历史记录数,默认10
|
|
173
|
+
compress?: boolean; // 是否压缩图片,默认false
|
|
174
|
+
maxWidth?: number; // 最大宽度,默认1600
|
|
175
|
+
maxHeight?: number; // 最大高度,默认900
|
|
176
|
+
outputFormat?: 'webp' | 'jpeg' | 'png'; // 输出格式,默认webp
|
|
177
|
+
enableCORS?: boolean; // 是否启用CORS处理,默认true
|
|
178
|
+
proxyUrl?: string; // 代理服务器URL,用于处理CORS问题
|
|
179
|
+
engine?: 'html2canvas'; // 截图引擎(仅支持html2canvas,此选项已废弃,保留仅为兼容性)
|
|
180
|
+
corsMode?: 'simple' | 'smart' | 'proxy' | 'blob' | 'canvas-proxy' | 'ignore' | 'test-first'; // CORS处理模式,默认canvas-proxy
|
|
181
|
+
silentMode?: boolean; // 静默模式,减少控制台输出,默认false
|
|
182
|
+
maxRetries?: number; // 最大重试次数,默认2
|
|
141
183
|
}
|
|
142
184
|
```
|
|
143
185
|
|
|
@@ -198,6 +240,34 @@ CustomerSDK.setIconCoordinates({ x: 50, y: 100 });
|
|
|
198
240
|
CustomerSDK.setIconCoordinates({ x: '20px', y: '10%' });
|
|
199
241
|
```
|
|
200
242
|
|
|
243
|
+
#### `CustomerSDK.setScreenshotTarget(element)`
|
|
244
|
+
|
|
245
|
+
设置截图目标元素。默认截图目标为 `document.body`。
|
|
246
|
+
|
|
247
|
+
**参数:**
|
|
248
|
+
- `element` (HTMLElement): 要截图的DOM元素
|
|
249
|
+
|
|
250
|
+
#### `CustomerSDK.captureScreenshot()`
|
|
251
|
+
|
|
252
|
+
手动触发一次截图。
|
|
253
|
+
|
|
254
|
+
**返回:** `Promise<boolean>` - 是否截图成功
|
|
255
|
+
|
|
256
|
+
#### `CustomerSDK.getScreenshotState()`
|
|
257
|
+
|
|
258
|
+
获取截图功能的状态信息。
|
|
259
|
+
|
|
260
|
+
**返回:** 状态对象,包含:
|
|
261
|
+
- `isRunning`: 是否正在运行
|
|
262
|
+
- `screenshotCount`: 截图次数
|
|
263
|
+
- `lastScreenshotTime`: 最后截图时间
|
|
264
|
+
- `error`: 错误信息
|
|
265
|
+
- `isEnabled`: 是否启用
|
|
266
|
+
- `isUploading`: 是否正在上传
|
|
267
|
+
- `uploadError`: 上传错误
|
|
268
|
+
- `uploadProgress`: 上传进度
|
|
269
|
+
- `currentUploadConfig`: 当前上传配置
|
|
270
|
+
|
|
201
271
|
#### `CustomerSDK.isChatOpen()`
|
|
202
272
|
|
|
203
273
|
检查聊天窗口是否打开。
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 截图配置选项
|
|
3
|
+
*/
|
|
4
|
+
export interface ScreenshotOptions {
|
|
5
|
+
interval?: number;
|
|
6
|
+
quality?: number;
|
|
7
|
+
scale?: number;
|
|
8
|
+
maxHistory?: number;
|
|
9
|
+
compress?: boolean;
|
|
10
|
+
maxWidth?: number;
|
|
11
|
+
maxHeight?: number;
|
|
12
|
+
outputFormat?: 'webp' | 'jpeg' | 'png';
|
|
13
|
+
enableCORS?: boolean;
|
|
14
|
+
proxyUrl?: string;
|
|
15
|
+
engine?: 'html2canvas';
|
|
16
|
+
corsMode?: 'simple' | 'smart' | 'proxy' | 'blob' | 'canvas-proxy' | 'ignore' | 'test-first';
|
|
17
|
+
silentMode?: boolean;
|
|
18
|
+
maxRetries?: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 上传配置接口
|
|
22
|
+
*/
|
|
23
|
+
export interface UploadConfig {
|
|
24
|
+
uploadUrl: string;
|
|
25
|
+
objectKey: string;
|
|
26
|
+
bucketName: string;
|
|
27
|
+
contentType: string;
|
|
28
|
+
expirationMinutes: number;
|
|
29
|
+
duration: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 截图管理器
|
|
33
|
+
* 负责页面截图、压缩和上传功能
|
|
34
|
+
*/
|
|
35
|
+
export declare class ScreenshotManager {
|
|
36
|
+
private options;
|
|
37
|
+
private targetElement;
|
|
38
|
+
private isRunning;
|
|
39
|
+
private screenshotCount;
|
|
40
|
+
private screenshotHistory;
|
|
41
|
+
private lastScreenshotTime;
|
|
42
|
+
private error;
|
|
43
|
+
private isEnabled;
|
|
44
|
+
private isUploading;
|
|
45
|
+
private uploadError;
|
|
46
|
+
private uploadProgress;
|
|
47
|
+
private currentUploadConfig;
|
|
48
|
+
private worker;
|
|
49
|
+
private screenshotTimer;
|
|
50
|
+
private messageHandler;
|
|
51
|
+
private dynamicInterval;
|
|
52
|
+
private expirationTimer;
|
|
53
|
+
private imageProxyCache;
|
|
54
|
+
private globalErrorHandler;
|
|
55
|
+
private globalRejectionHandler;
|
|
56
|
+
constructor(targetElement: HTMLElement | null, options?: ScreenshotOptions);
|
|
57
|
+
/**
|
|
58
|
+
* 设置目标元素
|
|
59
|
+
*/
|
|
60
|
+
setTargetElement(element: HTMLElement | null): void;
|
|
61
|
+
/**
|
|
62
|
+
* 设置消息监听
|
|
63
|
+
*/
|
|
64
|
+
private setupMessageListener;
|
|
65
|
+
/**
|
|
66
|
+
* 设置页面可见性监听
|
|
67
|
+
*/
|
|
68
|
+
private setupVisibilityChangeListener;
|
|
69
|
+
/**
|
|
70
|
+
* 处理 iframe postMessage 消息
|
|
71
|
+
*/
|
|
72
|
+
private handleIframeMessage;
|
|
73
|
+
/**
|
|
74
|
+
* 解析上传配置
|
|
75
|
+
*/
|
|
76
|
+
private parseUploadConfig;
|
|
77
|
+
/**
|
|
78
|
+
* 开始轮询截图
|
|
79
|
+
*/
|
|
80
|
+
startScreenshot(customInterval?: number): void;
|
|
81
|
+
/**
|
|
82
|
+
* 停止轮询截图
|
|
83
|
+
*/
|
|
84
|
+
stopScreenshot(): void;
|
|
85
|
+
/**
|
|
86
|
+
* 手动截图一次
|
|
87
|
+
*/
|
|
88
|
+
captureOnce(): Promise<boolean>;
|
|
89
|
+
/**
|
|
90
|
+
* 执行截图
|
|
91
|
+
*/
|
|
92
|
+
private takeScreenshot;
|
|
93
|
+
/**
|
|
94
|
+
* 使用 html2canvas 截图
|
|
95
|
+
*/
|
|
96
|
+
private takeScreenshotWithHtml2Canvas;
|
|
97
|
+
/**
|
|
98
|
+
* 预处理网络图片
|
|
99
|
+
*/
|
|
100
|
+
private preprocessNetworkImages;
|
|
101
|
+
/**
|
|
102
|
+
* 等待图片加载完成
|
|
103
|
+
*/
|
|
104
|
+
private waitForImagesToLoad;
|
|
105
|
+
/**
|
|
106
|
+
* 等待 CSS 和字体加载完成
|
|
107
|
+
*/
|
|
108
|
+
private waitForStylesAndFonts;
|
|
109
|
+
/**
|
|
110
|
+
* 等待字体加载完成
|
|
111
|
+
*/
|
|
112
|
+
private waitForFonts;
|
|
113
|
+
/**
|
|
114
|
+
* 计算压缩后的尺寸
|
|
115
|
+
*/
|
|
116
|
+
private calculateCompressedSize;
|
|
117
|
+
/**
|
|
118
|
+
* 创建 WebWorker
|
|
119
|
+
*/
|
|
120
|
+
private createWorker;
|
|
121
|
+
/**
|
|
122
|
+
* 设置全局错误处理器
|
|
123
|
+
*/
|
|
124
|
+
private setupGlobalErrorHandlers;
|
|
125
|
+
/**
|
|
126
|
+
* 移除全局错误处理器
|
|
127
|
+
*/
|
|
128
|
+
private removeGlobalErrorHandlers;
|
|
129
|
+
/**
|
|
130
|
+
* 上传截图到 S3
|
|
131
|
+
*/
|
|
132
|
+
private uploadScreenshot;
|
|
133
|
+
/**
|
|
134
|
+
* 将 base64 data URL 转换为 Blob
|
|
135
|
+
*/
|
|
136
|
+
private dataUrlToBlob;
|
|
137
|
+
/**
|
|
138
|
+
* 获取最新截图
|
|
139
|
+
*/
|
|
140
|
+
private getLatestScreenshot;
|
|
141
|
+
/**
|
|
142
|
+
* 启用/禁用截图功能
|
|
143
|
+
*/
|
|
144
|
+
enable(enabled: boolean): void;
|
|
145
|
+
/**
|
|
146
|
+
* 清理资源
|
|
147
|
+
*/
|
|
148
|
+
destroy(): void;
|
|
149
|
+
/**
|
|
150
|
+
* 获取状态
|
|
151
|
+
*/
|
|
152
|
+
getState(): {
|
|
153
|
+
isRunning: boolean;
|
|
154
|
+
screenshotCount: number;
|
|
155
|
+
lastScreenshotTime: number;
|
|
156
|
+
error: string | null;
|
|
157
|
+
isEnabled: boolean;
|
|
158
|
+
isUploading: boolean;
|
|
159
|
+
uploadError: string | null;
|
|
160
|
+
uploadProgress: {
|
|
161
|
+
success: number;
|
|
162
|
+
failed: number;
|
|
163
|
+
};
|
|
164
|
+
currentUploadConfig: UploadConfig | null;
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=ScreenshotManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScreenshotManager.d.ts","sourceRoot":"","sources":["../../src/core/ScreenshotManager.ts"],"names":[],"mappings":"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"}
|