逆 GitCode 建 Issue 的写接口:仓库路径要整串编码当 project_id,Bearer 令牌不能少

举报
yd_241537561 发表于 2026/11/04 17:07:35 2026/11/04
【摘要】 给 GitCode 上的公开仓库提 Issue,页面 UI 能点,脚本要接口。实测结论三条:写口不在 /api/v2 上,而在 issuepr 服务的 POST /issuepr/api/v1/issue/{仓库路径}/issues;body 里的 project_id 要的是整串 URL 编码后的 namespace,不是项目详情接口回的那个数字 id;鉴权只带 Cookie 会被判 403「您没有此操作权限」,必须把 localStorage 里的 access_token 原样当 Bearer 带上。

要在脚本里给 GitCode 的公开仓提 Issue,页面上人是能点的,接口得自己逆。第一反应是去 /api/v2 找——读接口全在那儿:GET /api/v2/projects/{路径} 给 id、star_count、starred、default_branch。但照着 GitLab 的习惯往 /api/v4/projects/{id}/issues 或者 /api/v2/projects/{id}/issues 打,全是 404。真正的写口藏在另一个服务前缀下。

一、路由与请求体

POST https://web-api.gitcode.com/issuepr/api/v1/issue/{enc}/issues
content-type: application/json

{
  "title": "README 的项目结构里列了 requirements.txt,但仓库里没有这个文件",
  "description": "正文(Markdown 字符串)",
  "project_id": "{enc}",
  "field_list": []
}

关键点在 {enc}:urllib.parse.quote("agent-best-practices/pptx-optimizer", safe=""),也就是把 namespace/path 整串编码成一个路径段塞在 URL 里,同时把同一串字符串放进 body 的 project_id。我一开始拿项目详情接口回的 id=11207071 填进 project_id,同一个口回的就是那句「您没有此操作权限」——数字 id 在这条链路上根本不是主键。

二、鉴权要 Bearer,不是 Cookie

读接口拿 Cookie 就够,写接口不行。实测两种回法:

只带 Cookie                         -> 403 您没有此操作权限
带 Authorization: Bearer <access_token> -> 200,返回体里直接给 iid

access_token 就是站点 localStorage 里那个 JWT。浏览器里它是自动带的,脚本里漏掉就只剩 403,而 403 的文案又写着「权限」,很容易误判成账号没有提 Issue 的资格,跑去换账号。顺带把页面自己发的那批头一并抄全(x-app-channel: gitcode-fe、x-app-version: 0、x-device-id、x-device-type、x-network-type、x-os-version、x-platform: web),少抄也没报错,但照抄最省事。

三、怎么把它逆出来的

猜是猜不出 issuepr 这个前缀的。可行的路子是让页面自己交代:在浏览器里给 fetch 和 XMLHttpRequest 打钩子,然后按正常流程点一次「新建 Issue」,把真实请求的 method、URL、header、body 逐条打出来。这里有一个坑值得记:如果用 CDP 的 Network.requestWillBeSent 收,Runtime.evaluate 里由页面发起的请求会被消息派发吞掉(我这边一条都没收到),所以钩子要装在页面文档里,把结果写回一个全局变量再读回来。

四、读回和列表接口

建完要能核对,两个口:GET /issuepr/api/v1/issue/{enc}/issues/{iid} 和 GET .../issues?scope=all&state=opened&page=1&per_page=5。详情返回的字段比想象中多,实测有 iid / state / created_at / closed_at / category / custom_fields / discussion_locked / downvotes / due_date / enterprise_labels / hide_reason / assignees / labels 这一堆。列表接口最容易踩的是顶层形状:它是 {all, closed, issues, opened},条目在 issues 下面,而不是 list 或 data;顺手记三个计数就够判断「我提的那条还在不在」(我测的三个仓分别是 42/35/7、29/29/0、125/108/17)。

小结

这条链路上没有哪一步是难的,难的在全是「看着像别的东西」的信号:404 让你以为接口不存在,403 让你以为账号没权限,数字 id 让你以为它就是主键。顺序应该是:先确认页面真实请求(逆路由),再逐项替换变量定位鉴权(Cookie / Bearer / id 与路径),最后把读口和写口的形状一起记下来。写完记得用详情接口读回一次,别把「HTTP 200」当成「东西真在」。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。