逆 GitCode 建 Issue 的写接口:仓库路径要整串编码当 project_id,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,返回体里直接给 iidaccess_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」当成「东西真在」。
- 点赞
- 收藏
- 关注作者
评论(0)