官方页面说要「声明 User-Agent」,实际执行的是一份三层拒绝名单。在这里改一个字符再发一次:把仓库地址写进请求头会被拒,而 Node 的裸默认值放行。第二个展台是列式数组——十六个平行数组,下标 i 才是一条申报。
目标 URL 固定在服务端,两次请求之间只有这个头不同 —— 状态码因此是 证据,而不是轶事。
路径与 submissions 里是零填充字符串,companyconcept 里是裸数字 —— 直接 join 一条都对不上。
User-Agent: yApis registry probe (catforest.dev; personal use)
前缀
curl · python-requests
以此开头即拒,裸字符串前缀而非整词
整词
wget · java
任意位置出现这个词即拒,更长的词放行
子串
github.com · github.io · go-http-client · axios/ · okhttp
任意位置出现即拒,不看词边界
| User-Agent | 实测 | 说明 |
|---|---|---|
| yApis registry probe (catforest.dev; personal use) | 200 | the client's own header |
| (空) | 403 | empty User-Agent value |
| yApis registry probe (github.com) | 403 | substring "github.com" inside an otherwise passing header |
| yApis registry probe (github.io) | 403 | substring "github.io" inside an otherwise passing header |
| yApis registry probe (go-http-client) | 403 | substring "go-http-client" inside an otherwise passing header |
| yApis registry probe (axios/) | 403 | substring "axios/" inside an otherwise passing header |
| yApis registry probe (okhttp) | 403 | substring "okhttp" inside an otherwise passing header |
| wget/1.0 | 403 | word "wget" leading the header |
| yApis registry probe (wget) | 403 | word "wget" later in the header |
| yApis registry probe (wgetscript-toolkit) | 200 | "wget" as part of a longer word |
| java/1.0 | 403 | word "java" leading the header |
| yApis registry probe (java) | 403 | word "java" later in the header |
| yApis registry probe (javascript-toolkit) | 200 | "java" as part of a longer word |
| curl/1.0 | 403 | prefix "curl" leading the header |
| yApis registry probe (curl) | 200 | "curl" later in the header |
| curly/1.0 yApis | 403 | "curly" — a longer word starting with the prefix |
| python-requests/1.0 | 403 | prefix "python-requests" leading the header |
| yApis registry probe (python-requests) | 200 | "python-requests" later in the header |
| python-requestsy/1.0 yApis | 403 | "python-requestsy" — a longer word starting with the prefix |
| node | 200 | Node's own default fetch header |