Betsy Blog - 技术博客文章列表

置顶
Unity-Skills 被 DeepWiki 收录 —— 我的开源项目新里程碑
我的开源项目 Unity-Skills 被 DeepWiki 自动索引并生成了完整的技术文档。从个人项目到被知识平台认可,聊聊这个用 REST API 驱动 AI 操控 Unity 的自动化框架背后的故事。
826 字
4 分钟
-- --
Unity-Skills 被 DeepWiki 收录 —— 我的开源项目新里程碑
还在嫌弃Windows难用?不妨来体验一下隐藏功能
Windows的默认设计有很多人都反馈难用,那是你默认用的都是残血Win,不妨使用PowerToys来解锁满血Windows,变得更加人性化
580 字
3 分钟
-- --
还在嫌弃Windows难用?不妨来体验一下隐藏功能
Claude Code 终端美化指南
2026-02-26
2026-05-28
习惯了 IDE 的你,面对 Claude Code 原始的终端界面是否感到不适?本篇手把手教你从状态栏到字体全面美化 Claude Code,让命令行也能赏心悦目。
806 字
4 分钟
-- --
Claude Code 终端美化指南
ClaudeCode下载代理(Worker)
2026-02-24
2026-02-25
通过 Cloudflare Worker 搭建 Claude Code 安装代理,解决国内无法直接下载的问题
1977 字
10 分钟
-- --
ClaudeCode下载代理(Worker)
\n`;\n\n return new Response(html, {\n status: 200,\n headers: { \"Content-Type\": \"text/html; charset=utf-8\" },\n });\n }\n\n // 安装脚本:从 claude.ai 拉取,改写 GCS 链接指向自身\n if (ALLOWED_INSTALL.has(path)) {\n const upstreamUrl = CLAUDE + path;\n const { controller, cancel } = withTimeout(15000);\n\n let upstream;\n try {\n const fetchOpts = {\n method: request.method,\n headers: {\n \"User-Agent\": request.headers.get(\"User-Agent\") || \"Mozilla/5.0\",\n Accept: \"*/*\",\n },\n redirect: \"follow\",\n signal: controller.signal,\n };\n upstream = await fetch(upstreamUrl, fetchOpts);\n } catch (e) {\n cancel();\n return new Response(\n `Upstream fetch failed (install script)\\nTime: ${new Date().toISOString()}\\nError: ${String(e)}\\n`,\n {\n status: 504,\n headers: secHeaders({ \"X-Proxy-Error\": \"install_fetch_failed\" }),\n }\n );\n } finally {\n cancel();\n }\n\n // HEAD 直接透传状态 + 头(不读 body)\n if (request.method === \"HEAD\") {\n const h = new Headers(upstream.headers);\n h.set(\"Cache-Control\", \"no-store, max-age=0, must-revalidate\");\n h.set(\"Pragma\", \"no-cache\");\n h.set(\"Expires\", \"0\");\n h.set(\"X-Content-Type-Options\", \"nosniff\");\n h.set(\"X-Proxy-Source\", `rewrite:${path}`);\n return new Response(null, { status: upstream.status, headers: h });\n }\n\n if (!upstream.ok) {\n return buildUpstreamErrorResponse({\n title: \"Failed to fetch install script from claude.ai\",\n upstreamResp: upstream,\n extraHeaders: { \"X-Proxy-Source\": `rewrite:${path}` },\n });\n }\n\n // ---- 大小保护:先查 Content-Length 头 ----\n const cl = Number(upstream.headers.get(\"content-length\") || \"0\");\n if (cl > MAX_INSTALL_SCRIPT_SIZE) {\n await upstream.body?.cancel();\n return new Response(\n `Install script too large (content-length: ${cl})\\n`,\n {\n status: 502,\n headers: secHeaders({ \"X-Proxy-Source\": `rewrite:${path}` }),\n }\n );\n }\n\n const text = await upstream.text();\n\n // ---- 大小保护:再查实际 body 长度(Content-Length 可能缺失或不准) ----\n if (text.length > MAX_INSTALL_SCRIPT_SIZE) {\n return new Response(\"Install script body too large\\n\", {\n status: 502,\n headers: secHeaders({ \"X-Proxy-Source\": `rewrite:${path}` }),\n });\n }\n\n // 改写 GCS 链接 → 走自身代理\n // PowerShell: $GCS_BUCKET = \"https://storage.googleapis.com/...\"\n let rewritten = text.replace(\n /\\$GCS_BUCKET = \"https:\\/\\/storage\\.googleapis\\.com\\/([^\"]+)\"/g,\n `$GCS_BUCKET = \"${SELF_BASE}/gcs/$1\"`\n );\n // Shell: GCS_BUCKET=\"https://storage.googleapis.com/...\"\n rewritten = rewritten.replace(\n /GCS_BUCKET=\"https:\\/\\/storage\\.googleapis\\.com\\/([^\"]+)\"/g,\n `GCS_BUCKET=\"${SELF_BASE}/gcs/$1\"`\n );\n // CMD: set \"GCS_BUCKET=https://storage.googleapis.com/...\"\n rewritten = rewritten.replace(\n /set \"GCS_BUCKET=https:\\/\\/storage\\.googleapis\\.com\\/([^\"]+)\"/g,\n `set \"GCS_BUCKET=${SELF_BASE}/gcs/$1\"`\n );\n\n return new Response(rewritten, {\n status: 200,\n headers: {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n \"Cache-Control\": \"no-store, max-age=0, must-revalidate\",\n Pragma: \"no-cache\",\n Expires: \"0\",\n \"X-Content-Type-Options\": \"nosniff\",\n \"X-Proxy-Source\": `rewrite:${path}`,\n },\n });\n }\n\n // /gcs/*:代理到 storage.googleapis.com(白名单路径)\n if (path.startsWith(\"/gcs/\")) {\n const gcsPath = path.slice(\"/gcs/\".length);\n\n if (!isAllowedGcsPath(gcsPath)) {\n return new Response(\"Forbidden\", { status: 403, headers: secHeaders() });\n }\n\n // 转发查询字符串\n const target = `https://storage.googleapis.com/${gcsPath}${url.search}`;\n\n // 白名单转发请求头,不泄漏 Cookie / Authorization / 用户 IP 等\n const fwdHeaders = new Headers();\n const FORWARD = [\n \"Range\",\n \"Accept\",\n \"Accept-Encoding\",\n \"If-None-Match\",\n \"If-Modified-Since\",\n ];\n for (const h of FORWARD) {\n const v = request.headers.get(h);\n if (v) fwdHeaders.set(h, v);\n }\n fwdHeaders.set(\"User-Agent\", \"CloudflareWorker/1.0\");\n\n // exe/二进制文件按版本路径缓存,latest 和 manifest 不缓存\n const isCacheable = !gcsPath.endsWith(\"/latest\") && !gcsPath.endsWith(\"/manifest.json\");\n const isExe = gcsPath.endsWith(\"/claude.exe\");\n const timeoutMs = isExe ? 600000 : 20000;\n const { controller, cancel } = withTimeout(timeoutMs);\n\n let upstream;\n try {\n const fetchOpts = {\n method: request.method,\n headers: fwdHeaders,\n redirect: \"follow\",\n signal: controller.signal,\n cf: isCacheable\n ? { cacheEverything: true, cacheTtl: 86400 }\n : { cacheEverything: false, cacheTtl: 0 },\n };\n upstream = await fetch(target, fetchOpts);\n } catch (e) {\n cancel();\n return new Response(\n `Upstream fetch failed (gcs proxy)\\nTime: ${new Date().toISOString()}\\nError: ${String(e)}\\n`,\n {\n status: 504,\n headers: secHeaders({\n \"X-Proxy-Error\": \"gcs_fetch_failed\",\n \"X-Proxy-Source\": `gcs:${gcsPath}`,\n }),\n }\n );\n } finally {\n cancel();\n }\n\n // 304 Not Modified:透传(CF 缓存层内部条件请求可能产生)\n if (upstream.status === 304) {\n const respHeaders = new Headers(upstream.headers);\n respHeaders.set(\"X-Proxy-Source\", `gcs:${gcsPath}`);\n respHeaders.set(\"X-Content-Type-Options\", \"nosniff\");\n return new Response(null, { status: 304, headers: respHeaders });\n }\n\n // 非 2xx:返回友好错误,状态 502(避免客户端工具误当正常内容)\n if (!(upstream.status >= 200 && upstream.status < 300)) {\n return buildUpstreamErrorResponse({\n title: \"GCS upstream returned non-2xx\",\n upstreamResp: upstream,\n extraHeaders: { \"X-Proxy-Source\": `gcs:${gcsPath}` },\n });\n }\n\n // 成功:流式透传 body\n const respHeaders = new Headers(upstream.headers);\n respHeaders.set(\"Cache-Control\", isCacheable ? \"public, max-age=86400\" : \"no-store, max-age=0\");\n respHeaders.set(\"X-Proxy-Source\", `gcs:${gcsPath}`);\n respHeaders.set(\"X-Content-Type-Options\", \"nosniff\");\n // 确保保留 Content-Length 和 Content-Type\n if (!respHeaders.has(\"Content-Type\")) {\n respHeaders.set(\"Content-Type\", \"application/octet-stream\");\n }\n\n return new Response(upstream.body, {\n status: upstream.status,\n headers: respHeaders,\n });\n }\n\n return new Response(\"Not Found\", { status: 404, headers: secHeaders() });\n },\n};\n```\n## 3.2 Worker 路由\n\n我们利用 Worker 的路由来进行转发(***workers.dev 域名在大陆无法正常访问***),请务必填写为 `你的加速域名/*`:\n\n![Worker路由图片](/images/ClaudeCode3.webp)\n\n然后记录下你的 Worker 分配的子域名,例如 `abc.abc.workers.dev`:\n\n![Worker子域图片](/images/ClaudeCode2.webp)\n\n# 4. 加速域名配置\n\n来到你托管在 Cloudflare 的域名下,选择 **DNS** — **记录**,将你预定的加速域名 CNAME 指向**你的 Worker 分配的子域名**,如图所示(记得开启小黄云):\n\n![DNS域名图片](/images/ClaudeCode6.webp)\n\n# 5. 使用\n\n部署完成后,访问你的加速域名:\n\n> 能否成功下载也取决于你的网络能否正常连接到 Cloudflare,***请耐心等待***,Worker 速度可能不太稳定。\n\n![加速域名图片](/images/ClaudeCode1.webp)\n\n然后选择适合你终端的下载方式(以 PowerShell 为例):\n```powershell\nirm https://c.ai0728.com.cn/install.ps1 | iex\n```\n成功效果:\n\n![成功代理图片](/images/ClaudeCode5.webp)","filePath":"src/content/posts/claudecode_install_proxy.md","digest":"3df293ff9bfd1ac0","rendered":{"html":"

1. Claude Code 是什么?#

简单来讲,Claude Code 就是一款 AI 智能编程工具,具有强大的 Vibe Coding 能力,详细介绍请看 Claude Code 使用笔记

\n

2. 入门安装#

\n

由于不可抗因素,Claude 的母公司 Anthropic 对中国大陆拒绝提供 AI 服务,禁止使用 Claude 系列模型。但我们仅仅只是想使用 Claude Code 这个工具(Claude Code ≠ AI 模型),所以不要再发出类似于”Cursor 不如 Claude”这种驴唇不对马嘴的言论了。

\n

官方的 NPM 安装方式已处于废弃状态,更推荐使用原生安装

但正如前文所说,如果直接使用官方命令(国内正常网络环境下):

Unity Skills - 让AI直接操控Unity编辑器
一套让AI直接操控Unity的自动化方案:270+技能、批处理、事务回滚,兼容Antigravity/Claude Code/Gemini CLI等主流终端。
455 字
2 分钟
-- --
Unity Skills - 让AI直接操控Unity编辑器
Unity-PICO-共享空间锚点开发
这是我个人2025年下半年中的一个较为出色的MR(Mixed Reality)原理研究,这一部分国内知识分享很少,知识垄断明显,故决定为后来的其他要研究这方面的做出更多的经验分享!
2622 字
13 分钟
-- --
Unity-PICO-共享空间锚点开发
Antigravity登陆FAQ解决方法!
2025-12-28
2026-01-22
解决 Antigravity 登录时出现 FAQ 错误的完整指南。排查节点质量、账号国家归属地问题,以及网页端提示成功但仍显示 FAQ 的终极解决方案,帮助你顺利使用 Gemini AI 服务。
363 字
2 分钟
-- --
Antigravity登陆FAQ解决方法!
GeminiCLI账号切换插件,让你的开发之路不在繁琐!
2025-12-21
2026-02-18
最近Unity项目开始庞大了,单一的网页交互式AI开发效率远不如编译器内AI,但是我都没拿到钱也不想使用CluadeCode;诶,送了我n个学生Pro的Google大善人又发力了!
317 字
2 分钟
-- --
GeminiCLI账号切换插件,让你的开发之路不在繁琐!
写作概览
23 篇
文章
1.8万
总字数
1.5h
阅读时长
763
均字数
年度发文
2026
6
2025
17
热门文章
最长文章