Skip to content

Latest commit

 

History

History
291 lines (216 loc) · 14.9 KB

File metadata and controls

291 lines (216 loc) · 14.9 KB

Windows Copilot API:基于微软 Copilot 的免费 OpenAI 兼容 API 桥接器

📖 English version (README.md)


Windows Copilot API — 免费、免 API Key 且兼容 OpenAI 的微软 Copilot API 桥接服务

本项目将您的个人微软 Copilot(copilot.microsoft.com)网页端转化为可在代码中直接调用的标准 LLM API。 无需购买 API Key,无需预存额度,无需订阅付费计划。 本项目专为个人开发者与教育研究设计,完美支持:

  • 🐍 作为 Python 库直接调用:在代码中简单执行 client.chat("你好") 即可。支持多轮会话上下文追踪及打字机式的流式输出(Streaming)。
  • 🔌 作为本地 OpenAI 兼容服务器运行:在本地 http://localhost:8000/v1 启动 Web 服务。它完整适配 OpenAI 接口规范,这意味着官方 openai SDK 以及任何支持自定义 API 基础路径的第三方客户端(如 OneAPI、NextChat、Dify 等)均可无缝无感地用本项目进行平替

您只需在浏览器中完成一次微软账号的扫码/密码登录,系统就会安全地保存您的本地会话,并在后续运行中自动完成凭证的静默刷新。

⚠️ 声明: 本项目为非官方开源项目,与微软公司(Microsoft)无任何关联或背书关系。本项目仅用于个人学习、研究与自动化测试,请在遵守微软服务条款的前提下合理、合规地使用。


🌟 本项目独创的五大核心增强特性

相比其他同类开源桥接器,本项目针对 Windows 平台及复杂的网络环境进行了深度重构与工业级优化,具有以下绝对优势:

  1. 🤖 Windows 智能一键启动与诊断(独创) 提供极客化的 .\start_service.ps1 PowerShell 脚本。每次启动时,它会自动调用 verify_auth.py 模拟连接微软服务器以智能诊断您的 session/token.json 登录凭证是否有效。若失效,自动拉起浏览器引导登录;若有效,则自动强杀任何占用 8000 端口的残留僵尸 Python 进程,实现秒级无缝重启与日志实时跟踪。
  2. 🔌 复杂代理环境自适应(独创) Windows 下的代理工具常常会自动将系统环境变量设为 socks5h://。但底层的 curl_cffi 库在建立 WebSocket 握手时无法直接解析 socks5h 协议,导致抛出 WinError 10061 握手失败或 TLS 链接错误。本项目在驱动层与浏览器层加入了自适应协议转换引擎,自动将 socks5h:// 降级转换为标准的 socks5:// 协议,彻底扫除网络代理障碍。
  3. 🛡️ 终端 GBK 编码崩溃防御(独创) 在 Windows 默认的命令提示符(CMD)或 PowerShell 终端下运行 Python 脚本时,如果 Copilot 输出的内容中包含特殊的 emoji 表情符号(如 🍎, 🤖 等),经常会触发系统的 UnicodeEncodeError: 'gbk' codec can't encode... 异常,进而导致 WebSocket 线程中断崩溃。本项目在驱动初始化时注入了标准 I/O 动态流重构机制sys.stdout.reconfigure(errors="replace")),彻底免除终端编码崩溃的隐患。
  4. ⚡ 0-I/O 极致性能缓存 在处理高频的首屏刷新与历史探测报告加载时,本项目将报告扫描机制由循环磁盘检索优化为“单次扫描 + 内存缓存字典映射”架构,省去了高频的 stat().st_mtime 物理磁盘系统调用,即使在百度网盘等高延迟的云同步盘环境下运行,首屏刷新依然能实现毫秒级响应。
  5. 🎭 多样化创作风格支持 完美支持三种微软官方对话样式(模型):
    • copilot:平衡模式(Balanced)
    • copilot-creative:创造力模式(Creative)
    • copilot-precise:精确模式(Precise)

🛠️ 快速开始(2分钟上手)

系统要求

  • Python 3.9+
  • 拥有一个微软账号(免费的个人账号即可)
  • 支持 Windows、macOS 和 Linux 操作系统

1. 克隆项目与环境准备

打开终端,运行以下命令克隆项目并进入目录:

git clone https://github.com/transcentlin/Copilot-API.git
cd Copilot-API

2. 创建并激活虚拟环境

根据您的操作系统选择对应的激活方式:

  • Windows (PowerShell)
    python -m venv venv
    venv\Scripts\Activate.ps1

    💡 注:若提示禁止运行脚本,可先在 PowerShell 中执行一次授权命令:Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned

  • macOS / Linux
    python3 -m venv venv
    source venv/bin/activate

3. 安装依赖与首次登录

# 1. 安装核心依赖
pip install -r requirements.txt

# 2. 安装 Playwright 专用的 Chromium 浏览器内核(仅需执行一次)
playwright install chromium

# 3. 首次安全登录:系统将弹出一个 Chrome 窗口,请在其中正常登录您的微软账号
python -m copilot login

登录成功后,浏览器会自动关闭。您的会话状态将被安全地保存在本地的 session/ 目录中(该目录已被 .gitignore 排除,绝不会上传或共享给任何人),后续运行无需重复登录。


🚀 Windows 用户专属:一键智能启动(强烈推荐)

如果您使用的是 Windows 系统,我们强烈建议您直接运行我们精心编写的一键启动脚本:

.\start_service.ps1

它将自动为您处理一切起承转合:

  1. 自动凭证校验:通过连接测试确定 session/token.json 中的 Cookie 是否过期。
  2. 智能唤醒登录:若凭证失效,自动拉起登录窗口供您重新扫码/登录;若有效,则跳过,免除打扰。
  3. 端口清理:自动查找并强制结束后台占用 8000 端口的旧 Python 进程,避免端口冲突。
  4. 拉起服务:平稳启动 FastAPI 服务,并将实时请求日志打印在控制台上。

🐳 使用 Docker 运行 (可选)

如果您更倾向于容器化部署,本项目同样支持使用 Docker 运行 OpenAI 兼容服务器:

⚠️ 重要提示: 请先在宿主机上完成上述的 首次安全登录 步骤(python -m copilot login)。因为 Docker 容器通常处于无桌面的 Headless 环境,无法弹出初始的登录浏览器窗口。容器启动时会通过卷挂载(Volume Mount)直接读取并复用宿主机中已生成的 session/ 凭证,并自动在后台完成后续的 token 刷新。

使用 Docker Compose 一键启动

docker compose up --build
# 成功启动!OpenAI 兼容 API 将运行在 http://localhost:8000

docker-compose.yml 已经默认配置了 8000 端口映射与 session/ 目录的绑定挂载。您也可以在此文件中调整速率限制变量 RATE_LIMIT_RPM

使用纯 Docker 命令运行

如果您不想使用 Compose,可以直接通过以下两步完成构建和运行:

# 1. 构建镜像
docker build -t copilot-api .

# 2. 挂载本地 session 目录并运行
docker run --rm -p 8000:8000 -v "$(pwd)/session:/app/session" copilot-api

💻 使用方法 1:在 Python 中直接作为库调用

如果您开发的项目本身就是 Python,这是最快捷、最轻量的集成方式(无需在后台开启 FastAPI Web 服务器):

from copilot import CopilotClient

# 1. 初始化客户端(自动载入您保存在本地的登录会话)
client = CopilotClient()

# 2. 简单单轮对话,获取完整回复
reply = client.chat("用一句话简短地向我问好。")
print(reply.text)

# 3. 开启连续多轮对话 — 将上轮的 conversation_id 传回即可
reply2 = client.chat("现在请用法语再说一遍?", conversation_id=reply.conversation_id)
print(reply2.text)

# 4. 打字机流式输出(流式对话)
print("\n正在生成搞笑段子:")
for chunk in client.stream("讲一个关于程序员的冷笑话"):
    print(chunk, end="", flush=True)
print()

🔌 使用方法 2:作为 OpenAI 兼容服务器运行

1. 启动服务器

python app.py
# -> Copilot OpenAI 兼容 API 已在 http://127.0.0.1:8000 成功运行
  • 提示:您可以通过环境变量修改绑定的主机和端口,例如:HOST=0.0.0.0 PORT=8080 python app.py

2. 使用官方 OpenAI SDK 接入

启动本地服务器后,您可以像调用 OpenAI 官方接口一样,直接使用 openai 官方库进行调用(只需将 base_url 指向本地,API Key 填任意非空字符串即可):

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:8000/v1", 
    api_key="here-is-any-string"  # 必需但不会被校验
)

# 支持三种模型:copilot (平衡), copilot-creative (创造力), copilot-precise (精确)
resp = client.chat.completions.create(
    model="copilot-creative",
    messages=[
        {"role": "user", "content": "写一首关于秋天的简短四句诗。"}
    ],
    stream=True  # 同样完美支持 stream 流式输出!
)

for chunk in resp:
    content = chunk.choices[0].delta.content
    if content:
        print(content, end="", flush=True)

3. 使用 curl 命令行请求

您也可以使用标准的 HTTP 工具(如 curl 或 Postman)直接向接口发送 POST 请求:

curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "copilot-creative",
    "messages": [{"role": "user", "content": "你好!"}],
    "stream": false
  }'

🛣️ 支持的路由列表

请求方法 路由地址 功能说明
POST /v1/chat/completions 智能对话接口(支持 "stream": true 和传递 "conversation_id"
GET /v1/models 获取当前支持的模型列表(copilot, copilot-creative, copilot-precise

🛠️ 命令行快速问答

除了代码集成,您也可以通过命令行进行快速会话管理:

# 扫码或密码登录,保存会话凭证
python -m copilot login

# 快速单次提问
python -m copilot ask "地球到月球的距离是多少?"

🚦 并发控制与压力测试

微软 Copilot 网页端是基于单用户设计的,其底层的 WebSocket 通信协议不支持来自同一个账号的并发对话流。 为了确保服务器不会因为并发请求而崩溃或返回乱序内容,本桥接器在服务端(server/api.py)设计了全局请求串行化队列锁:所有的并发 HTTP 请求在进入服务后都会自动排队,以串行方式依次向上游微软发送。

这意味着高并发请求会排队等待,并导致响应时间的累加。 您可以运行项目自带的压力测试工具,它会以 2 的指数级(1 → 2 → 4 → 8 ...)不断加倍并发数,直到测出性能瓶颈:

# 终端 1:启动服务器
python app.py

# 终端 2:运行压力测试
python tests/stress.py
  • 最佳实践建议:请保持并发请求在合理范围(推荐并行度为 1~4)。这是一款优秀的个人桥接工具,请不要使用海量并发恶意请求,珍惜您的微软账号安全。

⏳ 自带速率限制 (Rate Limiting)

为了进一步保护微软账号不被判定为异常,本服务器内置了基于**令牌桶算法(Token Bucket)**的速率限流器(server/ratelimit.py)。当您的调用频率超出安全上限时,服务器会返回标准的 HTTP 429 状态码与 Retry-After 响应头。

限流参数可以通过两个环境变量进行调节:

  • RATE_LIMIT_RPM:每分钟允许的最大请求数(默认值为 12。设为 0 可彻底禁用限流)。
  • RATE_LIMIT_BURST:短时间内允许突发的请求数(默认值为 4)。
# 调大限流参数启动服务
RATE_LIMIT_RPM=20 RATE_LIMIT_BURST=5 python app.py
  • 客户端重试机制:由于 429 限流和偶尔的上游 502 属于短暂波动,建议在您的客户端代码中加入指数退避重试机制(如延迟 1s, 2s, 4s 后重试)。官方 openai SDK 已经默认内置了这种重试退避机制,并会自动处理 Retry-After 头,因此使用 SDK 可以有效规避此类报错。

📂 项目结构说明

Copilot-API/
├── copilot/             # 核心库:处理客户端初始化、Auth授权、Playwright登录与协议驱动
├── server/              # FastAPI 服务端实现:包含接口路由与速率限制机制
├── examples/            # 丰富且开箱即用的调用示例(Python库、OpenAI SDK、流式输出等)
├── tests/               # 测试脚本目录(包含并发压力测试与限流测试)
├── app.py               # 核心入口:运行此文件启动 FastAPI 兼容服务器
├── verify_auth.py       # 智能诊断:模拟发包以快速验证本地凭证是否过期
├── start_service.ps1    # 强力一键启动:Windows 用户的智能运维管理脚本
├── requirements.txt     # Python 依赖清单
├── Dockerfile           # Docker 镜像构建配置
└── docker-compose.yml   # Docker 容器编排配置

❓ 常见问题排查与注意事项

1. 部署在云服务器/VPS上时,为什么 WebSocket 会卡住或提示 RuntimeError: Copilot error: invalid-event

  • 原因分析:由于微软使用了 Cloudflare 等高级防爬服务,很多数据中心的公网 IP(Datacenter IP)会被直接拦截或要求进行人机身份验证(Turnstile),使得 Headless 状态下的 WebSocket 握手卡在验证环节。
  • 解决方案:建议在该服务器上通过桌面环境打开 Chrome 浏览器访问 copilot.microsoft.com 手动通过一次“确认您是人类”的验证。这会生成最新的 cf_clearance 缓存 Cookie,保存到 session/ 后即可自动复用。或者,您也可以将服务器的出口流量通过住宅代理(Residential Proxy)路由。

2. 在 Docker 中运行,为什么依然提示需要登录?

  • 原因分析:Docker 容器默认不带有可视化桌面,无法拉起扫码登录浏览器。
  • 解决方案:请严格按照文档说明,先在宿主机上运行 python -m copilot login 完成首次登录,确保本地生成了有效的 session/ 文件夹,然后再启动 Docker 容器。Docker Compose 已经做好了卷挂载,会自动读取该目录。

📄 开源许可证

本项目基于个人学习与教育研究目的开源。您在使用过程中应自行承担相应责任,并自觉遵守微软的服务条款。祝您开发愉快!