benchmark-collector 1.0.2 → 1.0.3

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 CHANGED
@@ -130,3 +130,6 @@ npm run build
130
130
  ## License
131
131
 
132
132
  ISC
133
+
134
+
135
+ npx ts-node scripts/collect.ts --task "客服退款" --url "https://im.jinritemai.com/pc_seller_v2/main/workspace?selfId=7620356778903002633" --connect
@@ -7,12 +7,24 @@ function getArg(name, defaultValue) {
7
7
  const idx = args.indexOf(`--${name}`);
8
8
  return idx >= 0 && args[idx + 1] ? args[idx + 1] : defaultValue;
9
9
  }
10
+ function hasFlag(name) {
11
+ return args.includes(`--${name}`);
12
+ }
10
13
  const task = getArg('task', '未命名任务');
11
14
  const url = getArg('url', 'https://www.example.com');
15
+ const chatSelector = getArg('chat-selector', '');
16
+ const noCookie = hasFlag('no-cookie');
12
17
  console.log(`Benchmark 数据采集器`);
13
18
  console.log(` 任务: ${task}`);
14
19
  console.log(` URL: ${url}`);
15
- const collector = new collector_1.BenchmarkCollector(task, url);
20
+ if (chatSelector)
21
+ console.log(` 对话选择器: ${chatSelector}`);
22
+ if (noCookie)
23
+ console.log(` 模式: 跳过 Cookie 注入`);
24
+ const collector = new collector_1.BenchmarkCollector(task, url, 'output', {
25
+ chatSelector: chatSelector || undefined,
26
+ noCookie,
27
+ });
16
28
  collector.start().catch((err) => {
17
29
  console.error('采集出错:', err);
18
30
  process.exit(1);
@@ -16,7 +16,13 @@ export declare class BenchmarkCollector {
16
16
  private processing;
17
17
  private queueDone;
18
18
  private queueDoneResolve;
19
- constructor(task: string, startUrl: string, outputBase?: string);
19
+ private chatSelector?;
20
+ private lastMessageCount;
21
+ private noCookie;
22
+ constructor(task: string, startUrl: string, outputBase?: string, options?: {
23
+ chatSelector?: string;
24
+ noCookie?: boolean;
25
+ });
20
26
  get sessionId(): string;
21
27
  get outputPath(): string;
22
28
  get steps(): StepRecord[];
@@ -37,10 +37,12 @@ exports.BenchmarkCollector = void 0;
37
37
  const playwright_core_1 = require("playwright-core");
38
38
  const fs = __importStar(require("fs"));
39
39
  const path = __importStar(require("path"));
40
+ const cookie_extract_1 = require("./cookie-extract");
40
41
  const dom_capture_1 = require("./dom-capture");
41
42
  const som_annotator_1 = require("./som-annotator");
43
+ const conversation_capture_1 = require("./conversation-capture");
42
44
  class BenchmarkCollector {
43
- constructor(task, startUrl, outputBase = 'output') {
45
+ constructor(task, startUrl, outputBase = 'output', options) {
44
46
  this.task = task;
45
47
  this.startUrl = startUrl;
46
48
  this.stepCounter = 0;
@@ -53,6 +55,11 @@ class BenchmarkCollector {
53
55
  this.processing = false;
54
56
  this.queueDone = Promise.resolve();
55
57
  this.queueDoneResolve = null;
58
+ this.lastMessageCount = 0;
59
+ // 是否跳过 Cookie 注入
60
+ this.noCookie = false;
61
+ this.chatSelector = options?.chatSelector;
62
+ this.noCookie = options?.noCookie ?? false;
56
63
  const safeName = task.replace(/[^\w\u4e00-\u9fff-]/g, '_').replace(/_+/g, '_').substring(0, 50);
57
64
  const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
58
65
  const sessionId = `${safeName}_${timestamp}`;
@@ -91,10 +98,14 @@ class BenchmarkCollector {
91
98
  }
92
99
  catch (_) { } };
93
100
  process.on('exit', exitHandler);
94
- // 优先用系统 Chrome(channel:'chrome'),找不到再回退 Playwright 自带 Chromium
95
101
  // handleSIGINT/SIGTERM/SIGHUP: false — 防止 Playwright 在 Ctrl+C 时自动关闭浏览器
96
102
  // 我们需要先保存 trace.zip,再手动关闭浏览器
97
- const launchOpts = { headless: false, handleSIGINT: false, handleSIGTERM: false, handleSIGHUP: false };
103
+ const launchOpts = {
104
+ headless: false,
105
+ handleSIGINT: false,
106
+ handleSIGTERM: false,
107
+ handleSIGHUP: false,
108
+ };
98
109
  let browser;
99
110
  try {
100
111
  browser = await playwright_core_1.chromium.launch({ ...launchOpts, channel: 'chrome' });
@@ -105,6 +116,23 @@ class BenchmarkCollector {
105
116
  this.context = await browser.newContext({
106
117
  viewport: { width: 1280, height: 720 },
107
118
  });
119
+ // 默认从本地 Chrome 提取 Cookie 注入(除非 --no-cookie)
120
+ if (!this.noCookie) {
121
+ try {
122
+ console.log(` 🍪 从本地 Chrome 提取 Cookie...`);
123
+ const cookies = (0, cookie_extract_1.extractCookiesForUrl)(this.startUrl);
124
+ if (cookies.length > 0) {
125
+ await this.context.addCookies(cookies);
126
+ console.log(` ✅ 已注入 ${cookies.length} 个 Cookie (${new URL(this.startUrl).hostname})`);
127
+ }
128
+ else {
129
+ console.log(` ⚠️ 未找到匹配的 Cookie,将以未登录状态打开`);
130
+ }
131
+ }
132
+ catch (e) {
133
+ console.log(` ⚠️ Cookie 提取失败,将以未登录状态打开: ${e.message?.split('\n')[0] || e}`);
134
+ }
135
+ }
108
136
  await this.context.tracing.start({ screenshots: true, snapshots: true });
109
137
  this.activePage = await this.context.newPage();
110
138
  await this.setupRecording();
@@ -125,6 +153,8 @@ class BenchmarkCollector {
125
153
  await this.waitForQueueDrain();
126
154
  console.log(`\n✅ 采集已启动,请在浏览器中操作`);
127
155
  console.log(` 任务: ${this.task}`);
156
+ if (this.noCookie)
157
+ console.log(` 模式: 无 Cookie(未登录)`);
128
158
  console.log(` 按 Ctrl+C 结束采集(⚠️ 请勿手动关闭浏览器,否则 trace 会丢失)\n`);
129
159
  let browserDisconnected = false;
130
160
  await new Promise((resolve) => {
@@ -370,7 +400,22 @@ class BenchmarkCollector {
370
400
  const somBase64 = await this.cdpEval(cdp, somScript);
371
401
  const somBuffer = Buffer.from(somBase64, 'base64');
372
402
  fs.writeFileSync(path.join(this.stepsDir, somPath), somBuffer);
373
- // 记录
403
+ // 对话采集(有新消息时才保存)
404
+ let conversationField;
405
+ try {
406
+ const convJson = await this.cdpEval(cdp, (0, conversation_capture_1.getConversationScript)(this.chatSelector));
407
+ const convData = JSON.parse(convJson);
408
+ if (convData.messageCount > 0 && convData.messageCount !== this.lastMessageCount) {
409
+ const convPath = `${prefix}_conversation.json`;
410
+ fs.writeFileSync(path.join(this.stepsDir, convPath), JSON.stringify(convData, null, 2));
411
+ conversationField = { messages: convPath };
412
+ this.lastMessageCount = convData.messageCount;
413
+ }
414
+ }
415
+ catch (_) {
416
+ // 对话采集失败不影响主流程
417
+ }
418
+ // ⑥ 记录
374
419
  const step = {
375
420
  stepId,
376
421
  action: {
@@ -386,6 +431,7 @@ class BenchmarkCollector {
386
431
  pageUrl: page.url(),
387
432
  screenshots: { clean: cleanPath, som: somPath },
388
433
  dom: { html: htmlPath, interactiveElements: elementsPath },
434
+ ...(conversationField ? { conversation: conversationField } : {}),
389
435
  };
390
436
  this.session.steps.push(step);
391
437
  this.saveSessionSync();
@@ -412,7 +458,7 @@ class BenchmarkCollector {
412
458
  ]);
413
459
  this.session.endTime = new Date().toISOString();
414
460
  if (!browserDisconnected) {
415
- // 保存 trace(加 10 秒超时)
461
+ // 保存 trace
416
462
  console.log(' ⏳ 保存 trace...');
417
463
  this.session.traceFile = 'trace.zip';
418
464
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"collector.js","sourceRoot":"","sources":["../../src/collector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"collector.js","sourceRoot":"","sources":["../../src/collector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { ChatMessage } from './types';
2
+ /**
3
+ * 生成可通过 CDP Runtime.evaluate 执行的对话采集脚本。
4
+ *
5
+ * 策略:
6
+ * 1. 如果提供了 chatSelector,精确匹配该容器内的消息元素
7
+ * 2. 否则使用启发式规则自动检测常见客服系统的对话 DOM 结构
8
+ *
9
+ * 返回 JSON 字符串: { messageCount: number, messages: ChatMessage[] }
10
+ */
11
+ export declare function getConversationScript(chatSelector?: string): string;
12
+ /** 通过 page.evaluate 采集对话(用于测试等非 codegen 场景) */
13
+ export declare function collectConversation(page: import('playwright-core').Page, chatSelector?: string): Promise<{
14
+ messageCount: number;
15
+ messages: ChatMessage[];
16
+ }>;
17
+ //# sourceMappingURL=conversation-capture.d.ts.map
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getConversationScript = getConversationScript;
4
+ exports.collectConversation = collectConversation;
5
+ /**
6
+ * 生成可通过 CDP Runtime.evaluate 执行的对话采集脚本。
7
+ *
8
+ * 策略:
9
+ * 1. 如果提供了 chatSelector,精确匹配该容器内的消息元素
10
+ * 2. 否则使用启发式规则自动检测常见客服系统的对话 DOM 结构
11
+ *
12
+ * 返回 JSON 字符串: { messageCount: number, messages: ChatMessage[] }
13
+ */
14
+ function getConversationScript(chatSelector) {
15
+ const selectorParam = chatSelector ? JSON.stringify(chatSelector) : 'null';
16
+ return `(() => {
17
+ const chatSelector = ${selectorParam};
18
+
19
+ // ========== 工具函数 ==========
20
+
21
+ /** 获取元素的可见文本(去掉子按钮/链接的独立文本噪音) */
22
+ function getVisibleText(el) {
23
+ const clone = el.cloneNode(true);
24
+ // 移除时间戳子元素(常见模式)
25
+ clone.querySelectorAll('time, [class*="time"], [class*="date"]').forEach(t => t.remove());
26
+ return (clone.textContent || '').trim().replace(/\\s+/g, ' ');
27
+ }
28
+
29
+ /** 从元素中提取时间信息 */
30
+ function extractTimestamp(el) {
31
+ // <time> 标签
32
+ const timeEl = el.querySelector('time');
33
+ if (timeEl) return timeEl.textContent?.trim() || timeEl.getAttribute('datetime') || undefined;
34
+ // class 包含 time/date 的子元素
35
+ const timeSub = el.querySelector('[class*="time"], [class*="date"], [class*="stamp"]');
36
+ if (timeSub) return timeSub.textContent?.trim() || undefined;
37
+ // data-time 属性
38
+ if (el.dataset.time) return el.dataset.time;
39
+ return undefined;
40
+ }
41
+
42
+ /** 根据元素特征判断角色 */
43
+ function detectRole(el) {
44
+ const cls = (el.className || '').toLowerCase();
45
+ const dataRole = (el.dataset.role || el.dataset.type || el.dataset.sender || '').toLowerCase();
46
+ const ariaLabel = (el.getAttribute('aria-label') || '').toLowerCase();
47
+ const all = cls + ' ' + dataRole + ' ' + ariaLabel;
48
+
49
+ // 系统消息
50
+ if (/system|notice|notification|tip|alert|\\binfo\\b/.test(all)) return 'system';
51
+ // 客服/坐席
52
+ if (/agent|operator|staff|service|advisor|support|kefu|坐席|客服/.test(all)) return 'agent';
53
+ // 客户/访客
54
+ if (/customer|visitor|user|guest|self|mine|my|right|send|客户|访客|我/.test(all)) return 'customer';
55
+ // 根据位置启发(右侧通常是自己发的)
56
+ const rect = el.getBoundingClientRect();
57
+ const parentRect = el.parentElement?.getBoundingClientRect();
58
+ if (parentRect && rect.width < parentRect.width * 0.9) {
59
+ const centerX = rect.left + rect.width / 2;
60
+ const parentCenterX = parentRect.left + parentRect.width / 2;
61
+ if (centerX > parentCenterX + 30) return 'customer';
62
+ if (centerX < parentCenterX - 30) return 'agent';
63
+ }
64
+ return 'agent'; // 默认归为客服
65
+ }
66
+
67
+ // ========== 精确模式:用户指定 selector ==========
68
+
69
+ function collectBySelector(selector) {
70
+ const container = document.querySelector(selector);
71
+ if (!container) return [];
72
+ // 在容器内查找消息元素(常见子元素模式)
73
+ const msgSelectors = [
74
+ '[class*="message"]', '[class*="msg"]', '[class*="bubble"]',
75
+ '[class*="chat-item"]', '[class*="dialog"]', '[class*="utterance"]',
76
+ '[data-role]', '[data-type]', '[data-sender]',
77
+ ].join(', ');
78
+ let msgEls = Array.from(container.querySelectorAll(msgSelectors));
79
+ // 如果没匹配到,直接取容器的直接子元素
80
+ if (msgEls.length === 0) {
81
+ msgEls = Array.from(container.children);
82
+ }
83
+ // 过滤掉不可见和太短的
84
+ return msgEls.filter(el => {
85
+ const rect = el.getBoundingClientRect();
86
+ return rect.height > 5 && getVisibleText(el).length > 0;
87
+ });
88
+ }
89
+
90
+ // ========== 启发式模式:自动检测 ==========
91
+
92
+ function collectHeuristic() {
93
+ // 1. 先尝试常见客服系统的容器选择器
94
+ const containerCandidates = [
95
+ // 通用模式
96
+ '[class*="chat-body"]', '[class*="chat-list"]', '[class*="chat-content"]',
97
+ '[class*="message-list"]', '[class*="msg-list"]', '[class*="conversation"]',
98
+ '[class*="dialog-body"]', '[class*="chat-panel"]',
99
+ // 阿里系
100
+ '[class*="chatbox"]', '[class*="im-body"]',
101
+ // Zendesk / LiveChat / Intercom 等
102
+ '[role="log"]', '[aria-label*="chat"]', '[aria-label*="conversation"]',
103
+ '[aria-label*="对话"]', '[aria-label*="聊天"]',
104
+ ];
105
+ for (const sel of containerCandidates) {
106
+ try {
107
+ const container = document.querySelector(sel);
108
+ if (!container) continue;
109
+ const msgs = collectBySelector(sel);
110
+ if (msgs.length >= 2) return msgs;
111
+ } catch (_) {}
112
+ }
113
+
114
+ // 2. 查找页面中包含最多 "message" 类子元素的容器
115
+ const allMsgLike = document.querySelectorAll(
116
+ '[class*="message"], [class*="msg"], [class*="bubble"], [class*="utterance"]'
117
+ );
118
+ if (allMsgLike.length >= 2) {
119
+ return Array.from(allMsgLike).filter(el => {
120
+ const rect = el.getBoundingClientRect();
121
+ return rect.height > 5 && getVisibleText(el).length > 0;
122
+ });
123
+ }
124
+
125
+ return [];
126
+ }
127
+
128
+ // ========== 主逻辑 ==========
129
+
130
+ const msgElements = chatSelector ? collectBySelector(chatSelector) : collectHeuristic();
131
+
132
+ const messages = msgElements.map(el => ({
133
+ role: detectRole(el),
134
+ content: getVisibleText(el),
135
+ timestamp: extractTimestamp(el) || undefined,
136
+ })).filter(m => m.content.length > 0);
137
+
138
+ return JSON.stringify({ messageCount: messages.length, messages });
139
+ })()`;
140
+ }
141
+ /** 通过 page.evaluate 采集对话(用于测试等非 codegen 场景) */
142
+ async function collectConversation(page, chatSelector) {
143
+ const script = getConversationScript(chatSelector);
144
+ const result = await page.evaluate(script);
145
+ const parsed = typeof result === 'string' ? JSON.parse(result) : result;
146
+ return parsed;
147
+ }
148
+ //# sourceMappingURL=conversation-capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-capture.js","sourceRoot":"","sources":["../../src/conversation-capture.ts"],"names":[],"mappings":";;AAWA,sDA8HC;AAGD,kDAQC;AAlJD;;;;;;;;GAQG;AACH,SAAgB,qBAAqB,CAAC,YAAqB;IACzD,MAAM,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC3E,OAAO;yBACgB,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA0HjC,CAAC;AACN,CAAC;AAED,+CAA+C;AACxC,KAAK,UAAU,mBAAmB,CACvC,IAAoC,EACpC,YAAqB;IAErB,MAAM,MAAM,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;IACnD,MAAM,MAAM,GAAY,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACxE,OAAO,MAA2D,CAAC;AACrE,CAAC"}
@@ -0,0 +1,16 @@
1
+ interface ChromeCookie {
2
+ name: string;
3
+ value: string;
4
+ domain: string;
5
+ path: string;
6
+ expires: number;
7
+ httpOnly: boolean;
8
+ secure: boolean;
9
+ sameSite: 'Strict' | 'Lax' | 'None';
10
+ }
11
+ /**
12
+ * 从本地 Chrome 提取并解密指定 URL 对应的 Cookie。
13
+ */
14
+ export declare function extractCookiesForUrl(url: string): ChromeCookie[];
15
+ export {};
16
+ //# sourceMappingURL=cookie-extract.d.ts.map
@@ -0,0 +1,419 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.extractCookiesForUrl = extractCookiesForUrl;
37
+ /**
38
+ * 从本地 Chrome Cookies 数据库按域名提取并解密 Cookie。
39
+ * macOS: 使用 Python + Keychain + openssl 完成解密。
40
+ * Windows: 使用 Python + DPAPI + AES-256-GCM 完成解密。
41
+ * Linux: 使用 Python + Secret Service / PBKDF2 + AES-128-CBC 完成解密。
42
+ */
43
+ const child_process_1 = require("child_process");
44
+ const fs = __importStar(require("fs"));
45
+ const os = __importStar(require("os"));
46
+ const path = __importStar(require("path"));
47
+ /** 从 URL 中提取需要匹配的域名列表 */
48
+ function getDomainsForUrl(url) {
49
+ try {
50
+ const hostname = new URL(url).hostname;
51
+ const domains = [hostname, `.${hostname}`];
52
+ const parts = hostname.split('.');
53
+ for (let i = 1; i < parts.length - 1; i++) {
54
+ domains.push('.' + parts.slice(i).join('.'));
55
+ }
56
+ return domains;
57
+ }
58
+ catch {
59
+ return [];
60
+ }
61
+ }
62
+ function getCookiesDbPath() {
63
+ const home = os.homedir();
64
+ const platform = os.platform();
65
+ if (platform === 'darwin') {
66
+ return path.join(home, 'Library', 'Application Support', 'Google', 'Chrome', 'Default', 'Cookies');
67
+ }
68
+ else if (platform === 'win32') {
69
+ return path.join(process.env['LOCALAPPDATA'] || path.join(home, 'AppData', 'Local'), 'Google', 'Chrome', 'User Data', 'Default', 'Cookies');
70
+ }
71
+ else {
72
+ return path.join(home, '.config', 'google-chrome', 'Default', 'Cookies');
73
+ }
74
+ }
75
+ /**
76
+ * Python 脚本:读取 Chrome Cookies → 解密 → 输出 JSON
77
+ * 自动检测平台,使用对应的解密方式:
78
+ * - macOS: Keychain + PBKDF2 + AES-128-CBC
79
+ * - Windows: Local State + DPAPI + AES-256-GCM
80
+ * - Linux: Secret Service / hardcoded key + PBKDF2 + AES-128-CBC
81
+ */
82
+ function buildPythonScript(dbPath, domains) {
83
+ const domainList = domains.map(d => JSON.stringify(d)).join(', ');
84
+ // Windows 需要 Local State 路径来获取加密密钥
85
+ const localStatePath = os.platform() === 'win32'
86
+ ? path.join(path.dirname(path.dirname(dbPath)), 'Local State')
87
+ : '';
88
+ return `# -*- coding: utf-8 -*-
89
+ import sqlite3, json, sys, os, subprocess, hashlib, base64, platform
90
+
91
+ db_path = ${JSON.stringify(dbPath)}
92
+ domains = [${domainList}]
93
+ local_state_path = ${JSON.stringify(localStatePath)}
94
+ current_platform = platform.system()
95
+
96
+ # ========== macOS 解密 ==========
97
+ def get_mac_key():
98
+ password = subprocess.check_output(
99
+ ['security', 'find-generic-password', '-s', 'Chrome Safe Storage', '-w'],
100
+ stderr=subprocess.DEVNULL
101
+ ).decode().strip()
102
+ return hashlib.pbkdf2_hmac('sha1', password.encode(), b'saltysalt', 1003, dklen=16)
103
+
104
+ def decrypt_mac(encrypted_value, key_hex):
105
+ if not encrypted_value or len(encrypted_value) < 4:
106
+ return ''
107
+ if encrypted_value[:3] != b'v10':
108
+ return encrypted_value.decode('utf-8', errors='replace')
109
+ data = encrypted_value[3:]
110
+ if len(data) == 0 or len(data) % 16 != 0:
111
+ return ''
112
+ iv_hex = '20' * 16
113
+ data_b64 = base64.b64encode(data).decode()
114
+ try:
115
+ result = subprocess.check_output(
116
+ ['openssl', 'enc', '-aes-128-cbc', '-d', '-A', '-nopad',
117
+ '-base64', '-K', key_hex, '-iv', iv_hex],
118
+ input=data_b64.encode(), stderr=subprocess.DEVNULL
119
+ )
120
+ pad = result[-1]
121
+ if 1 <= pad <= 16:
122
+ result = result[:-pad]
123
+ # Chrome prefixes a 32-byte hash before the actual value
124
+ if len(result) > 32:
125
+ return result[32:].decode('utf-8', errors='replace')
126
+ return result.decode('utf-8', errors='replace')
127
+ except:
128
+ return ''
129
+
130
+ # ========== Windows 解密 ==========
131
+ def get_win_key():
132
+ """从 Local State 读取加密密钥,用 DPAPI 解密"""
133
+ import ctypes
134
+ import ctypes.wintypes
135
+
136
+ with open(local_state_path, 'r', encoding='utf-8') as f:
137
+ local_state = json.load(f)
138
+ encrypted_key_b64 = local_state['os_crypt']['encrypted_key']
139
+ encrypted_key = base64.b64decode(encrypted_key_b64)
140
+ # 去掉 "DPAPI" 前缀 (5 bytes)
141
+ encrypted_key = encrypted_key[5:]
142
+
143
+ # 调用 Windows DPAPI CryptUnprotectData
144
+ class DATA_BLOB(ctypes.Structure):
145
+ _fields_ = [('cbData', ctypes.wintypes.DWORD),
146
+ ('pbData', ctypes.POINTER(ctypes.c_char))]
147
+
148
+ p = ctypes.create_string_buffer(encrypted_key, len(encrypted_key))
149
+ blob_in = DATA_BLOB(len(encrypted_key), p)
150
+ blob_out = DATA_BLOB()
151
+ ret = ctypes.windll.crypt32.CryptUnprotectData(
152
+ ctypes.byref(blob_in), None, None, None, None, 0, ctypes.byref(blob_out)
153
+ )
154
+ if not ret:
155
+ raise RuntimeError('DPAPI CryptUnprotectData failed')
156
+ key = ctypes.string_at(blob_out.pbData, blob_out.cbData)
157
+ ctypes.windll.kernel32.LocalFree(blob_out.pbData)
158
+ return key
159
+
160
+ def decrypt_win(encrypted_value, key):
161
+ """Windows Chrome v10 格式: v10 + 12-byte nonce + ciphertext + 16-byte tag → AES-256-GCM"""
162
+ if not encrypted_value or len(encrypted_value) < 4:
163
+ return ''
164
+ prefix = encrypted_value[:3]
165
+ if prefix != b'v10':
166
+ # 旧版 Chrome 未加密或使用 DPAPI 直接加密
167
+ try:
168
+ import ctypes, ctypes.wintypes
169
+ class DATA_BLOB(ctypes.Structure):
170
+ _fields_ = [('cbData', ctypes.wintypes.DWORD),
171
+ ('pbData', ctypes.POINTER(ctypes.c_char))]
172
+ p = ctypes.create_string_buffer(encrypted_value, len(encrypted_value))
173
+ blob_in = DATA_BLOB(len(encrypted_value), p)
174
+ blob_out = DATA_BLOB()
175
+ ret = ctypes.windll.crypt32.CryptUnprotectData(
176
+ ctypes.byref(blob_in), None, None, None, None, 0, ctypes.byref(blob_out)
177
+ )
178
+ if ret:
179
+ result = ctypes.string_at(blob_out.pbData, blob_out.cbData)
180
+ ctypes.windll.kernel32.LocalFree(blob_out.pbData)
181
+ return result.decode('utf-8', errors='replace')
182
+ except:
183
+ pass
184
+ return encrypted_value.decode('utf-8', errors='replace')
185
+
186
+ data = encrypted_value[3:]
187
+ nonce = data[:12]
188
+ ciphertext_with_tag = data[12:]
189
+ # 最后 16 字节是 GCM auth tag
190
+ ciphertext = ciphertext_with_tag[:-16]
191
+ tag = ciphertext_with_tag[-16:]
192
+
193
+ # 使用 Python 内置 AES-GCM (Python 3.6+ 通过 cryptography 或 3.11+ 原生不支持, 用 ctypes/openssl)
194
+ try:
195
+ # 优先用 cryptography 库
196
+ from cryptography.hazmat.primitives.ciphers.aead import AESGCM
197
+ aesgcm = AESGCM(key)
198
+ plaintext = aesgcm.decrypt(nonce, ciphertext_with_tag, None)
199
+ return plaintext.decode('utf-8', errors='replace')
200
+ except ImportError:
201
+ pass
202
+
203
+ # 回退: 用 subprocess 调用 openssl (Windows 上可能没有 openssl)
204
+ try:
205
+ import tempfile
206
+ # openssl aes-256-gcm 不直接支持命令行解密,改用 Python ctypes 调 bcrypt
207
+ return _decrypt_win_bcrypt(key, nonce, ciphertext, tag)
208
+ except:
209
+ return ''
210
+
211
+ def _decrypt_win_bcrypt(key, nonce, ciphertext, tag):
212
+ """使用 Windows BCrypt API 进行 AES-256-GCM 解密(无需第三方库)"""
213
+ import ctypes
214
+ from ctypes import wintypes
215
+
216
+ bcrypt = ctypes.windll.bcrypt
217
+
218
+ BCRYPT_AES_ALGORITHM = 'AES'
219
+ BCRYPT_CHAINING_MODE = 'ChainingMode'
220
+ BCRYPT_CHAIN_MODE_GCM = 'ChainingModeGCM'
221
+ BCRYPT_AUTH_TAG_LENGTH = 'AuthTagLength'
222
+
223
+ class BCRYPT_AUTH_TAG_LENGTHS_STRUCT(ctypes.Structure):
224
+ _fields_ = [('dwMinLength', wintypes.ULONG),
225
+ ('dwMaxLength', wintypes.ULONG),
226
+ ('dwIncrement', wintypes.ULONG)]
227
+
228
+ class BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO(ctypes.Structure):
229
+ _fields_ = [
230
+ ('cbSize', wintypes.ULONG),
231
+ ('dwInfoVersion', wintypes.ULONG),
232
+ ('pbNonce', ctypes.c_void_p),
233
+ ('cbNonce', wintypes.ULONG),
234
+ ('pbAuthData', ctypes.c_void_p),
235
+ ('cbAuthData', wintypes.ULONG),
236
+ ('pbTag', ctypes.c_void_p),
237
+ ('cbTag', wintypes.ULONG),
238
+ ('pbMacContext', ctypes.c_void_p),
239
+ ('cbMacContext', wintypes.ULONG),
240
+ ('cbAAD', wintypes.ULONG),
241
+ ('cbData', ctypes.c_ulonglong),
242
+ ('dwFlags', wintypes.ULONG),
243
+ ]
244
+
245
+ hAlg = ctypes.c_void_p()
246
+ bcrypt.BCryptOpenAlgorithmProvider(ctypes.byref(hAlg), BCRYPT_AES_ALGORITHM, None, 0)
247
+
248
+ mode = ctypes.create_unicode_buffer(BCRYPT_CHAIN_MODE_GCM)
249
+ bcrypt.BCryptSetProperty(hAlg, BCRYPT_CHAINING_MODE, mode, len(BCRYPT_CHAIN_MODE_GCM) * 2, 0)
250
+
251
+ hKey = ctypes.c_void_p()
252
+ key_buf = ctypes.create_string_buffer(key)
253
+ bcrypt.BCryptGenerateSymmetricKey(hAlg, ctypes.byref(hKey), None, 0, key_buf, len(key), 0)
254
+
255
+ nonce_buf = ctypes.create_string_buffer(nonce)
256
+ tag_buf = ctypes.create_string_buffer(tag)
257
+ ct_buf = ctypes.create_string_buffer(ciphertext)
258
+ pt_buf = ctypes.create_string_buffer(len(ciphertext))
259
+
260
+ auth_info = BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO()
261
+ auth_info.cbSize = ctypes.sizeof(auth_info)
262
+ auth_info.dwInfoVersion = 1
263
+ auth_info.pbNonce = ctypes.cast(nonce_buf, ctypes.c_void_p)
264
+ auth_info.cbNonce = len(nonce)
265
+ auth_info.pbAuthData = None
266
+ auth_info.cbAuthData = 0
267
+ auth_info.pbTag = ctypes.cast(tag_buf, ctypes.c_void_p)
268
+ auth_info.cbTag = len(tag)
269
+
270
+ cbResult = wintypes.ULONG()
271
+ status = bcrypt.BCryptDecrypt(
272
+ hKey, ct_buf, len(ciphertext),
273
+ ctypes.byref(auth_info),
274
+ None, 0,
275
+ pt_buf, len(ciphertext),
276
+ ctypes.byref(cbResult), 0
277
+ )
278
+
279
+ bcrypt.BCryptDestroyKey(hKey)
280
+ bcrypt.BCryptCloseAlgorithmProvider(hAlg, 0)
281
+
282
+ if status != 0:
283
+ raise RuntimeError(f'BCryptDecrypt failed: 0x{status:08x}')
284
+ return pt_buf.raw[:cbResult.value].decode('utf-8', errors='replace')
285
+
286
+ # ========== Linux 解密 ==========
287
+ def get_linux_key():
288
+ """Linux 上 Chrome 用 PBKDF2,密码来自 Secret Service 或硬编码 'peanuts'"""
289
+ password = 'peanuts'
290
+ try:
291
+ import secretstorage
292
+ bus = secretstorage.dbus_init()
293
+ collection = secretstorage.get_default_collection(bus)
294
+ for item in collection.get_all_items():
295
+ if item.get_label() == 'Chrome Safe Storage':
296
+ password = item.get_secret().decode()
297
+ break
298
+ except:
299
+ pass
300
+ return hashlib.pbkdf2_hmac('sha1', password.encode(), b'saltysalt', 1, dklen=16)
301
+
302
+ def decrypt_linux(encrypted_value, key_hex):
303
+ """Linux 和 macOS 同样是 v10 + AES-128-CBC,但 iterations=1"""
304
+ if not encrypted_value or len(encrypted_value) < 4:
305
+ return ''
306
+ if encrypted_value[:3] != b'v10':
307
+ return encrypted_value.decode('utf-8', errors='replace')
308
+ data = encrypted_value[3:]
309
+ if len(data) == 0 or len(data) % 16 != 0:
310
+ return ''
311
+ iv_hex = '20' * 16
312
+ data_b64 = base64.b64encode(data).decode()
313
+ try:
314
+ result = subprocess.check_output(
315
+ ['openssl', 'enc', '-aes-128-cbc', '-d', '-A', '-nopad',
316
+ '-base64', '-K', key_hex, '-iv', iv_hex],
317
+ input=data_b64.encode(), stderr=subprocess.DEVNULL
318
+ )
319
+ pad = result[-1]
320
+ if 1 <= pad <= 16:
321
+ result = result[:-pad]
322
+ return result.decode('utf-8', errors='replace')
323
+ except:
324
+ return ''
325
+
326
+ # ========== 主逻辑 ==========
327
+ try:
328
+ if current_platform == 'Darwin':
329
+ key_raw = get_mac_key()
330
+ key_hex = key_raw.hex()
331
+ decrypt_fn = lambda ev: decrypt_mac(ev, key_hex)
332
+ elif current_platform == 'Windows':
333
+ win_key = get_win_key()
334
+ decrypt_fn = lambda ev: decrypt_win(ev, win_key)
335
+ else:
336
+ key_raw = get_linux_key()
337
+ key_hex = key_raw.hex()
338
+ decrypt_fn = lambda ev: decrypt_linux(ev, key_hex)
339
+
340
+ conn = sqlite3.connect(f'file:{db_path}?immutable=1', uri=True)
341
+ placeholders = ','.join(['?'] * len(domains))
342
+ rows = conn.execute(
343
+ 'SELECT host_key, name, value, encrypted_value, path, expires_utc, is_secure, is_httponly, samesite '
344
+ 'FROM cookies WHERE host_key IN (' + placeholders + ')',
345
+ domains
346
+ ).fetchall()
347
+ conn.close()
348
+
349
+ result = []
350
+ for host_key, name, value, encrypted_value, cookie_path, expires_utc, is_secure, is_httponly, samesite in rows:
351
+ cookie_value = value or ''
352
+ if not cookie_value and encrypted_value:
353
+ cookie_value = decrypt_fn(encrypted_value)
354
+ if not name or not cookie_value:
355
+ continue
356
+
357
+ expires_unix = int(expires_utc / 1000000) - 11644473600 if expires_utc else -1
358
+
359
+ if samesite == 2:
360
+ ss = 'Strict'
361
+ elif samesite in (-1, 0) and is_secure:
362
+ ss = 'None'
363
+ else:
364
+ ss = 'Lax'
365
+
366
+ result.append({
367
+ 'name': name,
368
+ 'value': cookie_value,
369
+ 'domain': host_key,
370
+ 'path': cookie_path or '/',
371
+ 'expires': expires_unix if expires_unix > 0 else -1,
372
+ 'httpOnly': bool(is_httponly),
373
+ 'secure': bool(is_secure),
374
+ 'sameSite': ss,
375
+ })
376
+ print(json.dumps(result))
377
+ except Exception as e:
378
+ print(json.dumps({'error': str(e)}))
379
+ sys.exit(1)
380
+ `;
381
+ }
382
+ /**
383
+ * 从本地 Chrome 提取并解密指定 URL 对应的 Cookie。
384
+ */
385
+ function extractCookiesForUrl(url) {
386
+ const dbPath = getCookiesDbPath();
387
+ const domains = getDomainsForUrl(url);
388
+ if (domains.length === 0)
389
+ return [];
390
+ const pyScript = buildPythonScript(dbPath, domains);
391
+ const tmpPy = path.join(os.tmpdir(), `chrome-cookie-extract-${Date.now()}.py`);
392
+ try {
393
+ fs.writeFileSync(tmpPy, pyScript);
394
+ // Windows 上用 python,macOS/Linux 上用 python3
395
+ const pythonCmd = os.platform() === 'win32' ? 'python' : 'python3';
396
+ const result = (0, child_process_1.execSync)(`${pythonCmd} "${tmpPy}" 2>&1`, {
397
+ maxBuffer: 10 * 1024 * 1024,
398
+ }).toString().trim();
399
+ const parsed = JSON.parse(result);
400
+ if (parsed.error) {
401
+ console.log(` ⚠️ Cookie 提取失败: ${parsed.error}`);
402
+ return [];
403
+ }
404
+ return parsed;
405
+ }
406
+ catch (e) {
407
+ const stderr = e.stderr ? e.stderr.toString().trim() : '';
408
+ const stdout = e.stdout ? e.stdout.toString().trim() : '';
409
+ console.log(` ⚠️ Cookie 提取失败: ${stderr || stdout || e.message?.split('\n')[0]}`);
410
+ return [];
411
+ }
412
+ finally {
413
+ try {
414
+ fs.unlinkSync(tmpPy);
415
+ }
416
+ catch { }
417
+ }
418
+ }
419
+ //# sourceMappingURL=cookie-extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookie-extract.js","sourceRoot":"","sources":["../../src/cookie-extract.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  export { BenchmarkCollector } from './collector';
2
2
  export { collectInteractiveElements, getCollectScript } from './dom-capture';
3
3
  export { renderSoMScreenshot, getSoMRenderScript } from './som-annotator';
4
- export type { SoMElement, StepRecord, SessionRecord } from './types';
4
+ export { collectConversation, getConversationScript } from './conversation-capture';
5
+ export { extractCookiesForUrl } from './cookie-extract';
6
+ export type { SoMElement, StepRecord, SessionRecord, ChatMessage } from './types';
5
7
  //# sourceMappingURL=index.d.ts.map
package/dist/src/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getSoMRenderScript = exports.renderSoMScreenshot = exports.getCollectScript = exports.collectInteractiveElements = exports.BenchmarkCollector = void 0;
3
+ exports.extractCookiesForUrl = exports.getConversationScript = exports.collectConversation = exports.getSoMRenderScript = exports.renderSoMScreenshot = exports.getCollectScript = exports.collectInteractiveElements = exports.BenchmarkCollector = void 0;
4
4
  var collector_1 = require("./collector");
5
5
  Object.defineProperty(exports, "BenchmarkCollector", { enumerable: true, get: function () { return collector_1.BenchmarkCollector; } });
6
6
  var dom_capture_1 = require("./dom-capture");
@@ -9,4 +9,9 @@ Object.defineProperty(exports, "getCollectScript", { enumerable: true, get: func
9
9
  var som_annotator_1 = require("./som-annotator");
10
10
  Object.defineProperty(exports, "renderSoMScreenshot", { enumerable: true, get: function () { return som_annotator_1.renderSoMScreenshot; } });
11
11
  Object.defineProperty(exports, "getSoMRenderScript", { enumerable: true, get: function () { return som_annotator_1.getSoMRenderScript; } });
12
+ var conversation_capture_1 = require("./conversation-capture");
13
+ Object.defineProperty(exports, "collectConversation", { enumerable: true, get: function () { return conversation_capture_1.collectConversation; } });
14
+ Object.defineProperty(exports, "getConversationScript", { enumerable: true, get: function () { return conversation_capture_1.getConversationScript; } });
15
+ var cookie_extract_1 = require("./cookie-extract");
16
+ Object.defineProperty(exports, "extractCookiesForUrl", { enumerable: true, get: function () { return cookie_extract_1.extractCookiesForUrl; } });
12
17
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,yCAAiD;AAAxC,+GAAA,kBAAkB,OAAA;AAC3B,6CAA6E;AAApE,yHAAA,0BAA0B,OAAA;AAAE,+GAAA,gBAAgB,OAAA;AACrD,iDAA0E;AAAjE,oHAAA,mBAAmB,OAAA;AAAE,mHAAA,kBAAkB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,yCAAiD;AAAxC,+GAAA,kBAAkB,OAAA;AAC3B,6CAA6E;AAApE,yHAAA,0BAA0B,OAAA;AAAE,+GAAA,gBAAgB,OAAA;AACrD,iDAA0E;AAAjE,oHAAA,mBAAmB,OAAA;AAAE,mHAAA,kBAAkB,OAAA;AAChD,+DAAoF;AAA3E,2HAAA,mBAAmB,OAAA;AAAE,6HAAA,qBAAqB,OAAA;AACnD,mDAAwD;AAA/C,sHAAA,oBAAoB,OAAA"}
@@ -12,6 +12,12 @@ export interface SoMElement {
12
12
  };
13
13
  attributes: Record<string, string>;
14
14
  }
15
+ /** 单条对话消息 */
16
+ export interface ChatMessage {
17
+ role: 'customer' | 'agent' | 'system';
18
+ content: string;
19
+ timestamp?: string;
20
+ }
15
21
  /** 单步操作记录 */
16
22
  export interface StepRecord {
17
23
  stepId: number;
@@ -37,6 +43,9 @@ export interface StepRecord {
37
43
  html: string;
38
44
  interactiveElements: string;
39
45
  };
46
+ conversation?: {
47
+ messages: string;
48
+ };
40
49
  }
41
50
  /** 采集会话记录 */
42
51
  export interface SessionRecord {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "benchmark-collector",
3
- "version": "1.0.2",
3
+ "version": "1.0.3",
4
4
  "description": "Playwright-based benchmark data collector for web agent training",
5
5
  "main": "dist/src/index.js",
6
6
  "types": "dist/src/index.d.ts",
@@ -23,7 +23,13 @@
23
23
  "postinstall": "node dist/scripts/postinstall.js",
24
24
  "test": "npx playwright test"
25
25
  },
26
- "keywords": ["benchmark", "playwright", "web-agent", "data-collection", "som"],
26
+ "keywords": [
27
+ "benchmark",
28
+ "playwright",
29
+ "web-agent",
30
+ "data-collection",
31
+ "som"
32
+ ],
27
33
  "author": "",
28
34
  "license": "ISC",
29
35
  "devDependencies": {