小白安装Claude Code完整教程:Windows从零装好并接入Crazyrouter(附403解决方法)
第一次装Claude Code(一款在终端里工作的AI编码工具)的人,很容易卡在同一个位置:程序装完了,敲claude --version也能看到版本号,可一启动就弹出一行403。这一篇把从零安装到真正跑通的每个动作写清楚,按顺序做就行。
这篇写给谁看:用Windows电脑、没写过代码或刚开始学、想用Claude Code却一直连不上的人。
做完能得到什么:命令能执行、配置能解析、模型能回话、后台有记录。这四件事同时成立才算真的装好,只满足其中一件都不算。
全文以Windows 10/11和PowerShell为例。文中
YOUR_CRAZYROUTER_API_KEY与YOUR_MODEL_ID都是占位符,执行前替换成你自己创建的值。

上图就是这篇要处理的情况:程序已经在电脑上了,请求却没被送去正确的地方。
开工前,先对着这张表检查一遍
| 要准备的东西 | 具体是什么 | 从哪里获取 |
|---|---|---|
| 一台Windows电脑 | Windows 10或Windows 11都行 | 你自己的机器 |
| 一个终端窗口 | 系统自带的PowerShell | 开始菜单搜索 |
| Node.js | 22或更高版本,只在npm路线下需要 | Node.js官网下载页 |
| 一个可用邮箱 | 用来注册账号 | 你常用的邮箱 |
| Crazyrouter的API Key | 一串调用密钥 | 注册后在控制台创建 |
最后一项是全文最容易弄混的地方。登录密码、邮箱验证码、API Key是三样互不相同的东西,Claude Code只认最后这个,另外两个填进去都不会生效。
七个步骤,一步都别跳
每一步按同一套写法展开:先说要做什么,再给要敲的命令,最后写清应该看到的结果。上一步没出现预期结果,就先停下解决,别急着往下走。
第1步:打开PowerShell,弄清命令要输在哪里
在开始菜单里搜到PowerShell并打开;习惯用Windows Terminal的,新建一个PowerShell标签页也一样。看到形如PS C:\Users\你的用户名>的提示符,才是本文说的输入位置。提示符本身不用复制,只复制代码框里的内容,一次一条。
如果你此刻正停在Claude Code的聊天界面上,先退出回到普通PowerShell窗口。安装命令不是聊天内容,发给模型不会有任何作用。
第2步:安装Claude Code
两条路线任选一条走通就行,不要两条都装一遍。
路线一,官方原生脚本。 按当前官方安装文档,Windows下PowerShell的原生命令是:
powershell
irm https://claude.ai/install.ps1 | iex
执行前先确认域名是claude.ai。原生安装不需要预先装Node.js,所以"没装Node.js就一定装不上"这句话只对下面的路线二成立。装完按提示处理PATH,必要时关掉窗口重开,再确认一次:
powershell
claude --version
路线二,npm安装。 先到Node.js官网下载页取Windows的LTS安装包,按向导装完并重开终端。当前文档要求Node.js 22或更高版本,旧教程里的低版本别照搬。
powershell
node --version
npm.cmd --version
npm.cmd install -g @anthropic-ai/claude-code
claude.cmd --version
包名结尾就是claude-code,-g与包名之间有一个空格。这里刻意写成npm.cmd和claude.cmd,是为了绕开Windows上一个小坑:npm会同时生成.cmd与.ps1两个包装器,PowerShell有时会选到.ps1,而它可能被执行策略拦下。写清楚.cmd,等于指定走命令解释器。
两条路线都可能碰到的报错,先放在一起看:

看到上面这一屏不必逐行找错。报错里出现的var、<script type="text/javascript">全是JavaScript和HTML的东西。毛病不在PowerShell身上,而在于有人让它去读一份网页源码。这通常说明你拿到的是被拦截后返回的页面,不是安装脚本。这条路线到此为止,改成路线二更省时间。

如果报错是E404,把报错里的包名一个字符一个字符读完。图里的包名是@anthropic-ai/claude-codenpm,末尾多挂了npm,原因是上一条命令和这一条粘成了同一行。这跟网络、跟镜像源都没关系,清空重敲即可。
顺带说一句:按本次查到的文档,Windows版在没装Git for Windows时也能靠PowerShell执行Shell命令,需要拉仓库、管版本时再装,别把"先装Git"写进前置步骤。
第3步:注册Crazyrouter,创建一把API Key
用浏览器打开https://crazyrouter.com,按页面提示注册并登录。进控制台后找到密钥页面,新建一把Key。名字取一个以后能认出来的,比如claude-code-windows,顺手确认一下有效期、额度与可用模型范围,然后把Key复制下来存好------离开页面通常就看不全了。
这一步别跟登录密码、邮箱验证码混在一起,前面说过,Claude Code要的只是这串Key。
第4步:写配置文件,让Claude Code知道去哪儿找模型
用户级配置对任何目录启动的Claude Code都生效,路径固定是:
text
%USERPROFILE%\.claude\settings.json
先确保目录存在,顺手给可能已有的旧配置留一份备份:
powershell
New-Item -ItemType Directory -Path "$env:USERPROFILE\.claude" -Force | Out-Null
$cfgPath = Join-Path $env:USERPROFILE '.claude\settings.json'
if (Test-Path -LiteralPath $cfgPath) {
Copy-Item -LiteralPath $cfgPath -Destination "$cfgPath.bak-$(Get-Date -Format 'yyyyMMdd-HHmmss')"
}
notepad.exe $cfgPath
把下面这段填进去。文件不存在就新建;保存时确认文件名是settings.json,别变成settings.json.txt。
json
{
"env": {
"ANTHROPIC_BASE_URL": "https://cn.crazyrouter.com",
"ANTHROPIC_AUTH_TOKEN": "YOUR_CRAZYROUTER_API_KEY"
}
}
填的时候守三条规矩:字段名、网址、Key都用英文双引号包住;不要写//注释;最后一项后面不留逗号。文件里本来已经有env的,就在里面补,别弄出两个env。
这里有个细节值得单独讲:ANTHROPIC_BASE_URL的位置只写域名部分就够了,也就是https://cn.crazyrouter.com。后面的/v1和/v1/messages由客户端自己拼接,你一旦手动补上,实际请求路径会变成/v1/v1/messages这样的重复结构,回来的只有404。OpenAI兼容客户端的习惯正好相反(那边一般必须带/v1),照抄过来就会踩这个坑。这些机器调用的地址不要带UTM参数。
第5步:搞清楚403到底从哪儿来
真正造成"地址改完还是403"的,是变量名选错了。这两个变量发出去的请求头并不一样:
| 变量名 | 实际发出的请求头 | 面向的对象 |
|---|---|---|
ANTHROPIC_API_KEY |
x-api-key: <你的key> |
Anthropic官方API |
ANTHROPIC_AUTH_TOKEN |
Authorization: Bearer <你的token> |
自定义或兼容网关 |
一旦写的是ANTHROPIC_API_KEY,等于告诉客户端"我手里是官方密钥",它会继续沿官方通道走,此时ANTHROPIC_BASE_URL填得再准也拉不回来。这就是"地址明明改了却一直403"的成因。两把凭据不要为了保险同时塞进去。
想确认配置写得对不对,可以读一次文件:
powershell
$ccJson = Get-Content -Raw -LiteralPath (Join-Path $env:USERPROFILE '.claude\settings.json') | ConvertFrom-Json
[pscustomobject]@{
Endpoint = $ccJson.env.ANTHROPIC_BASE_URL
TokenReady = -not [string]::IsNullOrWhiteSpace([string]$ccJson.env.ANTHROPIC_AUTH_TOKEN)
}
看到正确的地址和TokenReady: True,只能说明文件语法没问题,不证明Key有效 。也不要整段打印$ccJson再截图,那会把真实Key亮在屏幕上。
第6步:给Claude Code指定一个模型
先把当前Key能用的模型列出来:
powershell
$rootUrl = ([string]$ccJson.env.ANTHROPIC_BASE_URL).TrimEnd('/')
$authHdr = @{ Authorization = "Bearer $($ccJson.env.ANTHROPIC_AUTH_TOKEN)" }
$modelList = Invoke-RestMethod -Uri "$rootUrl/v1/models" -Headers $authHdr -Method Get -TimeoutSec 30
$modelList.data | Select-Object id
从返回的ID里挑一个。不要拿营销名称或旧截图上的名字当ID,直接复制接口返回的那串字符。挑好之后写进配置:
json
{
"env": {
"ANTHROPIC_BASE_URL": "https://cn.crazyrouter.com",
"ANTHROPIC_AUTH_TOKEN": "YOUR_CRAZYROUTER_API_KEY"
},
"model": "YOUR_MODEL_ID"
}
保存后退出旧会话,重新开一个终端。
第7步:提一个最小的问题,验证真的接通了
先在个人目录下建一个练习文件夹,不要拿真实项目试:
powershell
$probeDir = Join-Path $env:USERPROFILE 'cc-selftest'
New-Item -ItemType Directory -Force -Path $probeDir | Out-Null
Set-Location $probeDir
claude -p "请回一个OK就行,别读文件、别跑命令。"
用npm方式装的人,把命令里的claude改成claude.cmd再执行,预期输出一个干净的OK。
拿到OK之后,回控制台的使用日志按时间和Key名字筛一次:时间对不对得上、模型是不是你选的那个、有没有请求记录和用量。客户端有回答、后台有记录,才叫接通;只有一边,都还不能下结论。
附录一:命令与配置速查
| 用途 | 命令或内容 |
|---|---|
| 查环境 | node --version / npm.cmd --version / claude --version |
| 原生安装 | `irm https://claude.ai/install.ps1 |
| npm安装 | npm.cmd install -g @anthropic-ai/claude-code |
| 升级 | npm.cmd update -g @anthropic-ai/claude-code |
| 卸载 | npm.cmd uninstall -g @anthropic-ai/claude-code |
| 配置文件 | %USERPROFILE%\.claude\settings.json |
| 模型清单 | https://cn.crazyrouter.com/v1/models |
| 对话接口 | https://cn.crazyrouter.com/v1/messages |
卸载只会移除命令行工具,配置文件还留在%USERPROFILE%\.claude\目录里,需要彻底清理时再手动删除,删之前先把有用的配置抄出来。
附录二:报错对照表
| 看到的现象 | 大概哪里出了问题 | 先做哪个动作 |
|---|---|---|
提示找不到claude |
命令没装好或PATH没生效 | 重开终端,检查PATH |
| npm报E404 | 包名敲错或两条命令粘连 | 逐字符读完报错里的包名 |
JSON粘进PowerShell报ParserError |
操作位置不对 | JSON属于文件,不属于命令行 |
报错里出现api.anthropic.com |
请求没走你配的地址 | 检查ANTHROPIC_BASE_URL与变量名 |
| 401或403 | 变量名用错 | 核对是不是用了ANTHROPIC_AUTH_TOKEN |
ConnectionRefused |
请求被本地代理挡下 | 查被拒的主机与端口 |
| 模型不存在、无可用渠道 | 模型ID或额度有问题 | 核对精确ID、协议与额度 |
关于403,当时的报错原文是:
text
Failed to connect to api.anthropic.com: Status 403
这行字读三点就够:看到403,说明请求已经到达服务端、被对方明确回绝(网络不通拿到的是超时,不会有状态码);看到主机名是api.anthropic.com,说明请求压根没走Crazyrouter;再加上"版本号正常"这个前提,结论就很清楚------问题不在安装本身,而在请求的落点和身份。
如果报错指向127.0.0.1或localhost上的某个端口,多半是本地代理没在监听。把示例里的7890换成你自己报错里的真实端口:
powershell
Test-NetConnection 127.0.0.1 -Port 7890
Test-NetConnection cn.crazyrouter.com -Port 443
TcpTestSucceeded=False只说明这条TCP连接没建立起来,它连远端都还没碰到,自然不能拿来证明Key有问题。这两条命令也只测通断,不验证TLS、密钥与模型权限。
本次实测记录
下面这组数字来自2026年9月28日本机的实际运行:
| 观察项 | 数值 |
|---|---|
| 系统与终端 | Windows 10、Windows PowerShell |
| 运行时 | Node.js v22.22.2、npm 10.9.7 |
| 客户端 | Claude Code 2.1.281 |
| 配置文件 | settings.json解析通过,只用ANTHROPIC_AUTH_TOKEN |
| 模型清单接口 | HTTP 200,共161个ID |
| 对话接口 | HTTP 200,内容为OK,stop_reason=end_turn |
| 响应标识 | msg_011CfVJqbN2DVuqoYqgLcdNE |
| 用量 | 输入18、输出4 |
| 耗时 | 直连11569 ms、客户端5103 ms |
| 客户端结果 | exit 0、is_error=false、subtype=success |
| 会话 | a7a76f08-fa36-4a36-8787-3f2b24dad626 |
最小核验使用的请求体是这样的:
json
{
"model": "claude-fable-5-1",
"max_tokens": 32,
"messages": [
{ "role": "user", "content": "Reply with exactly OK." }
]
}
这段JSON是HTTP请求体,不要存成settings.json,也不要直接丢进PowerShell执行。测试用的是隔离的配置目录、凭据只经进程环境传入,所以它证明的是"这套配置当时能通"。模型ID和价格会随渠道变化,以你查询时的/v1/models与控制台为准。
附录三:不想动配置文件时,先在当前窗口试一次
有时候你只是想确认地址和Key到底通不通,还没打算长期配置。这时可以不碰settings.json,直接在这个PowerShell窗口里临时塞两个变量:
powershell
$env:ANTHROPIC_BASE_URL = 'https://cn.crazyrouter.com'
$env:ANTHROPIC_AUTH_TOKEN = 'YOUR_CRAZYROUTER_API_KEY'
claude -p "请回一个OK就行,别读文件、别跑命令。"
这样设置的变量只在当前窗口里存在,窗口一关就没了,不会写进系统设置,也不会污染已经配好的长期配置。它适合做一次快速对照:如果这样能出OK,说明地址和Key都没问题,再去第4步写文件;如果这样也报403,就说明问题出在凭据本身,而不是配置文件。执行期间别运行会打印这两个变量的命令,免得Key被亮在屏幕上。
附录四:配置到底该放在哪一层
新手装完之后,最容易遇到的下一个困惑是"我明明改了配置,为什么没生效"。原因通常是这台机器上有不止一份配置。按作用范围,可以分成三种:
| 放在哪里 | 具体位置 | 生效范围与优先级 |
|---|---|---|
| 临时 | 不写文件,用$env:在当前窗口临时设置 |
窗口关掉就失效,优先级最高 |
| 用户级(本文推荐先配这个) | %USERPROFILE%\.claude\settings.json |
这台电脑的任何目录都能读到 |
| 项目级 | 项目根目录下的.claude\settings.json |
只对该项目生效,优先级高于用户级 |
第一次安装,把用户级配好就够了,不需要三层都动。等你以后手上有多个项目、想给某个项目单独换模型或换端点时,再加项目级的那份。排查"改了不生效"的时候,顺序是:先看命令行有没有临时的$env:变量盖在上面,再看当前工作目录下是不是躺着一份项目级配置,最后才回头看用户级的那份。三种配置改完之后,都要重开会话才会重新读取。
参考资料
免责声明:本文为个人安装与排错的经验记录,不是官方文档。软件版本、第三方服务、模型名称与价格都会随时间变化,请以你使用时各平台的官方页面为准;接口地址与配置路径同样以官方最新说明为准。全文不含佣金、返利或商业赞助。