最近 claude 封的厉害,我连续两个账号 G 了。今天看到 reddit 上有哥们分享 claude code 是如何知道是你的请求是从哪里来的,试着分析了一下,果然!!
简单来讲就是,Claude Code 在自定义 ANTHROPIC_BASE_URL 场景下,会把网关相关信息编码进一句普通 prompt 文本里。
1Today's date is 2026-06-30.
下面直接看证据。
1. 我看的是哪个包
我检查的是 npm 上的 @anthropic-ai/claude-code@2.1.196。
这个包本体主要是 wrapper 和 installer,真正逻辑在平台原生包里。我这次看的是 macOS arm64 包。
1@anthropic-ai/claude-code-darwin-arm64@2.1.196
我没有运行 Claude Code,只是下载 tarball、解包,然后用 strings 和文本搜索检查二进制里残留的 bundle 内容。
2. 它先判断你是不是走官方 API
发布包里能看到这段逻辑。
1function Crt(){
2 let e=process.env.ANTHROPIC_BASE_URL;
3 if(!e)return!0;
4 return Rrt(e)
5}
6
7function Rrt(e){
8 try{
9 let t=new URL(e).host;
10 return["api.anthropic.com"].includes(t)
11 }catch{return!1}
12}
这段代码做的事很简单。没有设置 ANTHROPIC_BASE_URL,算官方路径。
设置了 ANTHROPIC_BASE_URL,但 host 是 api.anthropic.com,也算官方路径。
只要不是官方路径,后面的判断就会继续。
3. 它读取自定义 host 和本机时区
接下来是这段。
1function Zup(){
2 if(Crt())return null;
3 let e=Qup(),t=e0t(),n=t==="Asia/Shanghai"||t==="Asia/Urumqi";
4 if(!e)return{known:!1,labKw:!1,cnTZ:n,host:null};
5 return{
6 known:Jup().some((r)=>e===r||e.endsWith("."+r)),
7 labKw:Xup().some((r)=>e.includes(r)),
8 cnTZ:n,
9 host:e
10 }
11}
这里有四个动作。
- 读取自定义 baseURL 的 host。
- 读取本机时区。
- 判断时区是不是
Asia/Shanghai或Asia/Urumqi。 - 判断 host 是否命中内置域名名单,或者是否包含指定模型关键词。
这一步还没有把信息发出去。
真正关键的是下一步。
4. 它把结果编码进撇号和日期
看这两个函数。
1function edp(e,t){
2 if(!e&&!t)return"'";
3 if(e&&!t)return"\u2019";
4 if(!e&&t)return"\u02BC";
5 return"\u02B9"
6}
7
8function Vla(e){
9 let t=Zup(),
10 n=edp(t?.known??!1,t?.labKw??!1),
11 r=t?.cnTZ?e.replaceAll("-","/"):e;
12 return`Today${n}s date is ${r}.`
13}
这里有两个编码。
第一个编码在 Today 后面的撇号里。
这里先把变量翻译成人话。
known,意思是这个 host 命中了内置域名名单。
labKw,意思是这个 host 里包含模型关键词,比如 deepseek、moonshot、zhipu 这类。
所以这不是一张「真假表」,而是一张「两个开关怎么编码成一个撇号」的表。
| 域名命中名单 | host 含模型关键词 | 实际写进 prompt 的样子 | 撇号码点 |
|---|---|---|---|
| 否 | 否 | Today's date is 2026-06-30. | U+0027 |
| 是 | 否 | Today’s date is 2026-06-30. | U+2019 |
| 否 | 是 | Todayʼs date is 2026-06-30. | U+02BC |
| 是 | 是 | Todayʹs date is 2026-06-30. | U+02B9 |
你不用记这几个撇号长什么样。
只要记住一点,肉眼看都是 Today 后面那个小点,但程序看到的是四个不同 Unicode 字符。
第二个编码在日期分隔符里。
非中国时区。
12026-06-30
Asia/Shanghai 或 Asia/Urumqi。
12026/06/30
所以同一句日期文本,实际携带了几类信息。
- 是否使用了官方 API。
- 自定义 host 是否命中内置域名名单。
- 自定义 host 是否包含模型关键词。
- 本机时区是否是两个中国时区之一。

这就是问题的核心。
它没有把标记放在一个显眼字段里。
它把标记放进了自然语言 prompt。
5. 域名名单也能解出来
名单不是明文直接摆在旁边,但混淆很轻。
发布包里能看到解码逻辑。
1function Gla(e){
2 let t=Buffer.from(e,"base64"),n="";
3 for(let r of t)n+=String.fromCharCode(r^Kup);
4 return n.split(",")
5}
6
7var Kup=91,zup="ODV3KDo1MC46MnU4NDZ3..."
逻辑是 base64 解码之后,每个字节 xor 91。
解出来以后,能看到这些域名样例。
1baidu.com
2alibaba-inc.com
3alipay.com
4antgroup-inc.cn
5kuaishou.com
6bytedance.net
7xiaohongshu.com
8moonshot.ai
9anyrouter.top
10clauddy.com
11openclaude.me
12yunwu.ai
关键词列表也有。
1deepseek
2moonshot
3minimax
4zhipu
5bigmodel
6baichuan
7stepfun
801ai
9dashscope
10volces

所以它关心的不是随便一个代理。
它明显在识别一批中国公司域名、模型服务、第三方 Claude 转发站。
6. 它为什么要这么做
从技术上来说,我能给出的判断是,Anthropic 大概率想识别一件事。
Claude Code 请求最后有没有真的走向 Claude。
但更多的是从非技术上考虑的,这一点无需多言。这个公司的价值观一直是这个得行。