基于浏览器脚本实现免费ChatGPT API:本地部署与Auto-GPT集成指南
1. 项目概述:一个“曲线救国”的ChatGPT API方案
如果你和我一样,既想体验Auto-GPT这类自动化智能体的强大,又对OpenAI官方API的调用成本或网络限制感到头疼,那么今天分享的这个项目,或许能给你打开一扇新的大门。这个名为“ChatGPT API By Browser Script”的项目,其核心思路非常巧妙:它不直接调用官方的API接口,而是通过一个运行在你浏览器里的脚本(Tampermonkey),将你在ChatGPT网页版上的操作“翻译”成一个本地的、免费的API服务。
简单来说,它在你本地电脑上搭建了一个“中转站”。当你的程序(比如Auto-GPT)向这个中转站发送请求时,中转站会模拟一个真实的用户,在你的浏览器里打开ChatGPT网页,输入问题,获取回答,然后再把答案返回给你的程序。整个过程,你使用的依然是ChatGPT的网页服务,因此,只要你拥有ChatGPT账号(包括免费的3.5或付费的Plus),就能享受到近乎“免费”的API调用,并且继承了网页版的所有特性,比如超长的上下文支持。
这个方案尤其适合开发者、研究者和技术爱好者,用于进行大量的、实验性的AI交互,而不必担心API账单爆炸。接下来,我将为你详细拆解这个项目的部署、使用全过程,并分享我在实操中踩过的坑和总结的经验。
2. 核心原理与方案选型解析
2.1 为什么选择“浏览器脚本”这条路?
在深入部署之前,理解其背后的“为什么”至关重要。这能帮助你在遇到问题时,更快地定位和解决。
2.1.1 核心优势:成本与稳定性
官方API按Token收费,对于需要频繁、长文本交互的应用(如Auto-GPT的持续对话),成本可能迅速攀升。而网页版ChatGPT对于已订阅用户(Plus)或免费用户,在合理使用范围内并无额外按次费用。本项目正是利用了这一点,将网页版的交互能力“免费”化。
更重要的是稳定性。直接调用官方API可能受到地域、网络策略等复杂因素影响。而通过浏览器脚本操作网页,其网络行为与一个普通用户完全一致,极大地降低了因API调用异常或被风控的风险。网页端本身具备强大的错误处理和重试机制,脚本可以复用这些能力,使得整个流程更为健壮。
2.1.2 技术实现:Node.js服务端与浏览器客户端的协作
整个架构分为两部分:
- Node.js服务端:运行在你本机的一个小型HTTP服务器。它监听来自外部程序(如Auto-GPT)的API请求。它的角色是一个“协议转换器”和“任务调度器”。
- Tampermonkey浏览器脚本:注入到你的浏览器中,常驻在ChatGPT网页。它通过WebSocket或轮询与服务端保持通信,接收服务端下发的“用户提问”任务,然后利用浏览器DOM操作,模拟用户在网页输入框打字、点击发送按钮、等待回复并抓取回复内容等一系列动作,最后将结果回传给服务端。
这种“服务端-浏览器”分离的设计非常聪明。服务端负责提供标准的OpenAI API兼容接口,让调用方无感知;浏览器端负责最复杂、最易变的网页交互逻辑。即使ChatGPT网页改版,也只需要更新浏览器脚本,服务端接口可以保持不变。
2.2 与同类方案的对比
你可能听说过pandora、ChatGPT-Next-Web的自建代理,或是直接逆向工程官方接口的方案。与它们相比,本方案的特点如下:
- vs 逆向工程接口:逆向接口需要不断跟进官方变动,一旦加密或协议更改,立即失效,维护成本高。本方案基于浏览器模拟,只要网页能正常人工使用,脚本就能工作,抗变化能力更强。
- vs 官方API代理:仍然需要解决访问官方API的网络问题,且成本不变。本方案完全规避了这两个问题。
- 缺点:必须保持一个浏览器窗口常开并登录ChatGPT。它消耗的是本机资源,且不适合需要极高并发和低延迟的生产级场景。但对于个人开发、测试和实验,这完全不是问题。
注意:使用此方案应严格遵守ChatGPT的服务条款。它适用于个人学习和研究,请勿用于任何滥用、爬取或干扰服务的行为,避免账号风险。
3. 环境准备与详细部署指南
3.1 基础软件安装
部署开始前,请确保你的电脑已安装以下软件:
Node.js与npm:这是运行本地服务端的基础。建议安装LTS(长期支持)版本。
- 检查是否安装:打开终端(Windows的CMD/PowerShell, Mac/Linux的Terminal),输入
node -v和npm -v,如果能显示版本号则说明已安装。 - 安装:前往 Node.js官网 下载安装包。安装过程通常会自动包含npm。
- 检查是否安装:打开终端(Windows的CMD/PowerShell, Mac/Linux的Terminal),输入
Git:用于克隆项目代码。如果已安装可跳过。
- 检查:终端输入
git --version。 - 安装:前往 Git官网 下载。
- 检查:终端输入
Docker与Docker Compose(可选,但推荐):如果你熟悉Docker,使用它来部署可以避免环境依赖问题,实现一键启动。对于不熟悉命令行的用户,直接使用Node.js运行也更简单。
3.2 获取项目代码并启动服务端
这里提供两种方法:常规Node.js运行和Docker运行。推荐新手使用第一种,更直观。
3.2.1 方法一:使用Node.js直接运行
# 1. 克隆项目到本地 git clone https://github.com/zsodur/chatgpt-api-by-browser-script.git # 如果GitHub访问慢,可以使用镜像源或直接下载ZIP包解压。 # 2. 进入项目目录 cd chatgpt-api-by-browser-script # 3. 安装项目依赖 npm install # 这个过程会下载项目需要的所有Node.js库。网络环境不佳时可能需要较长时间,或需要配置代理。 # 4. 启动服务端 npm run start执行npm run start后,终端会输出类似以下信息:
Server is running on http://localhost:8766这表明本地API服务已经成功启动在8766端口。请保持这个终端窗口一直打开,不要关闭。
3.2.2 方法二:使用Docker运行(环境隔离更干净)
确保Docker服务已在后台运行。
# 1. 同样先克隆项目 git clone https://github.com/zsodur/chatgpt-api-by-browser-script.git cd chatgpt-api-by-browser-script # 2. 使用docker-compose一键构建并启动 docker-compose up # 首次运行会下载Node.js镜像并构建项目,稍等片刻即可。同样,看到Server is running on http://localhost:8766的输出即表示成功。使用docker-compose up -d可以后台运行。
实操心得:在Windows系统下,如果遇到
npm install失败,提示node-gyp相关错误,通常是缺少Python或C++编译工具。可以尝试以管理员身份运行PowerShell,然后执行npm install --global windows-build-tools来安装所需工具链。使用Docker则完全避免了此类环境问题。
3.3 配置浏览器环境
服务端在运行了,现在需要让浏览器能够配合工作。
安装Tampermonkey扩展:这是本项目脚本的运行环境。
- 前往Chrome应用商店(或其他浏览器对应的商店)搜索“Tampermonkey”并安装。它是目前最流行的用户脚本管理器。
安装并配置脚本:
- 打开Tampermonkey的管理面板(点击浏览器扩展栏的Tampermonkey图标,选择“管理面板”)。
- 点击“+”号或“创建新脚本”,会打开一个编辑器。
- 完全清空编辑器中的默认内容。
- 打开你刚克隆的项目文件夹,找到
tampermonkey-script.js文件,用记事本或代码编辑器打开,将其全部内容复制,并粘贴到Tampermonkey的脚本编辑器中。 - 按
Ctrl+S保存。Tampermonkey会自动启用此脚本。
安装“Disable Content-Security-Policy”扩展(关键步骤):
- 这是一个至关重要的步骤。由于脚本需要在ChatGPT页面上与本地服务端通信,会违反浏览器的“内容安全策略”(CSP)。此扩展可以临时禁用该策略。
- 在Chrome应用商店搜索 “Disable Content-Security-Policy” 并安装。安装后,需要手动启用它。点击扩展图标,确保其处于“启用”(Enabled)状态。通常你只需要在访问
chat.openai.com时启用它即可。
重要警告:“Disable Content-Security-Policy”扩展会降低浏览器安全性,因为它禁用了重要的安全防护。务必仅在需要时(即使用此项目时)启用,并在使用完毕后将其关闭。切勿在浏览银行、支付等敏感网站时开启此扩展。
3.4 登录ChatGPT并验证连接
- 打开一个新的浏览器窗口(最好是无痕模式,避免其他扩展干扰),确保Tampermonkey脚本和CSP禁用扩展都已启用。
- 访问 https://chat.openai.com 并登录你的账号。
- 登录成功后,注意观察浏览器页面。如果一切配置正确,你会在页面的右上角看到一个不太起眼的状态提示,例如显示“API Server Connected”或类似字样。同时,浏览器控制台(按F12打开)也不应有红色的CSP报错。
验证API是否可用: 打开另一个终端或使用Postman等工具,发送一个测试请求:
curl -X POST http://localhost:8766/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "messages": [ {"role": "user", "content": "Hello, who are you?"} ], "model": "gpt-3.5-turbo" }'如果收到包含AI回复的JSON响应,恭喜你,本地ChatGPT API网关已搭建成功!
4. API接口详解与高级使用技巧
4.1 接口规范与参数解读
本项目尽力模拟了OpenAI官方ChatCompletion接口,简化了部分参数,核心是messages列表。
请求端点:POST http://localhost:8766/v1/chat/completions
请求体(JSON):
| 参数名 | 类型 | 是否必须 | 默认值 | 说明 |
|---|---|---|---|---|
messages | Array | 是 | - | 消息对象数组,定义对话历史。每个对象需包含role(system,user,assistant) 和content。 |
model | String | 否 | (忽略) | 此参数已被忽略。实际使用的模型取决于你浏览器中ChatGPT网页上手动选择的模型(如GPT-3.5、GPT-4、GPT-4o等)。在请求中保留此字段仅为兼容性。 |
stream | Boolean | 否 | false | 是否启用流式输出。若为true,响应将以Server-Sent Events (SSE)流的形式返回。 |
temperature | Number | 否 | 1 | 采样温度,介于0和2之间。值越高输出越随机。 |
max_tokens | Integer | 否 | - | 生成回复的最大token数。网页版本身有限制,此参数不应超过网页版限制。 |
最重要的messages结构: 对话历史必须按顺序排列。通常以system消息开头设定角色,然后是交替的user和assistant消息。
{ "messages": [ {"role": "system", "content": "你是一个专业的编程助手,回答需简洁明了。"}, {"role": "user", "content": "用Python写一个快速排序函数。"}, {"role": "assistant", "content": "```python\ndef quicksort(arr):\n if len(arr) <= 1:\n return arr\n pivot = arr[len(arr) // 2]\n left = [x for x in arr if x < pivot]\n middle = [x for x in arr if x == pivot]\n right = [x for x in arr if x > pivot]\n return quicksort(left) + middle + quicksort(right)\n```"}, {"role": "user", "content": "请加上详细的注释。"} ] }4.2 流式输出(Streaming)的使用
对于需要长时间生成文本或希望实现打字机效果的应用,流式输出非常有用。
如何启用:将请求中的"stream": true。
如何处理响应:当stream=true时,服务器返回的不是一个完整的JSON对象,而是一个数据流。每个数据块是一个JSON字符串,以data:前缀开头,最后以data: [DONE]结束。
// 一个简单的JavaScript Fetch API处理示例 async function streamChat() { const response = await fetch('http://localhost:8766/v1/chat/completions', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ messages: [{ role: 'user', content: '讲一个长篇故事' }], stream: true }) }); const reader = response.body.getReader(); const decoder = new TextDecoder(); while (true) { const { done, value } = await reader.read(); if (done) break; const chunk = decoder.decode(value); const lines = chunk.split('\n').filter(line => line.trim() !== ''); for (const line of lines) { if (line.startsWith('data: ')) { const data = line.slice(6); if (data === '[DONE]') { console.log('Stream finished'); return; } try { const parsed = JSON.parse(data); const content = parsed.choices[0]?.delta?.content || ''; process.stdout.write(content); // 逐字输出 } catch (e) { console.error('Parse error:', e); } } } } }4.3 与Auto-GPT等自动化工具集成
这是本项目最典型的应用场景。以Auto-GPT为例,你需要修改其调用LLM的核心代码文件。
- 定位文件:在Auto-GPT项目目录中,找到
llm_utils.py文件(路径可能类似autogpt/core/llm/llm_utils.py,具体版本可能有差异)。 - 备份原文件:修改前务必先备份。
- 修改代码:找到调用
openai.ChatCompletion.create的函数(通常是create_chat_completion),将其替换为向本地API发送请求的代码。正如项目README所示:import requests # 替换前: # response = openai.ChatCompletion.create(...) # 替换后: response = requests.post( "http://localhost:8766/v1/chat/completions", json={ "messages": messages, "model": model, # 此处的model参数仅作占位,实际模型由网页决定 "temperature": temperature, "max_tokens": max_tokens, } ).json() # 提取回复内容的方式也略有不同 # 替换前:return response.choices[0].message["content"] # 替换后: return response["choices"][0]["message"]["content"] - 确保服务运行:在运行Auto-GPT之前,务必确保本项目的Node.js服务端正在运行,且浏览器已登录ChatGPT并显示连接成功。
注意事项:Auto-GPT可能会频繁调用API,请注意ChatGPT网页版有速率限制。过于频繁的请求可能导致网页端出现“验证”或“稍后再试”的提示。建议在Auto-GPT的配置中适当增加请求间隔(
request_timeout或自定义延迟)。
5. 实战问题排查与经验总结
在实际部署和使用过程中,你几乎一定会遇到一些问题。下面是我踩过坑后总结的排查清单和解决方案。
5.1 连接类问题
问题1:API服务启动失败,端口被占用。
- 现象:运行
npm run start时提示Error: listen EADDRINUSE: address already in use :::8766。 - 排查:端口8766已被其他程序占用。
- 解决:
- 更改服务端口。修改项目根目录下的
server.js或相关配置文件,将8766改为其他未用端口(如8767)。 - 关闭占用端口的程序。在终端运行:
- Windows:
netstat -ano | findstr :8766找到PID,然后taskkill /PID <PID> /F - Mac/Linux:
lsof -i :8766找到PID,然后kill -9 <PID>
- Windows:
- 更改服务端口。修改项目根目录下的
问题2:浏览器脚本已安装,但ChatGPT网页右上角无连接状态。
- 现象:登录ChatGPT后,页面无任何变化,调用API返回连接错误。
- 排查步骤:
- 检查Tampermonkey:确保脚本已启用(图标为彩色,管理面板中脚本开关为绿色)。
- 检查CSP禁用扩展:这是最常见的原因。确保该扩展在
chat.openai.com域名下已启用。可以点击扩展图标查看状态。 - 检查浏览器控制台:按F12打开开发者工具,查看“Console”选项卡是否有红色错误。如果看到
Refused to connect to 'ws://localhost:8766'...或含有Content Security Policy字样的错误,就是CSP问题。 - 检查服务端是否运行:确认
npm run start的终端窗口仍在运行,且无报错。 - 检查脚本版本:确保Tampermonkey中安装的脚本内容与项目中的
tampermonkey-script.js完全一致。ChatGPT网页改版后,旧脚本可能失效,需更新。
5.2 请求与响应类问题
问题3:调用API返回超时或长时间无响应。
- 现象:发送请求后一直等待,最终超时。
- 排查:
- 浏览器窗口是否激活?有些浏览器会在标签页非激活状态时降低JavaScript执行频率或暂停,可能导致脚本响应慢。尝试将ChatGPT标签页置于前台。
- ChatGPT网页是否卡住?检查网页是否正常,能否手动发送消息并收到回复。有时需要刷新页面。
- 对话历史是否过长?虽然网页版支持长上下文,但极其长的历史可能导致单次响应生成非常慢。尝试开启一个新对话。
问题4:API返回错误,提示“Model not supported”或类似。
- 现象:请求失败,响应中包含错误信息。
- 排查:本项目服务端已忽略
model参数。此错误可能源于:- 请求格式错误:检查JSON格式是否正确,
messages数组结构是否合规。 - 浏览器端脚本执行失败:打开浏览器控制台(F12),查看是否有脚本执行的JavaScript错误。可能是网页DOM结构变化导致脚本找不到输入框或发送按钮。
- 请求格式错误:检查JSON格式是否正确,
5.3 性能与稳定性优化建议
- 专用浏览器环境:建议为这个项目创建一个独立的浏览器用户配置文件,或直接使用便携版浏览器(如Portable Chrome),只安装必要的Tampermonkey和CSP禁用扩展。避免与其他浏览活动冲突。
- 保持对话简洁:虽然支持长上下文,但为了稳定和速度,建议在系统指令中明确要求AI总结或精简回答。对于Auto-GPT,可以调整其设置,定期清理过长的上下文记忆。
- 实现简单的重试机制:在你的调用代码中(如修改后的Auto-GPT的
llm_utils.py),添加重试逻辑和错误处理,以应对偶发的网络波动或网页端临时问题。import requests import time def call_chatgpt_api(messages, max_retries=3): for i in range(max_retries): try: response = requests.post( "http://localhost:8766/v1/chat/completions", json={"messages": messages}, timeout=60 # 设置超时 ) response.raise_for_status() # 检查HTTP错误 return response.json() except requests.exceptions.RequestException as e: print(f"API调用失败 (尝试 {i+1}/{max_retries}): {e}") if i < max_retries - 1: time.sleep(2 ** i) # 指数退避等待 else: raise # 重试多次后仍失败,抛出异常 - 监控与日志:服务端启动时可以添加更详细的日志,帮助你了解请求处理状态。你也可以在浏览器中编写简单的脚本,定时检查页面连接状态。
这个项目为我们在特定场景下使用大语言模型提供了一个极具性价比和灵活性的解决方案。它本质上是一种“自动化助手”,将手动操作转化为可编程接口。在享受其便利的同时,务必牢记它依赖于第三方服务的网页端,因此稳定性与合规使用是第一位的。希望这份详细的指南能帮助你顺利搭建并玩转这个有趣的工具。
