基于浏览器脚本实现免费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。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的脚本编辑器中。按CtrlS保存。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参数名类型是否必须默认值说明messagesArray是-消息对象数组定义对话历史。每个对象需包含role(system,user,assistant) 和content。modelString否(忽略)此参数已被忽略。实际使用的模型取决于你浏览器中ChatGPT网页上手动选择的模型如GPT-3.5、GPT-4、GPT-4o等。在请求中保留此字段仅为兼容性。streamBoolean否false是否启用流式输出。若为true响应将以Server-Sent Events (SSE)流的形式返回。temperatureNumber否1采样温度介于0和2之间。值越高输出越随机。max_tokensInteger否-生成回复的最大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。如何处理响应当streamtrue时服务器返回的不是一个完整的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 连接类问题问题1API服务启动失败端口被占用。现象运行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 /FMac/Linux:lsof -i :8766找到PID然后kill -9 PID问题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网页是否卡住检查网页是否正常能否手动发送消息并收到回复。有时需要刷新页面。对话历史是否过长虽然网页版支持长上下文但极其长的历史可能导致单次响应生成非常慢。尝试开启一个新对话。问题4API返回错误提示“Model not supported”或类似。现象请求失败响应中包含错误信息。排查本项目服务端已忽略model参数。此错误可能源于请求格式错误检查JSON格式是否正确messages数组结构是否合规。浏览器端脚本执行失败打开浏览器控制台F12查看是否有脚本执行的JavaScript错误。可能是网页DOM结构变化导致脚本找不到输入框或发送按钮。5.3 性能与稳定性优化建议专用浏览器环境建议为这个项目创建一个独立的浏览器用户配置文件或直接使用便携版浏览器如Portable Chrome只安装必要的Tampermonkey和CSP禁用扩展。避免与其他浏览活动冲突。保持对话简洁虽然支持长上下文但为了稳定和速度建议在系统指令中明确要求AI总结或精简回答。对于Auto-GPT可以调整其设置定期清理过长的上下文记忆。实现简单的重试机制在你的调用代码中如修改后的Auto-GPT的llm_utils.py添加重试逻辑和错误处理以应对偶发的网络波动或网页端临时问题。import requests import time def call_chatgpt_api(messages, max_retries3): for i in range(max_retries): try: response requests.post( http://localhost:8766/v1/chat/completions, json{messages: messages}, timeout60 # 设置超时 ) response.raise_for_status() # 检查HTTP错误 return response.json() except requests.exceptions.RequestException as e: print(fAPI调用失败 (尝试 {i1}/{max_retries}): {e}) if i max_retries - 1: time.sleep(2 ** i) # 指数退避等待 else: raise # 重试多次后仍失败抛出异常监控与日志服务端启动时可以添加更详细的日志帮助你了解请求处理状态。你也可以在浏览器中编写简单的脚本定时检查页面连接状态。这个项目为我们在特定场景下使用大语言模型提供了一个极具性价比和灵活性的解决方案。它本质上是一种“自动化助手”将手动操作转化为可编程接口。在享受其便利的同时务必牢记它依赖于第三方服务的网页端因此稳定性与合规使用是第一位的。希望这份详细的指南能帮助你顺利搭建并玩转这个有趣的工具。