如何构建安全的ChatGPT对话导出工具:技术实现与开源方案

1次阅读
没有评论

共计 2012 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

背景痛点

在技术文档归档、客服记录分析等场景中,开发者经常需要导出 ChatGPT 的对话记录。现有的方案主要是通过截图或复制粘贴,但这些方法存在明显的缺陷:

如何构建安全的 ChatGPT 对话导出工具:技术实现与开源方案

  • 效率低 :手动操作耗时耗力,不适合批量处理
  • 格式混乱 :复制的内容可能丢失原有的结构化信息
  • 隐私风险 :敏感信息可能被意外保存在剪贴板或截图中

技术方案对比

方案类型 优点 缺点
浏览器插件方案 使用方便 功能受限,跨浏览器兼容性差
服务端方案 处理能力强 需要服务器资源,延迟高
本地工具方案 隐私性好,性能高 需要安装环境

我们选择 Node.js+TypeScript 的技术栈,因为:

  1. 跨平台支持(Windows/macOS/Linux)
  2. 完善的生态系统和类型安全
  3. 适合构建本地命令行工具

核心实现

1. 使用 Puppeteer 实现 DOM 解析

import puppeteer from 'puppeteer';

async function exportChats(url: string) {const browser = await puppeteer.launch();
  const page = await browser.newPage();

  // 使用 XPath 选择器定位对话元素
  const chatXPath = '//div[contains(@class,"chat-message")]';

  await page.goto(url);
  const chats = await page.$x(chatXPath);

  // 提取对话内容
  const results = await Promise.all(chats.map(async (chat) => {return await chat.evaluate((el) => el.textContent);
    })
  );

  await browser.close();
  return results;
}

2. 数据清洗模块

function sanitizeContent(content: string): string {
  // 移除邮箱和电话号码
  const emailRegex = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g;
  const phoneRegex = /\+?\d{1,4}?[-.\s]?\(?\d{1,3}?\)?[-.\s]?\d{1,4}[-.\s]?\d{1,4}[-.\s]?\d{1,9}/g;

  return content
    .replace(emailRegex, '[REDACTED_EMAIL]')
    .replace(phoneRegex, '[REDACTED_PHONE]');
}

3. 本地加密存储

import {createCipheriv, randomBytes} from 'crypto';
import {promises as fs} from 'fs';

const encryptData = (data: string, key: Buffer): string => {const iv = randomBytes(16);
  const cipher = createCipheriv('aes-256-cbc', key, iv);
  let encrypted = cipher.update(data, 'utf8', 'hex');
  encrypted += cipher.final('hex');
  return iv.toString('hex') + ':' + encrypted;
};

async function saveToFile(data: string, path: string) {const key = randomBytes(32); // AES-256 需要 32 字节密钥
  const encrypted = encryptData(data, key);
  await fs.writeFile(path, encrypted);
}

生产级考量

性能优化

对于万条对话记录,我们进行了分批次处理(每次 500 条),总耗时约 2 分钟。关键优化点:

  1. 使用 Puppeteer 的并发请求限制
  2. 实现对话内容的流式处理
  3. 启用内存缓存减少 DOM 查询

安全防护

function sanitizeHTML(input: string): string {
  return input
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;')
    .replace(/"/g,'&quot;')
    .replace(/'/g,'&#39;');
}

避坑指南

  1. 未处理对话分页 :ChatGPT 的对话可能分多页显示,需要检测和自动加载下一页
  2. 本地存储容量 :建议添加预警机制,当存储超过 50MB 时提醒用户
  3. API 限制 :注意 ChatGPT 的速率限制,适当添加延迟

开源实现

完整项目已开源在 GitHub:chatgpt-exporter。欢迎通过 PR 提交改进建议,特别是:

  • 更多导出格式支持(Markdown/PDF)
  • 图形界面版本
  • 云存储集成

通过这个项目,开发者可以快速构建自己的对话导出工具,同时确保数据安全和隐私保护。

正文完
 0
评论(没有评论)