NextAI Translator 使用 ChatGPT Web 模式报错排查:官方 FAQ 解决方案与 Arkose 验证机制源码解析
【免费下载链接】nextai-translator基于 ChatGPT API 的划词翻译浏览器插件和跨平台桌面端应用 - Browser extension and cross-platform desktop application for translation based on ChatGPT API.项目地址: https://gitcode.com/GitHub_Trending/op/nextai-translator
本文是一份面向 NextAI Translator 用户的故障排查指南,聚焦于使用 ChatGPT Web 模式(Provider 选择 "ChatGPT")时遇到翻译请求报错的处理方案。文章以仓库文档 docs/chatgpt.md 的官方 FAQ 为核心骨架,逐层展开官方解决步骤,并结合仓库源码(src/common/engines/chatgpt.ts、src/browser-extension/background/index.ts 等)解释报错产生的根本原因,帮助读者在遇到该问题时既"知其然"(按步骤操作),也"知其所以然"(理解背后的 ChatGPT Web 反向接入机制)。
问题现象:翻译请求报错
在 NextAI Translator 中,当你将 Provider 设置为 "ChatGPT"(即直接使用 ChatGPT 网页版账号,而非 OpenAI API Key)并执行划词翻译时,翻译面板可能弹出一个报错提示。官方 FAQ(docs/chatgpt.md)中给出的报错截图显示为 ChatGPT 网页端返回的错误信息,常见表现包括:
- 翻译结果区域直接显示错误信息(errorMessage),并在下方出现 "FAQ Page" 链接;
- 报错内容多为 "Failed to get arkose token"、认证失败、或 ChatGPT 服务端返回的各类错误详情。
值得注意的是,该 FAQ 链接是由应用内错误提示界面自动提供的:在 src/common/components/Translator.tsx 中,当errorMessage非空且settings.provider === 'ChatGPT'时,界面会渲染一行 "Go to theFAQ Page" 的链接,并根据界面语言(settings.i18n是否包含zh)跳转到 docs/chatgpt-cn.md 或 docs/chatgpt.md。也就是说,这份 FAQ 文档本身就是为 ChatGPT Web 模式报错场景准备的官方排障入口。
官方解决方案:三步操作
根据 docs/chatgpt.md(中文版见 docs/chatgpt-cn.md)的说明,遇到上述报错时的官方解决方案如下:
- 登录 ChatGPT 网页版:打开 chat.openai.com(chatgpt.com),使用你的账号完成登录,确保浏览器处于已登录状态;
- 新建一个对话并发送几条随机字符:在 ChatGPT 网页中输入任意几个字符并发送,等待其正常返回回复;
- 回到 NextAI Translator 重试:确认 ChatGPT 网页端已恢复正常响应后,返回 NextAI Translator,重新执行翻译操作。
官方 FAQ 中的演示示例即为在 ChatGPT 网页版新建对话、输入字符并获得正常回复的过程,随后 NextAI Translator 的翻译请求即可恢复。
这短短三步的底层逻辑是:ChatGPT Web 模式本质上是在复用你网页端的登录会话(Session)与验证令牌,翻译请求的成败高度依赖 ChatGPT 网页端会话的"新鲜度"与有效性。当网页端会话失效、验证令牌过期或风控状态异常时,翻译必然报错,而"新建对话 + 发送消息"恰好能够触发会话刷新并重新激活相关验证机制。
为什么需要这样做:ChatGPT Web 模式的请求链路源码解析
要理解官方 FAQ 为什么给出这样的解决步骤,需要先弄清楚 NextAI Translator 的 ChatGPT Web 引擎是如何发起翻译请求的。相关实现全部位于 src/common/engines/chatgpt.ts 的ChatGPT类中。
1. 获取网页端访问令牌(accessToken)
与需要 API Key 的 OpenAI 模式不同,ChatGPT Web 模式直接请求 ChatGPT 网页端的会话接口获取访问令牌:
- 会话认证接口:
https://chat.openai.com/api/auth/session(定义于 src/common/utils.ts,常量defaultChatGPTAPIAuthSessionAPIURL); - 后端 API 基地址:
https://chat.openai.com/backend-api(同文件第 17 行,常量defaultChatGPTWebAPI)。
在ChatGPT.sendMessage()(src/common/engines/chatgpt.ts)中,引擎首先请求该会话接口,若返回状态码不是 200,会抛出或上报Failed to fetch ChatGPT Web accessToken: ...错误,其中detail字段往往是 ChatGPT 返回的具体失败原因。当你未登录或会话过期时,这一步就会直接失败——这也是为什么官方 FAQ 要求你先确认网页端登录状态。
2. 获取 Arkose 验证令牌(Arkose Token)
这是 ChatGPT Web 模式中最关键、也最脆弱的环节。ChatGPT 网页端启用了一套名为 Arkose(FunCaptcha)的人机验证机制,翻译请求必须携带有效的 Arkose Token 才能被服务端接受。
NextAI Translator 的获取方式十分巧妙:扩展的 background 脚本通过webRequestAPI 监听浏览器发往 OpenAI 域名的所有xmlhttprequest请求(src/browser-extension/background/index.ts),一旦发现包含/public_key且未携带chatgptArkoseReqParams(即cgb=vhwi,见 src/common/constants.ts)的验证请求,就将其 URL 与请求体(formData)保存到browser.storage.local:
- 键
chatgptArkoseReqUrl:记录验证请求的完整 URL; - 键
chatgptArkoseReqForm:记录请求体表单内容。
随后,getArkoseToken()(src/common/engines/chatgpt.ts)从storage.local中读取这两个值,向该 URL 附带?cgb=vhwi发起 POST 请求,从响应 JSON 中提取token字段作为 Arkose Token。
关键点:这些/public_key验证请求只会在你真实打开并操作 ChatGPT 网页版时才会由网页自身产生。如果你长时间没有打开 chat.openai.com,storage.local中保存的验证 URL 与表单要么不存在、要么已过期,此时getArkoseToken()会抛出:
Failed to get arkose token. Please keep https://chat.openai.com open and try again. If it still doesn't work, type some characters in the input box of chatgpt web page and try again.这正对应官方 FAQ 解决方案的第一步(保持 chat.openai.com 打开)和第二步(在输入框中输入字符再试)——输入字符并发送消息会触发 ChatGPT 网页端产生全新的 Arkose 验证请求,从而刷新扩展捕获到的验证令牌。
3. 获取 Chat Requirements 与 PoW 证明令牌
获取 Arkose Token 之后,引擎还需完成两道"过关"手续:
- 通过
getChatRequirements()(src/common/engines/chatgpt.ts)调用/backend-api/sentinel/chat-requirements,获取服务端下发的token(Chat Requirements Token)以及工作量证明参数proofofwork(含seed与difficulty); - 通过
GenerateProofToken()(同文件第 70-100 行)基于seed、difficulty与浏览器 User-Agent 执行一个本地 PoW 计算:构造包含随机核数、屏幕尺寸、模拟时区等信息的配置数组,循环至多 100000 次尝试sha3_512(seed + base)的哈希值满足难度条件,最终拼装出gAAAAAB前缀的 proof token。
4. 组装请求并流式接收回复
最终,sendMessage()将 accessToken、Arkose Token、Chat Requirements Token 与 Proof Token 一并放入请求头(Authorization、Openai-Sentinel-Arkose-Token、Openai-Sentinel-Chat-Requirements-Token、openai-sentinel-proof-token),向/backend-api/conversation发送消息体(模型、提示词、parent_message_id、conversation_mode等),并通过fetchSSE以 SSE 流式解析 ChatGPT 的回复增量(src/common/engines/chatgpt.ts)。
从上述链路可以看到,整条请求的成功与否完全建立在 ChatGPT 网页端会话与验证令牌的可用性之上,任何一个环节的令牌失效都会导致翻译报错——这正是 FAQ 解决方案的机理所在。
排查清单与补充注意事项
结合官方 FAQ 与源码实现,当你遇到 ChatGPT Web 模式报错时,可按以下清单逐项排查:
| 排查项 | 操作 | 依据 |
|---|---|---|
| 网页端登录状态 | 打开 chat.openai.com,确认已登录且会话有效 | sendMessage请求/api/auth/session,非 200 即报 accessToken 获取失败(src/common/engines/chatgpt.ts) |
| Arkose 令牌是否被捕获 | 保持 chat.openai.com 页面打开,在输入框随便发送几个字符,触发新的/public_key验证请求 | 后台监听器依赖网页自身产生验证请求(src/browser-extension/background/index.ts) |
| 模型配置是否完整 | 打开设置,确认 Provider 为 ChatGPT 时已选择chatgptModel | src/common/components/Translator.tsx 中未配置模型会直接弹出设置页;模型选项在 src/common/components/Settings.tsx |
| 重试 | 完成上述操作后回到 NextAI Translator 重新发起翻译 | FAQ 第三步 |
补充说明两点:
模型配置前置检查:当 Provider 为 ChatGPT 且未设置
chatgptModel时,应用会直接要求你先去设置页选择模型(src/common/components/Translator.tsx),该配置项类型定义在 src/common/types.ts,默认模型为text-davinci-002-render-sha(src/common/utils.ts)。若你从未配置过模型,请先在设置页完成选择,这通常不是 FAQ 中讨论的"验证类"报错,但属于最常见的误配置之一。这是接入机制所致,而非翻译功能故障:报错并不代表翻译逻辑本身出错,而是 ChatGPT 网页端的风控/验证体系拒绝了一个携带过期或不完整验证令牌的第三方请求。FAQ 中的"新建对话 + 发送字符"操作实质上是刷新网页端会话与验证令牌,从根因上解决问题。类似的思路也适用于其他基于网页会话接入的服务:保持网页端活跃、定期刷新,能显著降低此类报错出现的频率。
结语
NextAI Translator 的 ChatGPT Web 模式通过复用网页端登录会话与 Arkose 验证令牌来调用 ChatGPT 后端能力,这让用户无需付费 API Key 即可使用翻译服务,但也带来了对网页会话状态的强依赖。当遇到翻译报错时,按官方 FAQ(docs/chatgpt.md,中文版 docs/chatgpt-cn.md)执行"登录网页版 → 新建对话发送字符 → 返回重试"三步操作即可在绝大多数情况下恢复服务。理解了背后的请求链路(accessToken → Arkose Token → Chat Requirements → Proof Token → conversation SSE),你就能在排障时更快定位问题环节,而不是盲目重试。
【免费下载链接】nextai-translator基于 ChatGPT API 的划词翻译浏览器插件和跨平台桌面端应用 - Browser extension and cross-platform desktop application for translation based on ChatGPT API.项目地址: https://gitcode.com/GitHub_Trending/op/nextai-translator
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考