[{"data":1,"prerenderedAt":217},["ShallowReactive",2],{"$fQ-Y4ggGx60PYUfFfvDJeOg8PGO3Bn7b7qLJqxArYbns":3,"$f3Fq3Vvc1RPyMVhHFov2pUb_iMkT70EUmvvI_ji0wSyQ":54},{"title":4,"date":5,"category":6,"readTime":7,"tags":8,"content":19,"_excerpt":20,"_faqs":21,"id":52,"_path":53},"沙盒期 GitHub Pages 提速收录:用 Google Indexing API 24 小时强制收录新文章","2026-07-05","工具教程","10 分钟",[9,10,11,12,13,14,15,16,17,18],"Google Indexing API","GitHub Pages","沙盒期","强制收录","sitemap","SEO","Google Search Console","Service Account","googleapis","站长工具","\u003Ch1>沙盒期 GitHub Pages 提速收录:用 Google Indexing API 24 小时强制收录新文章\u003C\u002Fh1>\n\u003Cblockquote>\n\u003Cp>\u003Cstrong>核心结论\u003C\u002Fstrong>:GitHub Pages 新站在 Google 沙盒期内,在 Search Console 点&quot;请求编入索引&quot;往往要排队半个月才轮得到。\u003Cstrong>用 Google 官方给新闻站用的 Indexing API,配合 Node.js 一键脚本批量推送 sitemap 中的所有文章 URL,可以直接走&quot;特快加急通道&quot;,24 小时内强制 Googlebot 来抓取,绕过域名低信任度限制\u003C\u002Fstrong>。前提条件:你有一个 GCP 项目 + 一个 Service Account 凭证(JSON)、把该 Service Account 加为 Search Console 站点所有者。本文给出从 GCP 申请到 Node.js 脚本跑通、再到 sitemap 自动同步增量推送的完整链路,\u003Cstrong>适用所有静态博客、独立开发站、刚上线的低权重新站\u003C\u002Fstrong>。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>\u003Cstrong>3 分钟摘要\u003C\u002Fstrong>:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>沙盒期 = Google 对新域名\u002F低权重域名的&quot;观察期&quot;,普通收录通道排队要 2-4 周\u003C\u002Fli>\n\u003Cli>Indexing API 是 Google 官方给新闻站用的快速收录接口,\u003Cstrong>任何类型站点都能用\u003C\u002Fstrong>(Google 文档明确说明)\u003C\u002Fli>\n\u003Cli>5 步走通:GCP 建项目 → 开 Indexing API → 建 Service Account → Search Console 授权 → Node.js 脚本批量推送\u003C\u002Fli>\n\u003Cli>配合 \u003Ccode>sitemap.xml\u003C\u002Fcode> 自动同步,只推送&quot;新增\u002F修改过&quot;的 URL,\u003Cstrong>一天 200 次的 publish 配额不浪费\u003C\u002Fstrong>\u003C\u002Fli>\n\u003Cli>实测新站文章 24 小时内出现在 Google 搜索结果,沙盒期直接被 Indexing API 绕过\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>事故背景\u003C\u002Fstrong>:个人博客 \u003Ca href=\"https:\u002F\u002Fapppss.com\">apppss.com\u003C\u002Fa> 部署到 GitHub Pages 第一个月,在 Google Search Console 提交了好几篇技术文章,看着&quot;已发现 → 已抓取 → 已编入索引&quot;卡在第一步两周没动;手动点&quot;请求编入索引&quot;也被排到半个月后。折腾过主动外链(reddit\u002FV2EX\u002F掘金)、sitemap 重新提交、robots.txt 调整,效果都一般。\u003Cstrong>直到用 Indexing API 把所有文章一次性 publish 过去,24 小时内全部出现在搜索结果\u003C\u002Fstrong>。本文把这条最快路径完整记录下来。\u003C\u002Fp>\n\u003Chr>\n\u003Ch2>一、问题背景:为什么 GitHub Pages 新站会被&quot;沙盒&quot;\u003C\u002Fh2>\n\u003Ch3>1.1 沙盒期的真实表现\u003C\u002Fh3>\n\u003Cp>新域名上线 GitHub Pages 后 1-3 个月,Google 搜索表现通常是这样:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>阶段\u003C\u002Fth>\n\u003Cth>现象\u003C\u002Fth>\n\u003Cth>耗时\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Cstrong>发现期\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>Search Console 显示&quot;已发现&quot;,但 Googlebot 不来抓\u003C\u002Ftd>\n\u003Ctd>1-2 周\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>抓取期\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>抓了,但只抓首页、不抓内页\u003C\u002Ftd>\n\u003Ctd>1-3 周\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>索引期\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>抓了内页,但搜索结果查不到\u003C\u002Ftd>\n\u003Ctd>2-4 周\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>排名期\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>终于有收录,但排名在第 5 页之后\u003C\u002Ftd>\n\u003Ctd>不定\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cp>\u003Cstrong>手动点&quot;请求编入索引&quot;在沙盒期基本无效\u003C\u002Fstrong> — Google 把它降级为低优先级,排队很长。\u003C\u002Fp>\n\u003Ch3>1.2 沙盒期的根因\u003C\u002Fh3>\n\u003Cp>Google 对\u003Cstrong>新域名 + 低权重 + 大量新内容\u003C\u002Fstrong>的站点有天然的&quot;观察期&quot;:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>域名年龄 &lt; 6 个月 → 信任度低\u003C\u002Fli>\n\u003Cli>外链少 → 抓取预算(Crawl Budget)被分得很低\u003C\u002Fli>\n\u003Cli>内容质量未验证 → 索引优先级低\u003C\u002Fli>\n\u003Cli>主机 IP(尤其是 GitHub Pages 共享 IP) → 被批量识别为&quot;低质量站&quot;\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>常规 SEO 优化(优质内容、外链、sitemap)对沙盒期帮助有限,Google 不会因为你有 sitemap 就破例加速。\u003Cstrong>真正能绕过沙盒期的,只有 Google 官方的&quot;特快通道&quot; — Indexing API\u003C\u002Fstrong>。\u003C\u002Fp>\n\u003Ch3>1.3 三个常见的&quot;伪解法&quot;\u003C\u002Fh3>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>伪解法\u003C\u002Fth>\n\u003Cth>实际效果\u003C\u002Fth>\n\u003Cth>为什么没用\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>在 GSC 反复点&quot;请求编入索引&quot;\u003C\u002Ftd>\n\u003Ctd>队列被合并,不加速\u003C\u002Ftd>\n\u003Ctd>沙盒期被降权,无法插队\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>重新提交 sitemap.xml\u003C\u002Ftd>\n\u003Ctd>GSC 显示&quot;已处理&quot;,但索引不动\u003C\u002Ftd>\n\u003Ctd>抓取预算没增加\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>各大平台发外链引流\u003C\u002Ftd>\n\u003Ctd>带来真实流量,但不加速索引\u003C\u002Ftd>\n\u003Ctd>Googlebot 抓取优先级不变\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cp>\u003Cstrong>只有 Indexing API 能直接要求 Googlebot 24 小时内来抓\u003C\u002Fstrong>。下面开始走通完整流程。\u003C\u002Fp>\n\u003Chr>\n\u003Ch2>二、原理:Indexing API 是什么\u003C\u002Fh2>\n\u003Ch3>2.1 一句话定义\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>Indexing API\u003C\u002Fstrong> 是 Google 官方在 2018 年开放的接口,最初给新闻站点(&quot;JobPosting&quot; 和 &quot;BroadcastEvent&quot; 结构化数据)用来\u003Cstrong>秒级推送新内容到 Google 索引\u003C\u002Fstrong>。\u003Cstrong>2024 年后 Google 文档明确:任何类型的网站都可以用,不再局限于新闻站\u003C\u002Fstrong>。\u003C\u002Fp>\n\u003Ch3>2.2 与&quot;请求编入索引&quot;的区别\u003C\u002Fh3>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>维度\u003C\u002Fth>\n\u003Cth>Search Console 请求编入索引\u003C\u002Fth>\n\u003Cth>Indexing API\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>配额\u003C\u002Ftd>\n\u003Ctd>每天 5-10 次(隐式)\u003C\u002Ftd>\n\u003Ctd>每天 200 次 publish\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>优先级\u003C\u002Ftd>\n\u003Ctd>普通队列\u003C\u002Ftd>\n\u003Ctd>特快通道(24h)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>调用方\u003C\u002Ftd>\n\u003Ctd>人工(网页点)\u003C\u002Ftd>\n\u003Ctd>程序化(脚本批量)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>适用对象\u003C\u002Ftd>\n\u003Ctd>单个 URL\u003C\u002Ftd>\n\u003Ctd>任何 URL,推荐 sitemap 批量\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>鉴权\u003C\u002Ftd>\n\u003Ctd>GSC 登录态\u003C\u002Ftd>\n\u003Ctd>Service Account JSON\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Ch3>2.3 API 接口规范\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>端点\u003C\u002Fstrong>:\u003Ccode>https:\u002F\u002Findexing.googleapis.com\u002Fv3\u002FurlNotifications:publish\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cp>\u003Cstrong>请求体\u003C\u002Fstrong>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-json\">{\n  &quot;url&quot;: &quot;https:\u002F\u002Fapppss.com\u002Fwriting\u002Fxxx\u002F&quot;,\n  &quot;type&quot;: &quot;URL_UPDATED&quot;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>type 字段说明\u003C\u002Fstrong>:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>URL_UPDATED\u003C\u002Fcode>:新增或修改(强推,本文使用)\u003C\u002Fli>\n\u003Cli>\u003Ccode>URL_DELETED\u003C\u002Fcode>:已删除(从索引移除)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>响应\u003C\u002Fstrong>:HTTP 200 + \u003Ccode>urlNotificationMetadata.latestUpdate.notifyTime\u003C\u002Fcode>(Google 登记时间)。\u003C\u002Fp>\n\u003Ch3>2.4 配额与限制\u003C\u002Fh3>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>限制项\u003C\u002Fth>\n\u003Cth>数值\u003C\u002Fth>\n\u003Cth>备注\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>每天 publish 配额\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>200 次\u002FService Account\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>超出返回 429\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>QPS(每秒请求)\u003C\u002Ftd>\n\u003Ctd>建议 ≤ 1\u003C\u002Ftd>\n\u003Ctd>太快会被限流\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>URL 必须是公开可访问\u003C\u002Ftd>\n\u003Ctd>是\u003C\u002Ftd>\n\u003Ctd>HTTP 200 才有效\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>沙盒期新站能用吗?\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>可以,且必须\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>沙盒期绕过的核心手段\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>个人博客能用吗?\u003C\u002Ftd>\n\u003Ctd>可以\u003C\u002Ftd>\n\u003Ctd>Google 文档明确&quot;任何类型&quot;\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Chr>\n\u003Ch2>三、前置准备:5 步搞定 GCP + Service Account\u003C\u002Fh2>\n\u003Ch3>第一步:创建 GCP 项目 + 启用 Indexing API\u003C\u002Fh3>\n\u003Col>\n\u003Cli>打开 \u003Ca href=\"https:\u002F\u002Fconsole.cloud.google.com\u002F\">Google Cloud Console\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>顶部下拉 → \u003Cstrong>新建项目\u003C\u002Fstrong> → 命名如 \u003Ccode>blog-indexer\u003C\u002Fcode> → 创建\u003C\u002Fli>\n\u003Cli>左侧菜单 → \u003Cstrong>APIs &amp; Services\u003C\u002Fstrong> → \u003Cstrong>Library\u003C\u002Fstrong>\u003C\u002Fli>\n\u003Cli>搜索 \u003Ccode>Indexing API\u003C\u002Fcode> → 点击 → \u003Cstrong>Enable\u003C\u002Fstrong>(启用)\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cblockquote>\n\u003Cp>⚠️ \u003Cstrong>注意\u003C\u002Fstrong>:Indexing API 不在 Library 顶部,需要搜索。启用后等 1-2 分钟生效。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch3>第二步:创建 Service Account 并下载 JSON\u003C\u002Fh3>\n\u003Col>\n\u003Cli>左侧菜单 → \u003Cstrong>IAM &amp; Admin\u003C\u002Fstrong> → \u003Cstrong>Service Accounts\u003C\u002Fstrong>\u003C\u002Fli>\n\u003Cli>顶部 \u003Cstrong>Create Service Account\u003C\u002Fstrong>:\u003Cul>\n\u003Cli>Service account name:\u003Ccode>blog-indexer\u003C\u002Fcode>(任意)\u003C\u002Fli>\n\u003Cli>Service account ID:自动生成\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Grant this service account access to project\u003C\u002Fstrong>:跳过(选 No role)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Grant users access to this service account\u003C\u002Fstrong>:跳过\u003C\u002Fli>\n\u003Cli>点击刚创建的 Service Account → \u003Cstrong>Keys\u003C\u002Fstrong> 标签 → \u003Cstrong>Add Key\u003C\u002Fstrong> → \u003Cstrong>Create new key\u003C\u002Fstrong> → 选 \u003Cstrong>JSON\u003C\u002Fstrong> → 下载\u003C\u002Fli>\n\u003Cli>\u003Cstrong>重命名\u003C\u002Fstrong> 为 \u003Ccode>service-account.json\u003C\u002Fcode>,放到项目里的 \u003Ccode>blogseo\u002F\u003C\u002Fcode> 目录(请勿提交到 Git)\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3>第三步:把 Service Account 加为 Search Console 所有者\u003C\u002Fh3>\n\u003Col>\n\u003Cli>打开 \u003Ca href=\"https:\u002F\u002Fsearch.google.com\u002Fsearch-console\">Google Search Console\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>选择你的站点资源(\u003Ccode>apppss.com\u003C\u002Fcode>)\u003C\u002Fli>\n\u003Cli>左侧 \u003Cstrong>Settings\u003C\u002Fstrong> → \u003Cstrong>Users and permissions\u003C\u002Fstrong> → \u003Cstrong>Add user\u003C\u002Fstrong>\u003C\u002Fli>\n\u003Cli>把 Service Account 的邮箱填进去(在 \u003Ccode>service-account.json\u003C\u002Fcode> 的 \u003Ccode>client_email\u003C\u002Fcode> 字段,形如 \u003Ccode>blog-indexer@xxx.iam.gserviceaccount.com\u003C\u002Fcode>)\u003C\u002Fli>\n\u003Cli>权限选 \u003Cstrong>Owner\u003C\u002Fstrong>(Full)\u003C\u002Fli>\n\u003Cli>等 1-2 分钟生效\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cblockquote>\n\u003Cp>📌 \u003Cstrong>这一步最常被忽略\u003C\u002Fstrong> — 没在 GSC 加 Service Account,API 调用会返回 403 \u003Ccode>Permission denied\u003C\u002Fcode>。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch3>第四步:验证 API 启用成功\u003C\u002Fh3>\n\u003Cp>在本地跑一个最小化测试:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">mkdir -p blogseo\ncd blogseo\nnpm init -y\nnpm install googleapis\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>创建 \u003Ccode>test.js\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-javascript\">import { google } from &#39;googleapis&#39;;\nimport { readFileSync } from &#39;fs&#39;;\n\nconst auth = new google.auth.GoogleAuth({\n  keyFile: &#39;.\u002Fservice-account.json&#39;,\n  scopes: [&#39;https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Findexing&#39;],\n});\n\nconst indexing = google.indexing({ version: &#39;v3&#39;, auth: await auth.getClient() });\n\nconst res = await indexing.urlNotifications.publish({\n  requestBody: {\n    url: &#39;https:\u002F\u002Fapppss.com\u002F&#39;,\n    type: &#39;URL_UPDATED&#39;,\n  },\n});\nconsole.log(&#39;状态:&#39;, res.status, &#39;时间:&#39;, res.data.urlNotificationMetadata?.latestUpdate?.notifyTime);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>跑 \u003Ccode>node test.js\u003C\u002Fcode>,看到 状态: 200 即配置成功。\u003C\u002Fp>\n\u003Ch3>第五步:把 service-account.json 加入 .gitignore\u003C\u002Fh3>\n\u003Cp>编辑项目根目录的 \u003Ccode>.gitignore\u003C\u002Fcode>,追加:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-gitignore\"># Google Service Account 凭证(请勿提交)\nblogseo\u002Fservice-account.json\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>并把 \u003Ccode>blogseo\u002Fservice-account.json\u003C\u002Fcode> 从 Git 历史中清理(用 \u003Ccode>git rm --cached\u003C\u002Fcode>)。\u003C\u002Fp>\n\u003Chr>\n\u003Ch2>四、核心代码:从 sitemap 自动同步增量推送\u003C\u002Fh2>\n\u003Ch3>4.1 设计思路\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Cstrong>数据源\u003C\u002Fstrong>:线上 \u003Ccode>https:\u002F\u002Fapppss.com\u002Fsitemap.xml\u003C\u002Fcode>(部署后由 Nuxt 自动生成)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>状态文件\u003C\u002Fstrong>:\u003Ccode>blogseo\u002Fstate.json\u003C\u002Fcode>,记录每个 URL 上次推送的 \u003Ccode>lastmod\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>差量推送\u003C\u002Fstrong>:对比 sitemap 的 \u003Ccode>&lt;lastmod&gt;\u003C\u002Fcode> 与 state 中记录,只推&quot;新增&quot;或&quot;修改过&quot;的 URL\u003C\u002Fli>\n\u003Cli>\u003Cstrong>每条成功立即落盘\u003C\u002Fstrong>:中途崩溃也不会重提已成功的\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>4.2 完整脚本 \u003Ccode>blogseo\u002Fpush.js\u003C\u002Fcode>\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-javascript\">import { google } from &#39;googleapis&#39;;\nimport { dirname, join } from &#39;path&#39;;\nimport { fileURLToPath } from &#39;url&#39;;\nimport { readFile, writeFile } from &#39;fs\u002Fpromises&#39;;\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst jsonKeyPath = join(__dirname, &#39;.\u002Fservice-account.json&#39;);\nconst stateFilePath = join(__dirname, &#39;.\u002Fstate.json&#39;);\n\nconst SITEMAP_URL = process.argv[2] || &#39;https:\u002F\u002Fapppss.com\u002Fsitemap.xml&#39;;\nconst FORCE = process.argv.includes(&#39;--force&#39;);\nconst PUSH_ALL = process.argv.includes(&#39;--all&#39;);\n\n\u002F\u002F 从 sitemap.xml 提取 [{ loc, lastmod }]\nfunction extractEntries(xml) {\n  const entries = [];\n  for (const m of xml.matchAll(\u002F&lt;url&gt;([\\s\\S]*?)&lt;\\\u002Furl&gt;\u002Fg)) {\n    const loc = m[1].match(\u002F&lt;loc&gt;\\s*([^&lt;]+?)\\s*&lt;\\\u002Floc&gt;\u002F)?.[1].trim();\n    const lastmod = m[1].match(\u002F&lt;lastmod&gt;\\s*([^&lt;]+?)\\s*&lt;\\\u002Flastmod&gt;\u002F)?.[1].trim() || &#39;&#39;;\n    if (loc) entries.push({ loc, lastmod });\n  }\n  return entries;\n}\n\nasync function loadState() {\n  try { return JSON.parse(await readFile(stateFilePath, &#39;utf-8&#39;)); }\n  catch (e) { if (e.code === &#39;ENOENT&#39;) return {}; throw e; }\n}\nasync function saveState(s) {\n  await writeFile(stateFilePath, JSON.stringify(s, null, 2) + &#39;\\n&#39;, &#39;utf-8&#39;);\n}\n\nfunction diff(entries, state) {\n  const todo = [], skipped = [];\n  for (const e of entries) {\n    if (!FORCE &amp;&amp; state[e.loc]?.lastmod === e.lastmod) {\n      skipped.push(e);\n    } else {\n      todo.push(e);\n    }\n  }\n  return { todo, skipped };\n}\n\nconst auth = new google.auth.GoogleAuth({\n  keyFile: jsonKeyPath,\n  scopes: [&#39;https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Findexing&#39;],\n});\n\nasync function main() {\n  let entries = extractEntries(await (await fetch(SITEMAP_URL)).text());\n  if (!PUSH_ALL) entries = entries.filter(e =&gt; e.loc.includes(&#39;\u002Fwriting\u002F&#39;));\n  console.log(`📋 解析到 ${entries.length} 个 URL${PUSH_ALL ? &#39;(含静态页)&#39; : &#39;(仅文章)&#39;}`);\n\n  const state = await loadState();\n  const { todo, skipped } = diff(entries, state);\n  console.log(`🆕 待推送: ${todo.length} | ⏭️  跳过: ${skipped.length}${FORCE ? &#39; [FORCE]&#39; : &#39;&#39;}`);\n\n  if (todo.length === 0) return console.log(&#39;\\n✨ 没有需要推送的 URL&#39;);\n\n  const client = await auth.getClient();\n  const indexing = google.indexing({ version: &#39;v3&#39;, auth: client });\n\n  for (const e of todo) {\n    console.log(`正在提交: ${e.loc} (lastmod=${e.lastmod})`);\n    const res = await indexing.urlNotifications.publish({\n      requestBody: { url: e.loc, type: &#39;URL_UPDATED&#39; },\n    });\n    const notifyTime = res.data.urlNotificationMetadata?.latestUpdate?.notifyTime || new Date().toISOString();\n    console.log(`✅ 状态 ${res.status} | notifyTime=${notifyTime}`);\n    state[e.loc] = { lastmod: e.lastmod, submittedAt: new Date().toISOString(), notifyTime };\n    await saveState(state);\n  }\n  console.log(&#39;\\n🏁 全部提交完毕&#39;);\n}\n\nmain().catch(e =&gt; console.error(&#39;❌&#39;, e.response?.data || e.message));\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>4.3 常用命令\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\"># 1) 默认:增量推送线上 sitemap 的所有文章\nnode blogseo\u002Fpush.js\n\n# 2) 推本地预览(先 npm run dev)\nnode blogseo\u002Fpush.js http:\u002F\u002Flocalhost:3000\u002Fsitemap.xml\n\n# 3) 强制全量(忽略 state.json,例如重新激活一批老文章)\nnode blogseo\u002Fpush.js --force\n\n# 4) 包括首页 \u002F about 等静态页\nnode blogseo\u002Fpush.js --all\n\n# 5) 组合\nnode blogseo\u002Fpush.js http:\u002F\u002Flocalhost:3000\u002Fsitemap.xml --force --all\n\n# 6) 清空状态全量推\nrm blogseo\u002Fstate.json &amp;&amp; node blogseo\u002Fpush.js\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>4.4 输出示例\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-text\">📋 解析到 12 个 URL(仅文章)\n🆕 待推送: 2 | ⏭️  跳过: 10\n正在提交: https:\u002F\u002Fapppss.com\u002Fwriting\u002Ffoo\u002F (lastmod=2026-07-05)\n✅ 状态 200 | notifyTime=2026-07-05T10:00:01Z\n正在提交: https:\u002F\u002Fapppss.com\u002Fwriting\u002Fbar\u002F (lastmod=2026-07-05)\n✅ 状态 200 | notifyTime=2026-07-05T10:00:02Z\n🏁 全部提交完毕\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Chr>\n\u003Ch2>五、避坑指南:6 个常见错误\u003C\u002Fh2>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>错误\u003C\u002Fth>\n\u003Cth>现象\u003C\u002Fth>\n\u003Cth>解决方法\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Cstrong>GSC 没加 Service Account\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>403 Permission denied\u003C\u002Ftd>\n\u003Ctd>Search Console → Settings → Users → Add Owner\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>API 没启用\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>403 Indexing API has not been used in project\u003C\u002Ftd>\n\u003Ctd>GCP → Library → 搜 Indexing API → Enable\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>JSON 路径错误\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>ENOENT 找不到 service-account.json\u003C\u002Ftd>\n\u003Ctd>用 \u003Ccode>__dirname\u003C\u002Fcode> 拼绝对路径,不要写相对\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>URL 没带斜杠\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>404,Google 不会处理\u003C\u002Ftd>\n\u003Ctd>确保 \u003Ccode>https:\u002F\u002Fxxx.com\u002Fwriting\u002Fyyy\u002F\u003C\u002Fcode> 末尾有 \u003Ccode>\u002F\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>一天超过 200 次\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>429 Rate Limit\u003C\u002Ftd>\n\u003Ctd>用 state.json 做增量,不要全量重提\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>推送了没收录\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>GSC 显示已处理但搜索没结果\u003C\u002Ftd>\n\u003Ctd>等 24-72 小时,Indexing API 只是&quot;加急&quot;不保证秒收录\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Chr>\n\u003Ch2>六、关键点回顾\u003C\u002Fh2>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>关键点\u003C\u002Fth>\n\u003Cth>错误做法\u003C\u002Fth>\n\u003Cth>正确做法\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>API 启用\u003C\u002Ftd>\n\u003Ctd>跳过 Library 启用步骤\u003C\u002Ftd>\n\u003Ctd>先在 GCP 搜 Indexing API 并 Enable\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>凭证存放\u003C\u002Ftd>\n\u003Ctd>把 JSON 提交到 GitHub\u003C\u002Ftd>\n\u003Ctd>放 \u003Ccode>blogseo\u002F\u003C\u002Fcode>,加进 \u003Ccode>.gitignore\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>GSC 授权\u003C\u002Ftd>\n\u003Ctd>只在 GCP 创建 Service Account\u003C\u002Ftd>\n\u003Ctd>同时在 Search Console 加为 Owner\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>URL 格式\u003C\u002Ftd>\n\u003Ctd>推送 \u003Ccode>https:\u002F\u002Fxxx.com\u002Fwriting\u002Ffoo\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>推送 \u003Ccode>https:\u002F\u002Fxxx.com\u002Fwriting\u002Ffoo\u002F\u003C\u002Fcode>(带斜杠)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>推送方式\u003C\u002Ftd>\n\u003Ctd>一次性全量推 100 个\u003C\u002Ftd>\n\u003Ctd>增量推送,只推新增\u002F修改过的\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>配额管理\u003C\u002Ftd>\n\u003Ctd>每天重提 200 次已推送的\u003C\u002Ftd>\n\u003Ctd>用 \u003Ccode>state.json\u003C\u002Fcode> 去重\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>沙盒期应对\u003C\u002Ftd>\n\u003Ctd>在 GSC 反复点&quot;请求编入索引&quot;\u003C\u002Ftd>\n\u003Ctd>直接 Indexing API 走特快通道\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>失败排查\u003C\u002Ftd>\n\u003Ctd>看到 429 就不管了\u003C\u002Ftd>\n\u003Ctd>检查 state.json,确认是新增才推\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Chr>\n\u003Ch2>七、写在最后\u003C\u002Fh2>\n\u003Cp>沙盒期不是诅咒,是 Google 对所有新站的&quot;面试期&quot;。常规 SEO 优化能帮你过面试,但\u003Cstrong>面试完不给你 Offer 时,Indexing API 就是那个能让你直接走特批的&quot;内推&quot;\u003C\u002Fstrong>。\u003C\u002Fp>\n\u003Cp>把这条自动化链路跑通之后,我再也没有手动去 GSC 点过&quot;请求编入索引&quot;。每天写完文章,部署完跑一次 \u003Ccode>node blogseo\u002Fpush.js\u003C\u002Fcode>,新文章 24 小时内稳定出现在搜索结果 — 沙盒期像从来没存在过一样。\u003C\u002Fp>\n\u003Cp>记住:\u003Cstrong>工具只是杠杆,真正决定你博客生死的,还是内容本身\u003C\u002Fstrong>。Indexing API 能帮你跑得更快,不能帮你写得更深。把它当作加速器,别当作替代品。\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>写一篇能被快速收录的文章,只是开始;写一篇值得被收录的文章,才是目的。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Chr>\n\u003Ch2>常见问题 FAQ\u003C\u002Fh2>\n\u003Ch3>沙盒期 GitHub Pages 站多久能正常收录?\u003C\u002Fh3>\n\u003Cp>通常 3-6 个月。\u003Cstrong>用 Indexing API 后可以压缩到 24-72 小时\u003C\u002Fstrong>,但本质上是&quot;加急&quot;不是&quot;破除&quot;沙盒,沙盒的域名信任度积累仍需时间。\u003C\u002Fp>\n\u003Ch3>Google Indexing API 普通人能申请吗?\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>可以\u003C\u002Fstrong>,且 Google 官方文档明确说明&quot;任何公开内容网站都可以使用&quot;,不再局限于新闻站。流程是 GCP 建项目 + Service Account + 启用 API 即可,无需审核。\u003C\u002Fp>\n\u003Ch3>Indexing API 每天 200 次配额够用吗?\u003C\u002Fh3>\n\u003Cp>对个人博客完全够用。假设你一天写 5 篇文章、修改 3 篇老文章,共 8 次 publish。\u003Cstrong>用 state.json 做增量推送,200 次配额可以覆盖一个月\u003C\u002Fstrong>。即使做迁移要重提,一次也不会超过 50 个 URL。\u003C\u002Fp>\n\u003Ch3>Indexing API 推送后多久能在 Google 搜索到?\u003C\u002Fh3>\n\u003Cp>实测沙盒期新站:\u003Cstrong>24 小时内出现在搜索结果\u003C\u002Fstrong>(GSC 显示&quot;已编入索引&quot;)。但搜索排名仍然受沙盒信任度影响,关键词排名可能还在第 3-5 页,需要靠内容质量 + 外链慢慢爬。\u003C\u002Fp>\n\u003Ch3>Service Account 凭证安全吗?要不要担心泄露?\u003C\u002Fh3>\n\u003Cp>JSON 凭证只对 Indexing API 有效,无法登录 GCP、无法访问你的 GCP 项目资源。\u003Cstrong>仍然不要提交到 Git\u003C\u002Fstrong>,因为拿到凭证的人可以批量消耗你的 200 次\u002F天配额。丢失后直接在 GCP 删 Key 重建即可。\u003C\u002Fp>\n\u003Ch3>Indexing API 能推送 sitemap 吗?\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>不能直接推送 sitemap 文件\u003C\u002Fstrong>,只能推送一个个 URL。所以本文的核心就是:\u003Cstrong>自己写脚本从 sitemap.xml 里提取 URL 批量推送\u003C\u002Fstrong>。Google 自己的搜索爬虫负责抓 sitemap,你负责&quot;特快加急&quot;。\u003C\u002Fp>\n\u003Ch3>Vercel \u002F Netlify \u002F Cloudflare Pages 站能用 Indexing API 吗?\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>任何能被 Google 抓取的公开站点都能用\u003C\u002Fstrong>,平台不限。GitHub Pages、Vercel、Netlify、Cloudflare Pages、自建 VPS 都一样,Indexing API 走的是 Google 收录通道,和你的主机无关。\u003C\u002Fp>\n\u003Ch3>Indexing API 推送后被 Google 处罚怎么办?\u003C\u002Fh3>\n\u003Cp>正常使用\u003Cstrong>不会被处罚\u003C\u002Fstrong>。Indexing API 不属于&quot;快排黑帽&quot;,它是 Google 官方接口。处罚的常见原因是:批量推送大量低质重复内容、或恶意刷量。个人博客正常使用完全没问题。\u003C\u002Fp>\n\u003Ch3>GitHub Pages 自定义域名会影响 Indexing API 吗?\u003C\u002Fh3>\n\u003Cp>不影响。\u003Ccode>https:\u002F\u002Fapppss.com\u002F...\u003C\u002Fcode> 和 \u003Ccode>https:\u002F\u002Fxxx.github.io\u002Fxxx\u002F...\u003C\u002Fcode> 在 Google 看来是两个不同的 URL,推送哪个就索引哪个。\u003Cstrong>推荐统一推自定义域名的 URL\u003C\u002Fstrong>,因为这是用户最终访问的地址。\u003C\u002Fp>\n\u003Ch3>Indexing API 和 Search Console 的&quot;请求编入索引&quot;能同时用吗?\u003C\u002Fh3>\n\u003Cp>可以,但没必要。\u003Cstrong>Indexing API 已经包含了&quot;请求编入索引&quot;的功能,且更强更快\u003C\u002Fstrong>。同时用只会浪费 GSC 的配额。建议 Indexing API 跑脚本,Search Console 只看数据统计,不再点&quot;请求编入索引&quot;。\u003C\u002Fp>\n\u003Chr>\n\u003Cblockquote>\n\u003Cp>本文只做 Indexing API 沙盒期提速的实操分享,不构成 Google 官方推荐。请遵守 Google 搜索规范,合法合规使用 API 接口。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n","3 分钟摘要: 沙盒期 = Google 对新域名\u002F低权重域名的\"观察期\",普通收录通道排队要 2-4 周 Indexing API 是 Google 官方给新闻站用的快速收录接口,任何类型站点都能用(Google 文档明确说明) 5 步走通:GCP 建项目 → 开 Indexing API → 建",[22,25,28,31,34,37,40,43,46,49],{"question":23,"answer":24},"沙盒期 GitHub Pages 站多久能正常收录?","通常 3-6 个月。用 Indexing API 后可以压缩到 24-72 小时,但本质上是\"加急\"不是\"破除\"沙盒,沙盒的域名信任度积累仍需时间。",{"question":26,"answer":27},"Google Indexing API 普通人能申请吗?","可以,且 Google 官方文档明确说明\"任何公开内容网站都可以使用\",不再局限于新闻站。流程是 GCP 建项目 + Service Account + 启用 API 即可,无需审核。",{"question":29,"answer":30},"Indexing API 每天 200 次配额够用吗?","对个人博客完全够用。假设你一天写 5 篇文章、修改 3 篇老文章,共 8 次 publish。用 state.json 做增量推送,200 次配额可以覆盖一个月。即使做迁移要重提,一次也不会超过 50 个 URL。",{"question":32,"answer":33},"Indexing API 推送后多久能在 Google 搜索到?","实测沙盒期新站:24 小时内出现在搜索结果(GSC 显示\"已编入索引\")。但搜索排名仍然受沙盒信任度影响,关键词排名可能还在第 3-5 页,需要靠内容质量 + 外链慢慢爬。",{"question":35,"answer":36},"Service Account 凭证安全吗?要不要担心泄露?","JSON 凭证只对 Indexing API 有效,无法登录 GCP、无法访问你的 GCP 项目资源。仍然不要提交到 Git,因为拿到凭证的人可以批量消耗你的 200 次\u002F天配额。丢失后直接在 GCP 删 Key 重建即可。",{"question":38,"answer":39},"Indexing API 能推送 sitemap 吗?","不能直接推送 sitemap 文件,只能推送一个个 URL。所以本文的核心就是:自己写脚本从 sitemap.xml 里提取 URL 批量推送。Google 自己的搜索爬虫负责抓 sitemap,你负责\"特快加急\"。",{"question":41,"answer":42},"Vercel \u002F Netlify \u002F Cloudflare Pages 站能用 Indexing API 吗?","任何能被 Google 抓取的公开站点都能用,平台不限。GitHub Pages、Vercel、Netlify、Cloudflare Pages、自建 VPS 都一样,Indexing API 走的是 Google 收录通道,和你的主机无关。",{"question":44,"answer":45},"Indexing API 推送后被 Google 处罚怎么办?","正常使用不会被处罚。Indexing API 不属于\"快排黑帽\",它是 Google 官方接口。处罚的常见原因是:批量推送大量低质重复内容、或恶意刷量。个人博客正常使用完全没问题。",{"question":47,"answer":48},"GitHub Pages 自定义域名会影响 Indexing API 吗?","不影响。https:\u002F\u002Fapppss.com\u002F... 和 https:\u002F\u002Fxxx.github.io\u002Fxxx\u002F... 在 Google 看来是两个不同的 URL,推送哪个就索引哪个。推荐统一推自定义域名的 URL,因为这是用户最终访问的地址。",{"question":50,"answer":51},"Indexing API 和 Search Console 的\"请求编入索引\"能同时用吗?","可以,但没必要。Indexing API 已经包含了\"请求编入索引\"的功能,且更强更快。同时用只会浪费 GSC 的配额。建议 Indexing API 跑脚本,Search Console 只看数据统计,不再点\"请求编入索引\"。\n---\n> 本文只做 Indexing API 沙盒期提速的实操分享,不构成 Google 官方推荐。请遵守 Google 搜索规范,合法合规使用 API 接口。","google-indexing-api-fast-index","\u002Fwriting\u002Fgoogle-indexing-api-fast-index\u002F",[55,57,76,91,108,125,143,155,164,175,185,196,207],{"id":52,"title":4,"date":5,"category":6,"readTime":7,"tags":56,"_excerpt":20,"_path":53},[9,10,11,12,13,14,15,16,17,18],{"id":58,"title":59,"date":60,"category":61,"readTime":62,"tags":63,"_excerpt":74,"_path":75},"ai-music-creator-first-album","AI 让我成为音乐创作人：第一张专辑《未乱》与主打歌《鱼肚白》的诞生全流程","2026-06-18","创业人生","9 分钟",[64,65,66,67,68,69,70,71,72,73],"AI 音乐","Suno","Udio","豆包","Gemini","音乐创作","独立创作","副业变现","腾讯音乐","专辑发行","AI 把音乐创作的门槛从\"会乐器 + 懂乐理\"降到\"会写主题 + 会挑曲风\"，普通人也能成为音乐创作者 三步走完整路径：AI 写词 → AI 谱曲演唱 → 发行到平台 主流工具组合：豆包 \u002F Gemini（写词）+ Suno \u002F Udio \u002F 谱乐 AI（谱曲演唱） 主打歌《鱼肚白》从第一行歌词到腾","\u002Fwriting\u002Fai-music-creator-first-album\u002F",{"id":77,"title":78,"date":60,"category":61,"readTime":62,"tags":79,"_excerpt":89,"_path":90},"kalodata-market-research","如何用 Kalodata 做 TikTok 选品市场调研：10 分钟看懂一个赛道",[80,81,82,83,84,85,86,87,88,71],"Kalodata","TikTok 选品","选品方法论","市场调研","TikTok Shop","类目大盘","联盟达人","独立开发","出海","3 分钟摘要： 选品失败的 90% 原因不是产品不好，而是赛道没看清就开干 Kalodata 的「类目大盘」是最高效的市场调研入口，单页覆盖六个核心维度 优先选 增长中 + 盘子大 + 竞争分散 + 联盟达人驱动 + $10–30 主流价格带 + 新品占比高 的类目 价格带 $10–$30 是 Ti","\u002Fwriting\u002Fkalodata-market-research\u002F",{"id":92,"title":93,"date":60,"category":94,"readTime":62,"tags":95,"_excerpt":106,"_path":107},"kan-da-zuo-xiao-futures-trading","期货「看大做小」趋势交易法：从前辈点拨到实操悟道的完整路径（日线 + 30分钟 + RSI 临界点入场）","交易心得",[96,97,98,99,100,101,102,103,104,105],"期货交易","看大做小","多周期共振","趋势交易","日线","30分钟","5分钟","RSI指标","入场点","顺势交易","3 分钟摘要： 看大做小 = 大周期定方向 + 小周期找入场 + RSI 等临界点 周期组合按交易风格选：波段 = 日线 + 30分钟 \u002F 5分钟（本文重点） 大周期判方向三件套：均线排列、高低点结构、关键支撑阻力 小周期入场三件套：回调企稳、K 线反转形态、RSI 临界点 越是简单的事越难执行——","\u002Fwriting\u002Fkan-da-zuo-xiao-futures-trading\u002F",{"id":109,"title":110,"date":60,"category":94,"readTime":111,"tags":112,"_excerpt":123,"_path":124},"trading-for-a-living-book-summary","《以交易为生》核心思想精读：三重筛选 + 2% 风险 + 鳄鱼原则，三大支柱撑起一个交易者的底层操作系统","12 分钟",[113,114,115,116,117,118,119,120,121,122],"以交易为生","Alexander Elder","三重筛选","鳄鱼原则","资金管理","交易心理","交易系统","趋势跟踪","2% 风险","交易日志","交易是Mind（心理）+ Method（方法）+ Money（资金） 三位一体的职业，三者缺一不可 三重过滤筛选系统（Triple Screen） 是本书核心方法论：用周线定趋势 → 日线找回调 → 60 分钟找入场点 2% 风险原则：单笔交易最大亏损不超过账户总资金的 2% 6% 月度原则：单月累","\u002Fwriting\u002Ftrading-for-a-living-book-summary\u002F",{"id":126,"title":127,"date":128,"category":129,"readTime":7,"tags":130,"_excerpt":141,"_path":142},"cdn-anti-scan-vps-architecture","海外 VPS 的 CDN 加速与网站防探测架构（Cloudflare + nginx 反代 + WebSocket 后端完整方案）","2026-06-14","网络工具",[131,132,133,134,135,136,137,138,139,140],"Cloudflare","nginx","反向代理","WebSocket","CDN 加速","网站防探测","VPS 安全","端口扫描","指纹识别","Origin 证书","3 分钟摘要： VPS 真实 IP 暴露后，会被扫描器 24\u002F7 探测，443 端口指纹泄露 用 Cloudflare CDN 隐藏真实 VPS IP（免费方案） 真实 WebSocket \u002F API 服务跑在 127.0.0.1 的非标准端口，永不对外暴露 nginx 终结 TLS + 转发 We","\u002Fwriting\u002Fcdn-anti-scan-vps-architecture\u002F",{"id":144,"title":145,"date":128,"category":6,"readTime":146,"tags":147,"_excerpt":153,"_path":154},"telegram-86-login-recovery","86 手机号无法登录 Telegram 终极解决方案：绕过付费验证码 + 旧设备验证找回账号","8 分钟",[148,149,150,151,152],"Telegram","86手机号","账号找回","二次验证","短信收费","3 分钟摘要： 86 号码 + 邮箱 + 二次验证密码 = 找回账号的三要素，缺一不可 用第三方客户端 Telega（绕过 Google Play 校验版本）登录，触发邮箱 + 2FA 通道 登录成功后再用官方 Telegram 登录、更新到最新版本 整个过程不需要原手机短信、不需要旧设备在线","\u002Fwriting\u002Ftelegram-86-login-recovery\u002F",{"id":156,"title":157,"date":158,"category":61,"readTime":146,"tags":159,"_excerpt":162,"_path":163},"indie-developer-journey","从零到一：我的独立开发之路","2026-05-15",[87,160,161],"创业","个人成长","2023年初，我做出了一个重要决定：离开稳定的工作，成为一名独立开发者。这个决定并非一时冲动，而是经过深思熟虑的结果。","\u002Fwriting\u002Findie-developer-journey\u002F",{"id":165,"title":166,"date":167,"category":168,"readTime":111,"tags":169,"_excerpt":173,"_path":174},"vue3-composition-api","Vue 3 Composition API 完全指南","2026-04-28","技术教程",[170,171,172],"Vue","JavaScript","前端","Composition API 是 Vue 3 引入的一组基于函数的 API，它允许我们使用函数来组织组件逻辑，而不是选项对象。","\u002Fwriting\u002Fvue3-composition-api\u002F",{"id":176,"title":177,"date":178,"category":168,"readTime":7,"tags":179,"_excerpt":183,"_path":184},"react-native-performance","React Native 性能优化实战","2026-04-15",[180,181,182],"React Native","性能","移动端","在开发 React Native 应用时，我们经常会遇到以下性能问题：","\u002Fwriting\u002Freact-native-performance\u002F",{"id":186,"title":187,"date":188,"category":94,"readTime":189,"tags":190,"_excerpt":194,"_path":195},"futures-trading-seven-rules","期货交易的七条铁律：从亏损到稳定盈利的思考","2026-03-20","5 分钟",[96,94,191,192,120,193],"交易思维","止损","心法","做期货这几年，踩过的坑、爆过的仓、熬过的夜，最终都沉淀成这七条心得。期货交易本质上不是预测行情，而是管理自己。以下每一条都是真金白银换来的，建议反复读、慢慢悟。","\u002Fwriting\u002Ffutures-trading-seven-rules\u002F",{"id":197,"title":198,"date":199,"category":200,"readTime":189,"tags":201,"_excerpt":205,"_path":206},"git-workflow-best-practices","Git 工作流最佳实践","2026-03-10","开发工具",[202,203,204],"Git","团队协作","版本控制","这是一个经典的分支模型：","\u002Fwriting\u002Fgit-workflow-best-practices\u002F",{"id":208,"title":209,"date":210,"category":168,"readTime":211,"tags":212,"_excerpt":215,"_path":216},"typescript-tips","TypeScript 实用技巧","2026-02-25","7 分钟",[213,172,214],"TypeScript","编程技巧","使用类型守卫来缩小类型范围：","\u002Fwriting\u002Ftypescript-tips\u002F",1783250040730]