news 2026/4/3 6:01:05

突破ChatGPT复制限制:高效内容提取的技术实现与避坑指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
突破ChatGPT复制限制:高效内容提取的技术实现与避坑指南


背景痛点:网页端“看得见却拿不走”的尴尬

做自动化脚本的朋友几乎都踩过同一个坑:ChatGPT 网页端把答案漂亮地渲染出来,鼠标一划,Ctrl+C 却像失灵了一样。深究下去,发现官方在 DOM 层面布了两道“软锁”:

  1. 全局copy事件被preventDefault()掉,剪贴板直接失效
  2. 对话气泡外层包了一层user-select:none的 CSS 护甲,浏览器默认划词被屏蔽
  3. 即使强行document.getSelection(),也会发现每段回答被拆成零散的<span>,拼接回去时顺序和空格全乱

结果就是:传统爬虫最爱的innerText/textContent瞬间罢工,XPath 拿回来一堆碎片,正则拼回去错字连篇。对需要批量沉淀知识库、做结构化数据的开发者来说,效率直接打回石器时代。

技术方案对比:三条路线谁更适合你?

方案平均成功率平均耗时/条维护成本适用场景
Puppeteer/Playwright 重写 DOM 事件92%2.3 s动态渲染、需要即时交互
逆向 REST/GraphQL 端点97%0.8 s可接受逆向、追求极致速度
OCR 截图兜底85%4.1 s前端加密升级、图片化文字

一句话总结:

  • 想“稳”——选方案1;
  • 想“快”——选方案2,但要随时跟进接口变化;
  • 想“兜底”——方案3,等前端把文字画到<canvas>时还能救命。

核心实现:用 Playwright 把“复制”抢回来

下面这段代码在 Python 3.8+ 验证通过,逻辑分三步:

  1. 启动浏览器并注入脚本,先拆掉copy封锁;
  2. 用模拟人工划词+右键菜单的“复制”指令绕过user-select
  3. 加入随机延迟 + 异常重试,降低被封概率。
# pip install playwright==1.40.0 import asyncio, random, time, re from playwright.async_api import async_playwright USER_AGENTS = [ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_4) AppleWebKit/605.1.15" ] async def safe_copy(page, selector, max_retry=3): """划词复制,返回纯文本""" for attempt in range(1, max_retry + 1): try: # 1. 随机等待,模拟人类 await page.wait_for_timeout(random.randint(300, 700)) # 2. 聚焦回答气泡 await page.click(selector) # 3. 三连击选中全文 await page.click(selector, click_count=3, delay=80) # 4. 调出右键菜单 await page.click(selector, button="right") # 5. 点击“复制” await page.keyboard.press("c") # 英文界面快捷键 text = await page.evaluate("navigator.clipboard.readText()") if text and len(text) > 10: return text except Exception as e: if attempt == max_retry: raise RuntimeError("复制失败") from e await asyncio.sleep(1) return "" async def fetch_answer(prompt: str) -> str: async with async_playwright() as p: browser = await p.chromium.launch(headless=True) context = await browser.new_context( user_agent=random.choice(USER_AGENTS), viewport={"width": 1280, "height": 800} ) page = await context.new_page() # 先干掉 copy 拦截 await page.add_init_script(""" document.addEventListener('copy', e => e.stopImmediatePropagation(), true); """) await page.goto("https://chat.openai.com") # TODO: 自行补充登录/会话恢复逻辑 await page.fill('textarea[placeholder*="Send a message"]', prompt) await page.press('textarea[placeholder*="Send a message"]', "Enter") # 等待流式输出完成 await page.wait_for_selector('button[aria-label*="Regenerate"]', timeout=30000) # 选最后一条回答 answer_selector = '.group:nth-last-of-type(1) .markdown' text = await safe_copy(page, answer_selector) await browser.close() return text if __name__ == "__main__": print(asyncio.run(fetch_answer("用一句话介绍量子计算")))

要点拆解:

  • stopImmediatePropagation把官方preventDefault顶掉,比直接重写oncopy更稳;
  • 划词后通过navigator.clipboard.readText()拿数据,避开innerText碎片;
  • 异常捕获里把max_retry做成参数,方便后续在批量任务里动态调整。

生产级细节:别让“高频”变成“封禁”

  1. 请求频率
    实测在 2024.05 的网页版,同账号连续提问 25 次后弹验证码。保险策略:单账号 ≤ 20 轮/10min,随机间隔 8–15 s。

  2. User-Agent 轮换
    上面列表只放两条,线上可拉 20+ 真实 UA,配合浏览器指纹插件,把navigator.webdriver置空。

  3. Cookie 保鲜
    登录后把__Secure-next-auth.session-token存本地,15 分钟刷新一次refreshToken,否则接口会突然 401。

  4. 数据清洗
    复制回来的文本里常混**\n\n等 Markdown 符号,入库前统一用markdownify转 HTML 再转纯文本,可解决 90% 乱码。

避坑指南:踩过的雷一次说完

  • 不要图省事直接querySelector('.markdown').innerText——流式回答还没渲染完就抓回来半截。
  • 划词复制偶尔会带多余空格,正则re.sub(r'\s+', ' ', text)压缩一下。
  • 若出现“答案被图片化”——前端把文字画到 canvas——立即切 OCR 分支,推荐paddleocr,CPU 也能 2s 内出结果。
  • 多人协作时一定做“会话池”,把账号/浏览器实例/代理三元组绑定,避免同 IP 多账号高速切换直接撞风控。

延伸思考:当官方再把墙加高,我们还能怎么玩?

  1. 前端如果升级 Shadow DOM + 私有 CSS 变量,DOM 注入脚本将失效,可考虑在浏览器扩展层用devtools protocol截获网络层渲染指令;
  2. 接口若加入sig签名参数,需要动态插桩 JSVMP 算法,维护成本陡增,此时不如直接转官方付费 API,成本换稳定;
  3. 合规底线:抓取内容再发布需遵守平台 ToS 及版权要求,内部知识库场景建议加“仅员工可见”水印,避免二次分发风险。

性能实测小数据(本地 MBP 14',10 条问答)

指标Puppeteer+复制逆向 APIOCR 截图
成功率92%97%85%
平均耗时2.3 s0.8 s4.1 s
验证码触发0/100/100/10
代码维护量

进一步学习 & 完整代码仓库

我把三种方案的完整代码、UA 池、代理轮换都整理到了一个仓库,直接克隆就能跑:
https://github.com/yourname/chatgpt-extract-kit(示例链接,请替换为自己的仓库)


如果你只想最快体验“让 AI 开口说话”的爽感,又懒得和网页复制斗智斗勇,不妨换个思路——直接动手搭一条属于自己的语音通道。我上周就在从0打造个人豆包实时通话AI实验里,照着教程 30 分钟跑通了“ASR→豆包大模型→TTS”全链路,麦克风一对,答案秒级回读,比复制粘贴香太多。小白也能顺利体验,我这种前端半桶水都能一次点亮,推荐试试。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/31 1:42:21

7天掌握数据可视化工具:从环境搭建到企业级大屏落地指南

7天掌握数据可视化工具&#xff1a;从环境搭建到企业级大屏落地指南 【免费下载链接】DataRoom &#x1f525;基于SpringBoot、MyBatisPlus、ElementUI、G2Plot、Echarts等技术栈的大屏设计器&#xff0c;具备目录管理、DashBoard设计、预览能力&#xff0c;支持MySQL、Oracle、…

作者头像 李华
网站建设 2026/3/31 7:21:42

AI图像修复终极解决方案:3个让老照片重获新生的AI魔法

AI图像修复终极解决方案&#xff1a;3个让老照片重获新生的AI魔法 【免费下载链接】Waifu2x-Extension-GUI Video, Image and GIF upscale/enlarge(Super-Resolution) and Video frame interpolation. Achieved with Waifu2x, Real-ESRGAN, Real-CUGAN, RTX Video Super Resolu…

作者头像 李华
网站建设 2026/4/3 2:27:29

3大核心技术掌握分子对接:从零基础到专业应用的完整路径

3大核心技术掌握分子对接&#xff1a;从零基础到专业应用的完整路径 【免费下载链接】AutoDock-Vina AutoDock Vina 项目地址: https://gitcode.com/gh_mirrors/au/AutoDock-Vina 开篇&#xff1a;目标读者画像与学习收益分析 你是否属于这些目标读者&#xff1f; 药物…

作者头像 李华
网站建设 2026/3/17 8:34:57

Dubbo多版本灰度发布实战:从配置到流控的完整指南

1. Dubbo多版本灰度发布的核心价值 想象这样一个场景&#xff1a;你的电商平台用户服务需要从v1.0升级到v2.0&#xff0c;新版本接口参数做了不兼容修改&#xff0c;但仍有大量客户端在使用旧版本。直接全量升级会导致服务不可用&#xff0c;回滚又影响用户体验。这就是Dubbo多…

作者头像 李华
网站建设 2026/3/17 19:42:53

三步提升原神游戏体验优化:开源游戏辅助工具Akebi-GC全解析

三步提升原神游戏体验优化&#xff1a;开源游戏辅助工具Akebi-GC全解析 【免费下载链接】Akebi-GC (Fork) The great software for some game that exploiting anime girls (and boys). 项目地址: https://gitcode.com/gh_mirrors/ak/Akebi-GC 作为一款开源游戏辅助工具…

作者头像 李华
网站建设 2026/3/13 8:43:09

人工智能毕业设计效率提升实战:从冗余开发到自动化流水线

人工智能毕业设计效率提升实战&#xff1a;从冗余开发到自动化流水线 摘要&#xff1a;许多学生在完成人工智能毕业设计时&#xff0c;常陷入重复数据预处理、模型调参耗时、部署流程繁琐等低效陷阱。本文提出一套基于模块化设计与自动化工具链的提效方案&#xff0c;涵盖数据版…

作者头像 李华