API Key 登录 Codex 也能用插件了,还支持会话删除和导出

大家好,我是子昕。

上次 Codex Chrome Extension 出来之后,我就一直想体验。

但有个问题特别烦:

用 API Key 登录的话,插件入口是锁死的。

点进去就一行提示:需要登录 ChatGPT 账号。

我用的是第三方中转站的 API Key,没有 ChatGPT 账号登录,也就意味着插件功能跟我完全没关系。

当时第一反应:能不能直接改 Codex 的安装文件,强行绕过去?

让 AI 帮我分析了一通。

结果越分析越复杂。

什么资源校验、签名、拦截......

最后 AI 给我列了一堆实现不了的原因。

我对这块也不熟,就没继续了。

后来看到一个开源项目 Codex++

GitHub:github.com/BigPizzaV3/...

借助 AI 把原理搞明白之后,我才发现:

我一开始的方向就完全错了。

因为这东西。

根本不用改文件。

Codex++ 是什么

它是一个外部增强启动器,不碰 Codex 的任何原始文件。

通过外部 launcher 启动 Codex 的同时,把增强功能直接注入进去。

我体验了一下,最大的感受是:

Codex 原本那种「官方客户端」的封闭感,一下子没了。

API Key 用户终于能正常用插件了。

装上之后,左侧出现「插件 - 已解锁」:

Codex 顶部也注入了一个"Codex++"配置面板按钮。点开可以看到支持的功能:

  • 插件选项解锁:API Key 模式下正常使用插件
  • 特殊插件强制安装:解除前端「App unavailable」限制
  • 会话删除:悬停显示删除按钮,支持撤销(Codex 原生没有)
  • Markdown 导出:导出带时间戳的对话记录
  • 会话项目移动:把对话移到其他项目

安装步骤

前提:Python 3.11+,已安装 Codex App。

先克隆仓库并安装依赖:

bash 复制代码
git clone https://github.com/BigPizzaV3/CodexPlusPlus.git
cd CodexPlusPlus
python -m pip install -e .

macOS

arduino 复制代码
python -m codex_session_delete setup

执行后自动生成 /Applications/Codex++.app,以后从这个 app 启动(启动台),不要再开原版 Codex。

卸载:

arduino 复制代码
python -m codex_session_delete remove

Windows

双击项目目录里的 setup.bat,按菜单选 Install,桌面生成 Codex++.lnk 快捷方式。

或命令行:

arduino 复制代码
python -m codex_session_delete setup

注意:必须从 Codex++ 快捷方式启动。直接开原版 Codex,注入不会生效。

它是怎么做到的(对原理不感兴趣可以跳过)

Codex 的桌面 App,底层其实是用网页技术做的------界面本质上就是一个跑在壳子里的网页。

这个壳子叫 Electron,很多你用过的桌面软件都是这么做的,比如 VS Code、Slack、Notion。

因为内核是浏览器,Chrome 官方有一套专门给开发者调试网页用的协议,叫 CDP

它原本的用途是:让你用外部工具连进浏览器,检查代码、修改页面、注入脚本。

搞明白这个之后,我让 AI 帮我写了个最简单的验证脚本:往 Codex 页面中央,强行插一个紫色弹框。

如果真能弹出来,说明外部程序确实可以直接控制 Codex 的前端页面。

第一步:用调试模式启动 Codex

ini 复制代码
/Applications/Codex.app/Contents/MacOS/Codex \
    --remote-debugging-port=9229 \
    --remote-allow-origins=http://127.0.0.1:9229 \
    > /tmp/codex-debug.log 2>&1 &

这样 Codex 启动后,本地 9229 端口就可以接受外部连接了。

第二步:用 Python 连进去,塞一段 JS

scss 复制代码
import json
import urllib.request
import websocket

print("📡 正在连接 CDP...")
targets = json.loads(urllib.request.urlopen('http://127.0.0.1:9229/json').read())
page = [t for t in targets if t['type'] == 'page'][0]
print(f"✅ 找到页面: {page['title']}")

ws = websocket.create_connection(page['webSocketDebuggerUrl'], timeout=10)
print("✅ WebSocket 已连接")

print("💉 正在注入代码...")
script = """
(function() {
    const box = document.createElement('div');
    box.innerHTML = '🎉 成功!这是你注入的代码!';
    box.style.cssText = `
        position: fixed; top: 50%; left: 50%;
        transform: translate(-50%, -50%);
        background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
        color: white; padding: 30px; border-radius: 15px;
        font-size: 20px; font-weight: bold;
        box-shadow: 0 20px 60px rgba(0,0,0,0.4); z-index: 999;
    `;
    document.body.appendChild(box);
    setTimeout(() => box.remove(), 5000);
    return '✅ 注入成功!';
})();
"""
payload = {
    "id": 1,
    "method": "Runtime.evaluate",
    "params": {
        "expression": script,
        "returnByValue": True,
        "allowUnsafeEvalBlockedByCSP": True
    }
}
ws.send(json.dumps(payload))
response = json.loads(ws.recv())
print(f"✅ {response['result']['result']['value']}")
print("\n💡 现在看你的 Codex 窗口,应该有一个紫色的通知框!")
ws.close()

脚本跑起来,终端里逐行打印连接状态:

结果下一秒,Codex 窗口中央,真的弹出了那个紫色框。

那一刻我就明白 Codex++ 在干嘛了。

它本质上不是「修改 Codex」。 而是在运行中的 Codex 页面里,动态塞进去一层新能力。

相当于你在浏览器里按 F12 打开控制台、手动粘贴一段 JS。

Codex++ 把这件事自动化了,每次帮你启动 Codex 的时候都做一遍。

这件事真正有意思的地方,其实不是插件解锁。

而是:

Codex 发布没多久,社区已经开始给它做运行时增强层了。

不改文件,不破解,用官方协议。

这很像当年的浏览器插件生态。 只是这一次,被「增强」的对象,变成了 AI 客户端。

AI IDE 的下一阶段,可能不只是模型竞争。 而是谁先形成真正的增强生态。

更多内容,欢迎关注微信公众号【子昕AI编程】查看~

相关推荐
野犬寒鸦1 小时前
Claude Code:终端AI编程助手全指南(附带指令全讲解)
开发语言·后端·面试·ai编程
無名路人1 小时前
小程序点餐页吸顶滚动
前端·微信小程序·ai编程
DogDaoDao1 小时前
【GitHub】Ruflo:面向 Claude Code 的企业级多智能体编排平台深度解析
人工智能·深度学习·大模型·github·ai编程·claude·ruflo
盼君2 小时前
用AI编程从零搭建一个响应式数据看板
ai编程·数据可视化
紫小米3 小时前
Agent的范式
prompt·embedding·ai编程
小村儿3 小时前
连载
前端·后端·ai编程
求学中--3 小时前
DeepSeek V4 API实战:从零搭建AI编程助手全流程
人工智能·ai编程
ai超级个体4 小时前
前端唯一的护城河?结合 AI 将字节组件库 Headless 化后的感想~
前端·react·ai编程·ant design·组件库·vibe coding
winlife_4 小时前
AI 怎么验证 Unity PlayMode 行为:截图 + 输入模拟的完整闭环
人工智能·unity·游戏引擎·ai编程·claude·playmode