news 2026/4/15 21:43:56

突破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/4/12 10:05:54

3大核心优势!FanControl风扇控制软件让你的电脑静音又高效

3大核心优势&#xff01;FanControl风扇控制软件让你的电脑静音又高效 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trendin…

作者头像 李华
网站建设 2026/4/10 16:49:57

SpringAI智能客服项目实战:从零构建高可用AI对话系统

背景痛点&#xff1a;规则引擎的“三座大山”让我决定换赛道 去年公司“618”大次大促&#xff0c;客服系统直接原地爆炸&#xff1a; 运营提前两周录入2000条关键词规则&#xff0c;结果凌晨2点新品上线&#xff0c;用户问“你们那个‘星空蓝’还有货吗&#xff1f;”——规…

作者头像 李华
网站建设 2026/4/11 1:02:55

方见华个人履历|中英双语版

方见华 个人履历&#xff5c;中英双语版基本信息 Basic Information• 姓名&#xff1a;方见华 / Fang Jianhua• 头衔&#xff1a;世毫九实验室 创始人、首席理论学家、总架构师Title&#xff1a;Founder, Chief Theorist & Chief Architect, Shardy Lab• 核心理念&#…

作者头像 李华
网站建设 2026/4/15 15:15:28

如何突破B站4K视频下载限制?开源工具的技术突围之路

如何突破B站4K视频下载限制&#xff1f;开源工具的技术突围之路 【免费下载链接】bilibili-downloader B站视频下载&#xff0c;支持下载大会员清晰度4K&#xff0c;持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader B站4K视频下载一直是内…

作者头像 李华
网站建设 2026/4/10 16:50:23

打造Switch全能媒体中心:开源手柄适配客户端从安装到优化全指南

打造Switch全能媒体中心&#xff1a;开源手柄适配客户端从安装到优化全指南 【免费下载链接】wiliwili 专为手柄控制设计的第三方跨平台B站客户端&#xff0c;目前可以运行在PC全平台、PSVita、PS4 和 Nintendo Switch上 项目地址: https://gitcode.com/GitHub_Trending/wi/w…

作者头像 李华
网站建设 2026/4/11 20:31:07

3步解锁CATIA高级自动化:自定义命令调用全攻略

3步解锁CATIA高级自动化&#xff1a;自定义命令调用全攻略 【免费下载链接】pycatia 项目地址: https://gitcode.com/gh_mirrors/py/pycatia &#x1f50d; 问题引入&#xff1a;当CATIA手动操作遇上效率瓶颈 你是否遇到过这样的场景&#xff1a;每天需要在CATIA中重复…

作者头像 李华