Skip to content

Cloudflare 部署返回 code 9000:上游按出口 IP 拦截(且 needle/chat 现已匿名开放) #5

Description

@KardeniaPoyu

现象

在 Cloudflare Workers 上部署后,GET /healthz 正常,但 POST /v1/chat/completions 稳定失败:

{"error":{"message":"请求上游失败","type":"upstream_error"}}

src/upstream/muc.ts 加日志后看到:上游 needle/chat/completions/stream 返回 HTTP 200,但响应体是

{"code":"9000","msg":"<服务端把中文替换成了问号>","data":null,"count":null}

且响应缺少 Chat-Question-Id,于是走进 throw new Error("上游响应缺少 Chat-Question-Id")

定位

  • CAS 登录本身正常,fetchAccessToken 能拿到合法的 468 字符 JWT(exp 正常、aud 正常)。
  • 带这个 JWT 请求 needle/chatcode 9000
  • 完全不带 Authorization / Cookie,只保留 Clientid: aipc_100050 头 → 仍然 code 9000
  • 同样这两种请求,改从普通 VPS / 校园网出口发 → 都正常,能拿到 Chat-Question-Id 和完整流式回答。

结论:so.muc.edu.cn 针对 Cloudflare 出口 IP 做了拦截(统一返回 9000),跟 token 无关。Workers 无法指定出口地址,所以这个仓库的一键部署目前整体不可用

附带发现

学校已经把 needle/chat/completions/stream 对匿名开放了——只要带 Clientid: aipc_100050 头,不需要任何 CAS token 就能用 deepseek-v3-minda 做通用问答。
(网页版那些「自习室查询 / 课表 / 成绩」等校园服务智能体仍需要登录态 + extendParams.agentCode,走的是同一个端点。)

建议

  • README 里补一条「Cloudflare 出口 IP 被上游拦截」的已知限制;
  • 或者提供一个非 Cloudflare 的部署形态(普通 Node / Docker 常驻服务),在出口 IP 不受限的机器上就能正常用。

环境:wrangler 4.90.0,compatibility_date 2025-05-11,Workers 出口 SJC。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions