<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>永恒欲望</title><description>stulanez</description><link>https://stulanez.com/</link><templateTheme>Firefly</templateTheme><templateThemeVersion>6.16.4</templateThemeVersion><templateThemeUrl>https://github.com/CuteLeaf/Firefly</templateThemeUrl><lastBuildDate>2026年10月9日 16:53:58</lastBuildDate><item><title>「扒站」：把九个顶级设计站搬回家，一次讲完方法论</title><link>https://stulanez.com/posts/design-lib-reverse-engineering/</link><guid isPermaLink="true">https://stulanez.com/posts/design-lib-reverse-engineering/</guid><description>从指纹识别到本地跑通，完整拆解九个高难度设计站的抓取与复刻管线——XOR 反爬、Cloudflare 穿透、SPA 回退陷阱、WebGL 纹理、多前缀铺设。工具全部开源，其他 Agent 可直接复刻。</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;vibecoding 最大的问题不是模型不会写代码，是&lt;strong&gt;你说不出你想要什么&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;“高级感”、“留白多一点”、“动效丝滑一点”——这些词丢给 Agent，它只能给你一个 Bootstrap 味的居中标题。它缺的不是能力，是&lt;strong&gt;参照物&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;所以我干了件更直接的事：&lt;strong&gt;把九个顶级设计站，完整搬到本地，能跑，能改，能拆。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这一篇是全过程。不是”我抓了九个站”的炫耀，是&lt;strong&gt;方法论和管线&lt;/strong&gt;——你（或者你的 Agent）照着能原样复刻。&lt;/p&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;一、先明确一件事：什么叫「完整复刻」&lt;a href=&quot;#一先明确一件事什么叫完整复刻&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;我要的&lt;strong&gt;不是&lt;/strong&gt;截图拼一个像的，也&lt;strong&gt;不是&lt;/strong&gt;用 AI 重新画一个。&lt;/p&gt;&lt;p&gt;我要的是：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;原站的 HTML + CSS + JS + 字体 + 图片 + 数据，全部落到本地，开个服务器就能跑起来，改一行代码就生效。&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;这样它才叫”参照物”。你可以打开 DevTools，看它的 &lt;code&gt;cubic-bezier(.19,1,.22,1)&lt;/code&gt; 到底用在哪；可以把它的 24 条缓动曲线整段抄进自己的项目；可以把它那个 &lt;code&gt;mix-blend-mode: difference&lt;/code&gt; 的 logo 拆出来研究。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;关键判断：本地化（Localize），而不是重写（Rewrite）。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这是我这次最重要的一个决策。我一开始也想过”读懂它然后重写”——放了。因为：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;重写的必然结果是&lt;strong&gt;降级&lt;/strong&gt;。你会漏掉 30% 的细节，而那 30% 正是”高级感”的来源。&lt;/li&gt;
&lt;li&gt;本地化是&lt;strong&gt;零损耗&lt;/strong&gt;的。构建产物就是构建产物，它跑起来和原站一模一样。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;二、九个目标，四种难度&lt;a href=&quot;#二九个目标四种难度&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;先说清战场。九个站，栈完全不同，难度分四档：&lt;/p&gt;










































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;#&lt;/th&gt;&lt;th&gt;站&lt;/th&gt;&lt;th&gt;栈&lt;/th&gt;&lt;th&gt;难度&lt;/th&gt;&lt;th&gt;卡点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;01&lt;/td&gt;&lt;td&gt;Paolo Vendramini&lt;/td&gt;&lt;td&gt;Nuxt 3 + Strapi&lt;/td&gt;&lt;td&gt;⭐⭐&lt;/td&gt;&lt;td&gt;13 个懒加载 chunk 不在 HTML 里&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;02&lt;/td&gt;&lt;td&gt;Obys Agency&lt;/td&gt;&lt;td&gt;自研框架&lt;/td&gt;&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;&lt;td&gt;&lt;strong&gt;XOR 混淆资源路径 + 反爬&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;03&lt;/td&gt;&lt;td&gt;Seventeen&lt;/td&gt;&lt;td&gt;Webflow + GSAP&lt;/td&gt;&lt;td&gt;⭐⭐⭐&lt;/td&gt;&lt;td&gt;&lt;code&gt;integrity&lt;/code&gt; 哈希 + 死掉的 vendor 脚本&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;04&lt;/td&gt;&lt;td&gt;Camille Mormal&lt;/td&gt;&lt;td&gt;PHP + 自研&lt;/td&gt;&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;&lt;td&gt;&lt;strong&gt;动态 JSON 取页 + 44 个缺失资源&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;05&lt;/td&gt;&lt;td&gt;Cipher&lt;/td&gt;&lt;td&gt;Nuxt 3 + Three.js&lt;/td&gt;&lt;td&gt;⭐⭐⭐&lt;/td&gt;&lt;td&gt;Prismic 图片防盗链&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;06&lt;/td&gt;&lt;td&gt;Pacôme Pertant&lt;/td&gt;&lt;td&gt;Nuxt 3 + Sanity&lt;/td&gt;&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Cloudflare 拦截&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;07&lt;/td&gt;&lt;td&gt;Justine Soulié&lt;/td&gt;&lt;td&gt;Nuxt 3 + Prismic + Three.js&lt;/td&gt;&lt;td&gt;⭐⭐⭐&lt;/td&gt;&lt;td&gt;56 个 &lt;code&gt;.ktx&lt;/code&gt; WebGL 纹理&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;08&lt;/td&gt;&lt;td&gt;Siena Film&lt;/td&gt;&lt;td&gt;Webflow&lt;/td&gt;&lt;td&gt;⭐⭐&lt;/td&gt;&lt;td&gt;海报 + 视频批量&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;09&lt;/td&gt;&lt;td&gt;Stefan Vitasović&lt;/td&gt;&lt;td&gt;Next.js + Three.js&lt;/td&gt;&lt;td&gt;⭐⭐⭐&lt;/td&gt;&lt;td&gt;Vercel 专属路由&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;九个站，九种打法。&lt;/strong&gt; 下面拆。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;三、管线总览：七个阶段&lt;a href=&quot;#三管线总览七个阶段&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;① 侦察      curl -I / 指纹识别 → 判定栈&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;② 抓壳      HTML + 主 JS/CSS + sourcemap 探测&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;③ 破防      针对性的反爬对抗（XOR / CF / 防盗链）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;④ 补全      运行时 404 扫描 → 回抓懒加载资源&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;⑤ 本地化    _raw/ → local/，多前缀铺设&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;⑥ 启动      每站独立端口 + 静态服务器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;⑦ 验收      截图 + DOM + 404 三重校验&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;每一阶段都有一批工具。&lt;strong&gt;工具清单在最后一节，全部可复用。&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;四、阶段①：侦察——三分钟判定一个站的栈&lt;a href=&quot;#四阶段侦察三分钟判定一个站的栈&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;拿到一个站，第一件事不是抓，是&lt;strong&gt;判断它是什么做的&lt;/strong&gt;。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-sSI&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-L&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://target.com/&lt;/span&gt;&lt;span&gt; | &lt;/span&gt;&lt;span&gt;head&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-30&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;看几样东西：&lt;/p&gt;




































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;特征&lt;/th&gt;&lt;th&gt;判定&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;x-powered-by: Next.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Next.js&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;HTML 里有 &lt;code&gt;__NUXT__&lt;/code&gt; / &lt;code&gt;__NUXT_DATA__&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Nuxt 3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;_next/static/&lt;/code&gt; 路径&lt;/td&gt;&lt;td&gt;Next.js&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;_nuxt/&lt;/code&gt; 路径&lt;/td&gt;&lt;td&gt;Nuxt&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;data-wf-*&lt;/code&gt; 属性、&lt;code&gt;webflow.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Webflow&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;cdn.shopify.com&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Shopify&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;一堆内联 &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; + &lt;code&gt;data-v-xxx&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Vue 组件（构建后）&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;九个站的实际判定结果：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;01 paolovendramini   → Nuxt 3（_nuxt/ 路径）+ Strapi（CMS 数据）+ Cloudflare&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;02 obys              → 自研（原生 JS，无框架特征）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;03 seventeen         → Webflow（data-wf-page 属性）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;04 camillemormal     → PHP（自研 d.js，非框架）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;05 cipher            → Nuxt 3（_nuxt/）+ Netlify + THREE.js&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;06 pacomepertant     → Nuxt 3（_nuxt/）+ Sanity + Plesk + Cloudflare&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;07 justinesoulie     → Nuxt 3 + Prismic + THREE.js&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;08 siena             → Webflow + 自托管 app.js&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;09 stefanvitasovic   → Next.js Pages Router + THREE.js&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;判断栈为什么重要&lt;/strong&gt;：它决定了后面所有策略。Nuxt 要抓 &lt;code&gt;_payload.json&lt;/code&gt;，Webflow 要处理 &lt;code&gt;integrity&lt;/code&gt;，自研站要看它的加载器逻辑。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;五、阶段②：抓壳——HTML + JS + sourcemap&lt;a href=&quot;#五阶段抓壳html--js--sourcemap&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;抓首页很简单。&lt;strong&gt;sourcemap 才是宝。&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 探测 sourcemap 是否存在&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-sSI&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://target.com/_nuxt/entry.js.map&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;03 Seventeen 给了我一个大惊喜——它发布了 9 个官方 sourcemap：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;GSAP.js.map          ← GSAP 完整源码&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ScrollTrigger.js.map&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Draggable.js.map&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;InertiaPlugin.js.map&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Observer.js.map&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Plyr.js.map          ← 视频播放器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Swiper.js.map&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Lenis.js.map         ← 平滑滚动&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;CustomEase.js.map&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;7.4 MB 的原始库源码。&lt;/strong&gt; 这意味着你可以直接读 GSAP 内部怎么实现 &lt;code&gt;ScrollTrigger&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;探测目录走一遍：&lt;/strong&gt;&lt;/p&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;栈&lt;/th&gt;&lt;th&gt;探测路径&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Nuxt&lt;/td&gt;&lt;td&gt;&lt;code&gt;/_nuxt/&lt;/code&gt;、&lt;code&gt;/_payload.json&lt;/code&gt;、&lt;code&gt;/_nuxt/builds/meta/*.json&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Next.js&lt;/td&gt;&lt;td&gt;&lt;code&gt;/_next/static/chunks/&lt;/code&gt;、&lt;code&gt;/_next/static/*/_buildManifest.js&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Webflow&lt;/td&gt;&lt;td&gt;&lt;code&gt;/js/webflow.js&lt;/code&gt;、&lt;code&gt;/*.css&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;通用&lt;/td&gt;&lt;td&gt;&lt;code&gt;/sitemap.xml&lt;/code&gt;、&lt;code&gt;/robots.txt&lt;/code&gt;、&lt;code&gt;/manifest.json&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;code&gt;robots.txt&lt;/code&gt; 经常能给你一个路径地图。&lt;strong&gt;先读它，再动手。&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;六、阶段③：破防——三种反爬，三种破法&lt;a href=&quot;#六阶段破防三种反爬三种破法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这是全文最有价值的部分。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;6.1 XOR 混淆资源路径（02 Obys）&lt;a href=&quot;#61-xor-混淆资源路径02-obys&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：Obys 的 HTML 里没有任何可读的资源路径。它有三个内联 &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; 标签，把路径用 XOR 加密了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;如果你改 HTML 里的路径&lt;/strong&gt;——那你就改了原站代码，而且容易漏。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;正确做法：不改 HTML，把文件铺到它期望的位置。&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# build_final.py 核心&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;PREFIX_MAP&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;d.js&quot;&lt;/span&gt;&lt;span&gt;:      [&lt;/span&gt;&lt;span&gt;&quot;/static/js/d.js&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;/js/d.js&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;/_nuxt/d.js&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;app.js&quot;&lt;/span&gt;&lt;span&gt;:    [&lt;/span&gt;&lt;span&gt;&quot;/js/app.js&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;/static/js/app.js&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;d.css&quot;&lt;/span&gt;&lt;span&gt;:     [&lt;/span&gt;&lt;span&gt;&quot;/static/css/d.css&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;/css/d.css&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# ...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 一个文件，铺到所有可能的路径&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;“多前缀冗余”&lt;/strong&gt; —— 一个 &lt;code&gt;d.js&lt;/code&gt; 同时存在于 &lt;code&gt;/static/js/&lt;/code&gt;、&lt;code&gt;/js/&lt;/code&gt;、&lt;code&gt;/_nuxt/&lt;/code&gt;。哪个引用形式都能命中。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;为什么有效&lt;/strong&gt;：你不需要知道原站真正的路径结构，你只需要&lt;strong&gt;覆盖所有可能性&lt;/strong&gt;。存储便宜，猜错代价高。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;服务器根 = 站点根&lt;a href=&quot;#服务器根--站点根&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# serve_all.py — 每站独立服务器，root 指向 &amp;lt;slug&amp;gt;/local/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;SITES&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;01-paolovendramini&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;8101&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;02-obys&quot;&lt;/span&gt;&lt;span&gt;,            &lt;/span&gt;&lt;span&gt;8102&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# ...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;关键&lt;/strong&gt;：服务根必须是 &lt;code&gt;local/&lt;/code&gt;，这样 &lt;code&gt;/_nuxt/x.js&lt;/code&gt; 才能自然解析成 &lt;code&gt;local/_nuxt/x.js&lt;/code&gt;。&lt;strong&gt;不需要任何路径重写。&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;九、阶段⑥：两个必踩的坑&lt;a href=&quot;#九阶段两个必踩的坑&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;坑 1：SPA 回退把 JSON 吃掉了&lt;a href=&quot;#坑-1spa-回退把-json-吃掉了&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Nuxt / Next 的单页应用需要”找不到路径就返回 index.html”的回退。但如果你&lt;strong&gt;对所有 404 都返回 index.html&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// JS 请求 /_payload.json，得到的是：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;&amp;lt;!DOCTYPE html&amp;gt;&amp;lt;html&amp;gt;...&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;   ← &lt;/span&gt;&lt;span&gt;不是&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;JSON&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 然后 JS 崩在：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// SyntaxError: Unexpected token &apos;&amp;lt;&apos;, &quot;&amp;lt;!doctype &quot;... is not valid JSON&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 后果：整个页面白屏&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;修复：只对”页面导航”请求回退，资源请求老实 404。&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;send_error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;code&lt;/span&gt;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;msg&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;None&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;explain&lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;None&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;p &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;&lt;span&gt;.path.&lt;/span&gt;&lt;span&gt;split&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;?&quot;&lt;/span&gt;&lt;span&gt;)[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ext &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; os.path.&lt;/span&gt;&lt;span&gt;splitext&lt;/span&gt;&lt;span&gt;(p)[&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&lt;span&gt;].&lt;/span&gt;&lt;span&gt;lower&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;is_asset &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; ext &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;&quot;.json&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;.js&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;.css&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;.woff2&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;.jpg&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                       &lt;/span&gt;&lt;span&gt;&quot;.png&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;.webp&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;.ktx&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;.mp4&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;idx &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; os.path.&lt;/span&gt;&lt;span&gt;join&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;.directory, &lt;/span&gt;&lt;span&gt;&quot;index.html&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; code &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;404&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;and&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;not&lt;/span&gt;&lt;span&gt; is_asset &lt;/span&gt;&lt;span&gt;and&lt;/span&gt;&lt;span&gt;&lt;span&gt; os.path.&lt;/span&gt;&lt;span&gt;exists&lt;/span&gt;&lt;span&gt;(idx):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 只有页面导航才回退&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;serve_index&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;super&lt;/span&gt;&lt;span&gt;&lt;span&gt;().&lt;/span&gt;&lt;span&gt;send_error&lt;/span&gt;&lt;span&gt;(code, msg, explain)   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;# 资源老实 404&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;这一个 bug 让我排查了两轮。&lt;/strong&gt; 记住它。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;坑 2：Webflow 的 &lt;code&gt;integrity&lt;/code&gt; 哈希&lt;a href=&quot;#坑-2webflow-的-integrity-哈希&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Webflow 站（03 / 08）的 &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; 带 &lt;code&gt;integrity&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rel&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;stylesheet&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;href&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;/css/site.css&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;integrity&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;sha384-XyZ...&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;crossorigin&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;anonymous&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;本地文件内容只要差一个字节，浏览器就拒绝加载整个 CSS。&lt;/strong&gt; 页面会变成裸 HTML。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;修复：删掉 &lt;code&gt;integrity&lt;/code&gt; 和 &lt;code&gt;crossorigin&lt;/code&gt;。&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 03-seventeen 处理&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sed&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;s/ integrity=&quot;sha384-[^&quot;]*&quot;//g&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;index.html&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sed&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;s/ crossorigin//g&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;index.html&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;坑 2.5：Webflow 的死脚本&lt;a href=&quot;#坑-25webflow-的死脚本&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;03 还有一个更阴的坑：一个 vendor 追踪脚本返回的是 &lt;strong&gt;HTML&lt;/strong&gt;（58KB 的 &lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/code&gt;）。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;src&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;/haqt6iy0yx2e.../5MuJ4xnYHv...&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;script&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;!-- 返回 404 页面（HTML）→ SyntaxError → 阻断后面所有 JS --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;一个失效脚本能让你整站 JS 全死。&lt;/strong&gt; 删掉它。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;十、阶段⑦：验收——三重校验&lt;a href=&quot;#十阶段验收三重校验&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;不要相信”看起来能跑”。&lt;/strong&gt; 三重校验：&lt;/p&gt;&lt;section&gt;&lt;h3&gt;1. 截图&lt;a href=&quot;#1-截图&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;CDP 在这台机器上会挂&lt;/strong&gt;（&lt;code&gt;Runtime.evaluate&lt;/code&gt; 永不返回）。用原生 Chrome：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chrome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--headless=new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--disable-gpu&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--no-first-run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--hide-scrollbars&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--window-size=1440,900&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--virtual-time-budget=15000&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--screenshot=out.png&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;http://127.0.0.1:8101/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 推进加载器&lt;a href=&quot;#2-推进加载器&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;很多站有 preloader，&lt;code&gt;--virtual-time-budget&lt;/code&gt; 推不动它。&lt;strong&gt;用滚轮事件驱动&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;shot-scroll.js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;let&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;send&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;Input.dispatchMouseEvent&apos;&lt;/span&gt;&lt;span&gt;, {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;mouseWheel&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;deltaY&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;700&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;720&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;450&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sleep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;400&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;02 Obys 的效果：截图从 6.9KB → 170KB。&lt;/strong&gt; （6.9KB 是纯黑，170KB 是完整作品集。）&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. DOM 校验&lt;a href=&quot;#3-dom-校验&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;截图小 ≠ 页面坏了。&lt;strong&gt;WebGL 站在 headless 里 canvas 不画&lt;/strong&gt;（没 GPU）。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chrome&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--headless=new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--dump-dom&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;http://127.0.0.1:8107/&lt;/span&gt;&lt;span&gt; &amp;gt; &lt;/span&gt;&lt;span&gt;dom.html&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;07 Justine 的验证：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;canvas: 1 个         ← WebGL canvas 存在&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;请求: 54 个，0 失败&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;画面没出来，但代码全对。真实浏览器里正常。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;三重校验的逻辑：截图看视觉，滚轮推进度，DOM 查结构。&lt;/strong&gt; 缺一不可。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;十一、两个最硬的骨头（完整复盘）&lt;a href=&quot;#十一两个最硬的骨头完整复盘&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;04 Camille Mormal——从 0% 到 100%&lt;a href=&quot;#04-camille-mormal从-0-到-100&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;症状&lt;/strong&gt;：预加载器卡在 &lt;code&gt;0%&lt;/code&gt;，永远不动。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;诊断&lt;/strong&gt;：读它的 &lt;code&gt;d.js&lt;/code&gt;，找到这个：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;R&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Fetch&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;route&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;?webp=&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;webp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&amp;amp;device=&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;device&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;html&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;success&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;JSON&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;parse&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;);                      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// ★ 拿到的是 JSON&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;document&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;afterbegin&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;);  &lt;/span&gt;&lt;span&gt;// ★ 注入 DOM&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;它的架构是”动态取页”&lt;/strong&gt;：请求 &lt;code&gt;/?webp=true&amp;amp;device=d&lt;/code&gt;，服务器返回一个 JSON（含 &lt;code&gt;&amp;amp;#123;body, cache, routes, data&amp;amp;#125;&lt;/code&gt;），再注入 DOM。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;破法（三步）：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 1. 抓到原站的 JSON 响应（106,505 bytes）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;resp &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fetch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;https://camillemormal.com/?webp=true&amp;amp;device=d&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;open&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;local/page.json&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;wb&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;write&lt;/span&gt;&lt;span&gt;(resp)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 2. 给服务器加特例&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;H&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;SimpleHTTPRequestHandler&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;do_GET&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;webp=&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;.path:                    &lt;/span&gt;&lt;span&gt;# ★ 拦截这个查询&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;pj &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; os.path.&lt;/span&gt;&lt;span&gt;join&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;.directory, &lt;/span&gt;&lt;span&gt;&quot;page.json&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; os.path.&lt;/span&gt;&lt;span&gt;exists&lt;/span&gt;&lt;span&gt;(pj):&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;data &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;open&lt;/span&gt;&lt;span&gt;(pj, &lt;/span&gt;&lt;span&gt;&quot;rb&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;read&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;send_response&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;200&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;send_header&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;Content-Type&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;text/html; charset=UTF-8&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;send_header&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;Content-Length&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;len&lt;/span&gt;&lt;span&gt;(data)))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;end_headers&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;&lt;span&gt;.wfile.&lt;/span&gt;&lt;span&gt;write&lt;/span&gt;&lt;span&gt;(data)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;super&lt;/span&gt;&lt;span&gt;&lt;span&gt;().&lt;/span&gt;&lt;span&gt;do_GET&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 3. 补 44 个缺失资源（25 张 load/N.jpg + 8 作品 × home/hero + favicon）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#    结果：45/45 全下&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;验证结果：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;loadNo: &quot;100%&quot;           ← 加载完成！&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;titles: 8                ← 8 个作品标题全在&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;文本: Independent Designer &amp;amp; Art Director&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;The Regeneration Suite / Simplicity &amp;amp; Tactility&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Reimagining Loyalty / Beyond The Canvas&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Sound Expressed In Full / Reinventing Wonder&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;From Nature To Culture / From Gaggio With Love&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;从”卡死”到”100%“，靠的是读懂它的加载器逻辑。&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;06 Pacôme Pertant——穿透 Cloudflare&lt;a href=&quot;#06-pacôme-pertant穿透-cloudflare&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;症状&lt;/strong&gt;：所有请求返回 CF 挑战页。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;破法（换节点）：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;本地有 Clash 代理（&lt;code&gt;127.0.0.1:7897&lt;/code&gt;），出口是 Singapore。&lt;strong&gt;所有请求走代理，CF 直接放行。&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-sS&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-x&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;http://127.0.0.1:7897&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--compressed&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-A&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Mozilla/5.0 ... Chrome/131.0.0.0 Safari/537.36&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;https://pacomepertant.com/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;然后：&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;HTML&lt;/strong&gt;（57KB）✓&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;10 个 Nuxt bundle&lt;/strong&gt;（主包 2.5MB，含 Three.js）✓&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;_payload.json&lt;/code&gt;&lt;/strong&gt;（Nuxt devalue 格式，含 10 项目 + 35 图引用 + 23 Mux 视频）✓&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sanity 图片&lt;/strong&gt; —— 需要 &lt;strong&gt;projectId&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;projectId 的挖掘过程&lt;/strong&gt;：从 HTML 里正则出 &lt;code&gt;projectId: &quot;u7lvkmbp&quot;&lt;/code&gt;。然后：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-x&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;http://127.0.0.1:7897&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;https://cdn.sanity.io/images/u7lvkmbp/production/&amp;lt;hash&amp;gt;-1396x786.webp&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# → 24,138 bytes 真 JPEG  ✓&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;35/35 Sanity 图片全下。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;最终：零 404。&lt;/strong&gt; 首屏是黑底白字 &lt;code&gt;motion &amp;amp; sound designer / based in paris&lt;/code&gt;。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;十二、成果&lt;a href=&quot;#十二成果&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;figure&gt;&lt;img src=&quot;/assets/images/posts/design-lib/01-paolovendramini.png&quot; alt=&quot;01 Paolo Vendramini&quot; /&gt;&lt;figcaption&gt;01 Paolo Vendramini&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;/assets/images/posts/design-lib/02-obys.png&quot; alt=&quot;02 Obys Agency&quot; /&gt;&lt;figcaption&gt;02 Obys Agency&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;/assets/images/posts/design-lib/03-seventeen.png&quot; alt=&quot;03 Seventeen&quot; /&gt;&lt;figcaption&gt;03 Seventeen&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;/assets/images/posts/design-lib/04-camillemormal.png&quot; alt=&quot;04 Camille Mormal&quot; /&gt;&lt;figcaption&gt;04 Camille Mormal&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;/assets/images/posts/design-lib/05-cipher.png&quot; alt=&quot;05 Cipher&quot; /&gt;&lt;figcaption&gt;05 Cipher&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;/assets/images/posts/design-lib/06-pacomepertant.png&quot; alt=&quot;06 Pacôme Pertant&quot; /&gt;&lt;figcaption&gt;06 Pacôme Pertant&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;/assets/images/posts/design-lib/07-justinesoulie.png&quot; alt=&quot;07 Justine Soulié&quot; /&gt;&lt;figcaption&gt;07 Justine Soulié&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;/assets/images/posts/design-lib/08-siena.png&quot; alt=&quot;08 Siena Film&quot; /&gt;&lt;figcaption&gt;08 Siena Film&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;/assets/images/posts/design-lib/09-stefanvitasovic.png&quot; alt=&quot;09 Stefan Vitasović&quot; /&gt;&lt;figcaption&gt;09 Stefan Vitasović&lt;/figcaption&gt;&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;最终交付：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;D:\Saki\design-lib\&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── 2047 文件 / 216 MB&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── 9 站 × (index.html + _raw/ + local/ + _recon.md)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── _snippets/          ← 抽出的组件库&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── easing/24-easings.css        24 条命名缓动&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── grid/grid-tokens.css         栅格断点&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── grid/12col-obys.css          视口比例 12 列&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── backgrounds/noise-bg.css     CSS 噪点&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── text-anim/marquee-arrow.css  跑马灯&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   └── transitions/obys-logo-menu-grid.css&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── serve_all.py        一键启动（端口 8101–8109）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└── START-9站.bat       双击启动&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;九个站全 HTTP 200，404 清零。&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;十三、抽出来的东西（真正有价值的部分）&lt;a href=&quot;#十三抽出来的东西真正有价值的部分&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;复刻是手段，&lt;strong&gt;抽出来才是目的&lt;/strong&gt;。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;设计 token&lt;a href=&quot;#设计-token&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;




























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;来源&lt;/th&gt;&lt;th&gt;内容&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;04 Camille&lt;/td&gt;&lt;td&gt;18 条缓动曲线（&lt;code&gt;--i1..i6&lt;/code&gt; / &lt;code&gt;--o1..o6&lt;/code&gt; / &lt;code&gt;--io1..io6&lt;/code&gt;）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;09 Stefan&lt;/td&gt;&lt;td&gt;&lt;strong&gt;24 条命名缓动&lt;/strong&gt; + 栅格 token（&lt;code&gt;--gutters:5; --cols:4; --indent:1.3888888889vw&lt;/code&gt;）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;08 Siena&lt;/td&gt;&lt;td&gt;&lt;code&gt;--duration&lt;/code&gt; / &lt;code&gt;--ease&lt;/code&gt; / &lt;code&gt;--easeOutBack&lt;/code&gt; / &lt;code&gt;--panels-duration&lt;/code&gt; / &lt;code&gt;--slider-dur&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;02 Obys&lt;/td&gt;&lt;td&gt;12 列视口比例公式 + &lt;code&gt;mix-blend-mode: difference&lt;/code&gt; logo + lerp&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;07 Justine&lt;/td&gt;&lt;td&gt;base64 噪点纹理 + 10s 箭头循环&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;可直接抄的缓动&lt;a href=&quot;#可直接抄的缓动&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/* 从 09 Stefan 抽出的 24 条命名缓动的一部分 */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--ease-out-expo:    cubic-bezier(0&lt;/span&gt;&lt;span&gt;.19&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;/span&gt;&lt;span&gt;.22&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--ease-out-quart:   cubic-bezier(0&lt;/span&gt;&lt;span&gt;.165&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;/span&gt;&lt;span&gt;.84&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;/span&gt;&lt;span&gt;.44&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--ease-in-out-quint: cubic-bezier(0&lt;/span&gt;&lt;span&gt;.86&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;/span&gt;&lt;span&gt;.07&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--ease-out-back:    cubic-bezier(0&lt;/span&gt;&lt;span&gt;.175&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;/span&gt;&lt;span&gt;.885&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;/span&gt;&lt;span&gt;.32&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;/span&gt;&lt;span&gt;.275&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/* ... 剩余 20 条在 _snippets/easing/24-easings.css */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;这些是”高级感”的物理公式。&lt;/strong&gt; 你不用再猜为什么别人的动画好看——&lt;code&gt;cubic-bezier(0.19, 1, 0.22, 1)&lt;/code&gt; 就是答案。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;十四、工具清单（全部可复用）&lt;a href=&quot;#十四工具清单全部可复用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;38 个脚本，按用途分类：&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&lt;h3&gt;侦察与抓取&lt;a href=&quot;#侦察与抓取&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;工具&lt;/th&gt;&lt;th&gt;用途&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;net-dump.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;CDP 抓任意站全部资源 URL&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;img-dump2.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;CDP 抓页面所有请求&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;fetch_all.py&lt;/code&gt;&lt;/td&gt;&lt;td&gt;通用抓取（HTML→JS/CSS→sourcemap）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;fetch_images.py&lt;/code&gt;&lt;/td&gt;&lt;td&gt;正则提取图片 URL 并下载&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;fetch_webflow_imgs.py&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Webflow 站图片批量&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;bulk_dl.py&lt;/code&gt;&lt;/td&gt;&lt;td&gt;批量下载 URL 清单&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;反爬对抗&lt;a href=&quot;#反爬对抗&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;




























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;工具&lt;/th&gt;&lt;th&gt;用途&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;obys-dump.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;破解 XOR 混淆&lt;/strong&gt;（CDP 执行解密器）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;grab-cdp.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;拦截响应体&lt;/strong&gt;（绕防盗链/墙）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;grab-sanity.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;专抓 Sanity CDN&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;dl-by-browser.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;浏览器下载&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;one-get.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;CDP 抓单个 URL（绕证书/reset）&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;本地化与启动&lt;a href=&quot;#本地化与启动&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;工具&lt;/th&gt;&lt;th&gt;用途&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;build_final.py&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;_raw&lt;/code&gt; → &lt;code&gt;local/&lt;/code&gt;（多前缀策略）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;refetch_chunks.py&lt;/code&gt;&lt;/td&gt;&lt;td&gt;补抓懒加载 chunk&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;serve_all.py&lt;/code&gt;&lt;/td&gt;&lt;td&gt;9 站服务器（端口 8101–8109）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;START-9站.bat&lt;/code&gt;&lt;/td&gt;&lt;td&gt;一键启动&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;诊断与验收&lt;a href=&quot;#诊断与验收&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;




































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;工具&lt;/th&gt;&lt;th&gt;用途&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;find_missing.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;CDP 抓 404 列表&lt;/strong&gt;（最关键）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;shot-scroll.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;滚轮推进 + 截图&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;shot-skip.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;跳过 loader 截图&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;probe.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;运行时状态（console/异常）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;probe-camille.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;深度状态探针&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;urls.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;列出某站所有请求&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;verify3.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;批量截图验收&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;十五、可复刻的操作清单&lt;a href=&quot;#十五可复刻的操作清单&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;给其他 Agent 的逐步 SOP：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1. 侦察&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;curl -sSI -L &amp;lt;target&amp;gt; | head -30&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;→ 判定栈（Nuxt / Next / Webflow / 自研）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;2. 抓壳&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;curl -sSL &amp;lt;target&amp;gt; -o index.html --compressed&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;→ 若返回乱码，试 brotli.decompress()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;→ 探测 .map：curl -sSI &amp;lt;target&amp;gt;/&amp;lt;main&amp;gt;.js.map&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;3. 枚举资源&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;grep -oE &apos;/(_nuxt|_next|static|js|css)/[A-Za-z0-9._-]+&apos; index.html&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;→ 得到资源清单&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;4. 破防（按需）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;├─ XOR 混淆 → CDP 执行解密器读 DOM&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;├─ Cloudflare → 走代理 + 完整浏览器头 + brotli 解压&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;└─ 防盗链   → CDP Network.getResponseBody&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;5. 铺文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;每个文件铺到所有可能的路径前缀&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;→ _raw/d.js → local/static/js/d.js + local/js/d.js&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;6. 起服务&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;每站独立端口，root = local/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;7. 补全循环&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;find_missing.js → 抓 404 → 回原站下载 → 铺路径&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;→ 重复到 404 清零&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;8. 验收&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;截图（--screenshot）+ 推进（滚轮）+ 结构（--dump-dom）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;→ 三重校验&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;9. 抽组件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;从 CSS/JS 里正则出 easing / grid / color token&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;→ 整理成可复用片段&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;七个必须记住的坑：&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;SPA 回退会吃掉 JSON&lt;/strong&gt; → 只对页面导航回退&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Webflow &lt;code&gt;integrity&lt;/code&gt; 哈希&lt;/strong&gt; → 删掉&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;死掉的 vendor 脚本返回 HTML&lt;/strong&gt; → 删掉，否则整站 JS 死&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;curl &lt;code&gt;--compressed&lt;/code&gt; 不解 brotli&lt;/strong&gt; → 手动 &lt;code&gt;brotli.decompress()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CDP 在某些环境会挂&lt;/strong&gt; → 用原生 &lt;code&gt;chrome --headless --screenshot&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;headless WebGL 不画&lt;/strong&gt; → 用 &lt;code&gt;--dump-dom&lt;/code&gt; 验证结构&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;预加载器推不动&lt;/strong&gt; → 用滚轮事件驱动&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;十六、合法边界&lt;a href=&quot;#十六合法边界&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这一节必须说清楚。&lt;/p&gt;




























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;行为&lt;/th&gt;&lt;th&gt;性质&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;公开 GET 侦察（无鉴权绕过）&lt;/td&gt;&lt;td&gt;✅ 合法&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;本地下载代码/资源&lt;strong&gt;自用&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;⚠️ 民法意义上的「复制」，不涉刑&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;公开发布/部署&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;❌ 「信息网络传播」&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;逐字复用代码 / 分发媒体&lt;/td&gt;&lt;td&gt;❌ 侵权&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;破解付费墙 / 绕过登录&lt;/td&gt;&lt;td&gt;❌ 刑事风险&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;我的定位：本地自用、研究、学习。不公开部署。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;明确不可用的：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Impact 字体&lt;/strong&gt;（MyFonts 商业授权，“其他方明确禁止使用”）→ 用 Anton / Oswald（OFL）替代&lt;/li&gt;
&lt;li&gt;NeueMontreal / ObysSans / ABC Favorit / HelveticaNowDisplay —— &lt;strong&gt;商业字体，不可部署&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;站内图片、视频 —— &lt;strong&gt;第三方版权&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;要真部署：替换全部媒体、全部字体、重写文案。&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;十七、这套东西怎么用&lt;a href=&quot;#十七这套东西怎么用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;回到最初的问题：&lt;strong&gt;vibecoding 效果垃圾，因为 Agent 缺参照物。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;现在你有九个了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;用法一：当审美基准。&lt;/strong&gt; 让 Agent 改首页之前，先让它读 02 Obys 的 CSS。它看到 &lt;code&gt;cubic-bezier(0.19, 1, 0.22, 1)&lt;/code&gt; 和你写”丝滑一点”，是两回事。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;用法二：当组件库。&lt;/strong&gt; &lt;code&gt;_snippets/&lt;/code&gt; 里已经抽好了缓动、栅格、噪点、跑马灯。直接 import。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;用法三：当抄袭对象（合法的抄袭）。&lt;/strong&gt; 它们的&lt;strong&gt;方法&lt;/strong&gt;可以学——12 列视口比例怎么算、&lt;code&gt;mix-blend-mode: difference&lt;/code&gt; 怎么用、Three.js 纹理怎么组织。方法不受版权保护，表达才受。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;用法四：当对照。&lt;/strong&gt; 你让 Agent 写一个瀑布流，它给你一个 jQuery 味的。你打开 08 Siena 的 &lt;code&gt;local/&lt;/code&gt;，看真东西怎么写。&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;strong&gt;九个站，216 MB，零 404，全本地可跑。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;工具在 &lt;code&gt;D:\Saki\design-lib\&lt;/code&gt;，38 个脚本，全部可复用。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;这一篇到此。下一个要扒的站，照上面的 SOP 走。&lt;/strong&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;对照面板&lt;a href=&quot;#对照面板&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;十个站都跑在本机，一条一条对照着看。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;先启动服务&lt;/strong&gt;（&lt;code&gt;D:\Saki\design-lib\&lt;/code&gt; 下双击 &lt;code&gt;START-9站.bat&lt;/code&gt;，或跑 &lt;code&gt;python serve_all.py&lt;/code&gt;），jiejoe 在 &lt;code&gt;D:\Saki\projects\jiejoe-original\&lt;/code&gt; 下 &lt;code&gt;npm run dev&lt;/code&gt;。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;站点&lt;/span&gt;&lt;span&gt;技术栈&lt;/span&gt;&lt;span&gt;本地复刻&lt;/span&gt;&lt;span&gt;原站&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;01&lt;/span&gt;&lt;span&gt;Paolo Vendramini&lt;/span&gt;&lt;span&gt;Nuxt 3 + Strapi&lt;/span&gt;&lt;a href=&quot;http://127.0.0.1:8101/&quot; target=&quot;_blank&quot;&gt;localhost ↗&lt;/a&gt;&lt;a href=&quot;https://www.paolovendramini.com&quot; target=&quot;_blank&quot;&gt;原站 ↗&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;02&lt;/span&gt;&lt;span&gt;Obys Agency&lt;/span&gt;&lt;span&gt;自研 + XOR 反爬&lt;/span&gt;&lt;a href=&quot;http://127.0.0.1:8102/&quot; target=&quot;_blank&quot;&gt;localhost ↗&lt;/a&gt;&lt;a href=&quot;https://obys.agency&quot; target=&quot;_blank&quot;&gt;原站 ↗&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;03&lt;/span&gt;&lt;span&gt;Seventeen&lt;/span&gt;&lt;span&gt;Webflow + GSAP&lt;/span&gt;&lt;a href=&quot;http://127.0.0.1:8103/&quot; target=&quot;_blank&quot;&gt;localhost ↗&lt;/a&gt;&lt;a href=&quot;https://www.seventeenagency.com&quot; target=&quot;_blank&quot;&gt;原站 ↗&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;04&lt;/span&gt;&lt;span&gt;Camille Mormal&lt;/span&gt;&lt;span&gt;PHP + 自研&lt;/span&gt;&lt;a href=&quot;http://127.0.0.1:8104/&quot; target=&quot;_blank&quot;&gt;localhost ↗&lt;/a&gt;&lt;a href=&quot;https://camillemormal.com&quot; target=&quot;_blank&quot;&gt;原站 ↗&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;05&lt;/span&gt;&lt;span&gt;Cipher&lt;/span&gt;&lt;span&gt;Nuxt 3 + Three.js&lt;/span&gt;&lt;a href=&quot;http://127.0.0.1:8105/&quot; target=&quot;_blank&quot;&gt;localhost ↗&lt;/a&gt;&lt;a href=&quot;https://cipher.tv&quot; target=&quot;_blank&quot;&gt;原站 ↗&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;06&lt;/span&gt;&lt;span&gt;Pacôme Pertant&lt;/span&gt;&lt;span&gt;Nuxt 3 + Sanity&lt;/span&gt;&lt;a href=&quot;http://127.0.0.1:8106/&quot; target=&quot;_blank&quot;&gt;localhost ↗&lt;/a&gt;&lt;a href=&quot;https://pacomepertant.com&quot; target=&quot;_blank&quot;&gt;原站 ↗&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;07&lt;/span&gt;&lt;span&gt;Justine Soulié&lt;/span&gt;&lt;span&gt;Nuxt 3 + Prismic + Three.js&lt;/span&gt;&lt;a href=&quot;http://127.0.0.1:8107/&quot; target=&quot;_blank&quot;&gt;localhost ↗&lt;/a&gt;&lt;a href=&quot;https://justinesoulie.fr&quot; target=&quot;_blank&quot;&gt;原站 ↗&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;08&lt;/span&gt;&lt;span&gt;Siena Film&lt;/span&gt;&lt;span&gt;Webflow&lt;/span&gt;&lt;a href=&quot;http://127.0.0.1:8108/&quot; target=&quot;_blank&quot;&gt;localhost ↗&lt;/a&gt;&lt;a href=&quot;https://www.siena.film&quot; target=&quot;_blank&quot;&gt;原站 ↗&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;09&lt;/span&gt;&lt;span&gt;Stefan Vitasović&lt;/span&gt;&lt;span&gt;Next.js + Three.js&lt;/span&gt;&lt;a href=&quot;http://127.0.0.1:8109/&quot; target=&quot;_blank&quot;&gt;localhost ↗&lt;/a&gt;&lt;a href=&quot;https://stefanvitasovic.dev&quot; target=&quot;_blank&quot;&gt;原站 ↗&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;00&lt;/span&gt;&lt;span&gt;jiejoe&lt;/span&gt;&lt;span&gt;Vue 2 + GSAP + Lenis&lt;/span&gt;&lt;a href=&quot;http://127.0.0.1:8081/&quot; target=&quot;_blank&quot;&gt;localhost ↗&lt;/a&gt;&lt;a href=&quot;https://www.jiejoe.com&quot; target=&quot;_blank&quot;&gt;原站 ↗&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;p&gt;&lt;em&gt;本站协议见 &lt;a href=&quot;/posts/site-protocol/&quot;&gt;规矩&lt;/a&gt;。&lt;/em&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>「取图」：把帖子里的图，放到一张桌上</title><link>https://stulanez.com/posts/pull-image-desk/</link><guid isPermaLink="true">https://stulanez.com/posts/pull-image-desk/</guid><description>Instagram、抖音、小红书、微博，把链接丢进来就能抽出原图。独立本地界面，像一张书桌，不嵌在主页侧栏里。</description><pubDate>Wed, 16 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;刷到一组好看的图，最烦的是什么？不是找不到，是&lt;strong&gt;散落在四个 App 里&lt;/strong&gt;——有的要进帖子长按，有的要开网页再另存，有的一次只能下一张。我想要的很简单：把链接丢进去，图就整整齐齐摊在一张桌上，想下几张下几张。&lt;/p&gt;
&lt;p&gt;于是站上多了一个独立工具页：&lt;strong&gt;&lt;a href=&quot;/pull/&quot;&gt;取图&lt;/a&gt;&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;下面这块是文章里的活演示（不会真的请求外站）。点一下渠道，走一遍「粘贴 → 提取」，就能大概明白它怎么用。&lt;/p&gt;
&lt;section&gt;&lt;header&gt;&lt;span&gt;LIVE DEMO · 不会真的请求外站&lt;/span&gt; &lt;h3&gt;把链接丢上来，图会铺到一张桌上。&lt;/h3&gt;&lt;/header&gt; &lt;div&gt;全部INS抖音小红书微博&lt;/div&gt; &lt;p&gt;帖子 / Reels / 分享口令&lt;/p&gt; &lt;div&gt;&lt;div&gt;&lt;span&gt;网页链接、短链，或 App 分享口令&lt;/span&gt; &lt;div&gt;粘贴示例 识别并提取&lt;/div&gt;&lt;/div&gt; &lt;div&gt;&lt;p&gt;点「粘贴示例」→「识别并提取」，看图是怎么摊开的。&lt;/p&gt; &lt;a href=&quot;/pull/&quot;&gt;打开真正的取图页 ↗&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;它解决什么&lt;a href=&quot;#它解决什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;取图支持四条渠道：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Instagram&lt;/strong&gt;：网页帖、Reels、App 分享口令&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;抖音&lt;/strong&gt;：图文笔记、短链、App「复制链接」整段口令&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;小红书&lt;/strong&gt;：笔记网页、&lt;code&gt;xhslink&lt;/code&gt;、分享口令&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;微博&lt;/strong&gt;：正文页、&lt;code&gt;t.cn&lt;/code&gt;、App 分享链接&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;你也可以不选手动选渠道，直接把链接丢进输入框——它会尽量自己识别。抽出来的图可以单选、多选，按「已选 / 全部」下载；本机还能存一份「我的图集」，下次打开再抽一遍（只存在当前浏览器，不上传服务器）。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;为什么做成「本地界面」&lt;a href=&quot;#为什么做成本地界面&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;一开始我想过：取图是不是该嵌进主页那套侧栏框架里？试过之后发现不对劲——工具页需要整屏专注，侧栏资料卡和时钟只会抢注意力。&lt;/p&gt;&lt;p&gt;所以现在取图是&lt;strong&gt;整页跳转的独立界面&lt;/strong&gt;，跟 TFT 组队器那一类工具页一个思路；文章、更新日志这些阅读向的页面，才继续待在主页框架里。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;你怎么用&lt;a href=&quot;#你怎么用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;打开 &lt;a href=&quot;/pull/&quot;&gt;/pull/&lt;/a&gt;，或导航里的「取图」。&lt;/li&gt;
&lt;li&gt;选一个渠道（也可以不选）。&lt;/li&gt;
&lt;li&gt;从 App / 网页复制链接或分享口令，贴进去。&lt;/li&gt;
&lt;li&gt;点「识别并提取」，等图铺到桌上。&lt;/li&gt;
&lt;li&gt;勾选要下的，下载；想留着下次再下，可以存进「我的图集」。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;小红书和微博本身网页/App 往往也能存图——取图更适合你想&lt;strong&gt;一次收下多张、或打包带走&lt;/strong&gt;的时候。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;一点实话&lt;a href=&quot;#一点实话&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;公开帖最稳。登录墙、风控、临时短链失效，都会让某次提取空手而归。Instagram 在本机开发时常常要走代理，线上环境也取决于服务器能不能够到对应 CDN。这些坑我写进工具页的提示里了，遇到空结果先换一条公开链接试试。&lt;/p&gt;&lt;p&gt;如果你也经常从社媒「抠图」——欢迎直接用 &lt;a href=&quot;/pull/&quot;&gt;取图&lt;/a&gt;。这张书桌是给你的。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>「期末数学超级联赛」</title><link>https://stulanez.com/posts/math-league-2026/</link><guid isPermaLink="true">https://stulanez.com/posts/math-league-2026/</guid><description>给初一（3）班设计的19卷期末复习联赛——五大赛制、49人晋级迷局、代币经济与海克斯技能。这是一篇把规则讲清楚、也把设计动机讲出来的文章。</description><pubDate>Wed, 26 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;期末复习最怕的不是”不会做”，而是&lt;strong&gt;不想做&lt;/strong&gt;。题目再经典，落到”反正还有明天”的念头里，就都白搭了。&lt;/p&gt;
&lt;p&gt;所以我想了个办法：把复习变成一场&lt;strong&gt;联赛&lt;/strong&gt;。一共 19 张卷子，49 个人，五个赛制层层嵌套，每人从进赛到终局都有一条自己的积分与晋级线——而你赚的不是单一的分数，而是&lt;strong&gt;代币&lt;/strong&gt;，可以在每阶段的商店里换成真实奖励。&lt;/p&gt;
&lt;p&gt;这篇文章不只是在复述规则，我把它当作一个&lt;strong&gt;教学系统设计案例&lt;/strong&gt;来讲。下面先给你能直接上手玩的交互版，再拆开说设计思路。&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;🎮 想要真正”当一把选手”？直接进&lt;strong&gt;联赛模拟器&lt;/strong&gt;，把 19 卷打完、抽海克斯、看晋级表——点下面按钮体验。&lt;/p&gt;&lt;/blockquote&gt;
&lt;div&gt;&lt;a href=&quot;/league/5.15.html&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;🎮&lt;/span&gt;&lt;span&gt;体验联赛模拟器&lt;/span&gt;&lt;/a&gt;&lt;div&gt;打开完整互动版 · 建议用电脑端&lt;/div&gt;&lt;/div&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;🏆&lt;/span&gt; &lt;h3&gt;期末数学超级联赛&lt;/h3&gt;&lt;/div&gt; &lt;p&gt;19 卷闭环实战教学手册 · 共 19 卷 · 49 人参赛&lt;/p&gt;&lt;/div&gt; &lt;div&gt;赛程总览 五种赛制 选手名单 代币经济 海克斯技能&lt;/div&gt; &lt;div&gt;&lt;div&gt;&lt;div&gt;第一赛段第二赛段第三赛段第四赛段&lt;/div&gt; &lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;第一赛段 · 白银瑞士轮&lt;/div&gt; &lt;div&gt;A级联赛 · G1 - G5&lt;/div&gt;&lt;/div&gt; &lt;span&gt;5 卷&lt;/span&gt;&lt;/div&gt; &lt;p&gt;标准 5 轮瑞士轮。每轮两两对决，单张卷数学分数高者得 1 分。累计 3 胜立即提前晋级，但仍继续匹配实力相当对手。第五轮有跨组对调与“以下犯上/炸鱼”分类讨论。&lt;/p&gt; &lt;/div&gt;&lt;/div&gt;     &lt;div&gt;&lt;div&gt;机制设计&lt;/div&gt; &lt;div&gt;&lt;div&gt;&lt;span&gt;防摆烂机制：&lt;/span&gt; &lt;span&gt;全程定期反馈家长群，只陈述事实；错误一次下次必会，屡次不订正扣1代币。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;激励机制：&lt;/span&gt; &lt;span&gt;完成“以下犯上”成就获1代币；团队赛每队MVP获1代币；每小局选“最不可思议”赛果获1代币；瑞士轮完成两次“复仇”获1代币。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;防作弊机制：&lt;/span&gt; &lt;span&gt;出现作弊行为扣1代币，一视同仁，保留面子但反馈家长且银行自动扣。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;section&gt;&lt;h2&gt;为什么是”联赛”而不是”刷题计划”&lt;a href=&quot;#为什么是联赛而不是刷题计划&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;一张练习卷做完了，刷题者面对的是一串对错；而一个选手面对的是&lt;strong&gt;一个排名、一段赛程、一种可能晋级或降级的命运&lt;/strong&gt;。差别不是答案，而是&lt;strong&gt;动力结构&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;联赛把”做得对”这种抽象反馈，置换成了几种具体的东西：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;对阵&lt;/strong&gt;：你每次的成绩会变成”这局你赢了谁 / 输了谁”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;段位&lt;/strong&gt;：从 48 强瑞士轮一路打到 8 强大师赛，你能看到自己在一个金字塔里的位置。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代币&lt;/strong&gt;：净胜、小组第一、团队名次……每一样都对应一份可兑换的收益。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;也就是说，这个赛制的目的不是”考得更难”，而是&lt;strong&gt;让每一种学习行为都有即时的、可累积的回报&lt;/strong&gt;。越到后面，冲突越精彩，人反而越容易被”还想再打一场”推着往前走。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;五种赛制，其实是对”公平”的五种理解&lt;a href=&quot;#五种赛制其实是对公平的五种理解&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;整个联赛只用了一套题库，却配了五种赛制。这不是为了炫技，而是因为它们各自解决了一个不同的问题。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;瑞士轮&lt;/strong&gt;：胜者打胜者，越到后面对手越接近自己真实水平。它压制”运气”，把强者稳定地往上推。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;小组赛&lt;/strong&gt;：随机分进 A/B/C/D 组单循环。强者也被迫有一个”死亡小组”的变数——它的残酷，恰恰让”晋级”有了戏剧性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;双败淘汰&lt;/strong&gt;：给一次容错。它能接受高手发挥失常，又确保只有真正扛到最后的人夺冠。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;团队赛&lt;/strong&gt;：把个人题分变四个人的均分。这一制更看运气，也更能照出”愿意为团队复习”和”只想躺平”的人。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;个人积分赛&lt;/strong&gt;：只看总分，最纯粹的一刀切。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这五种轮着来，等于在同一套题目上，用不同的”评价函数”反复衡量每个人——既避免单一赛制偏心，也让整个周期不至于过早定型。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;代币经济：把”学习”变成可交易的东西&lt;a href=&quot;#代币经济把学习变成可交易的东西&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;规则的骨架是赛制，而让骨架活起来的是&lt;strong&gt;代币&lt;/strong&gt;。它在每个阶段发放，每个阶段结算，也能存到下一阶段。&lt;/p&gt;&lt;p&gt;不同联赛的设计，其实刻意做到了&lt;strong&gt;获得机会大致对等&lt;/strong&gt;：有时更低级的联赛反而能赚更多。这样每个选手，无论实力高低，都有”继续做题”的动机。代币只存在于系统银行里、不能私下交易，但兑换后的奖品可以随意分享——防止的是一套，鼓励的是另一套。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;海克斯（Hex）：给战局加一点随机变量&lt;a href=&quot;#海克斯hex给战局加一点随机变量&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;“海克斯”是我从自走棋那里借来的概念——一种局外技能，在第一、第三赛段开始前抽给每个人。&lt;/p&gt;&lt;p&gt;作用是在确定的赛制上，叠一层&lt;strong&gt;玩家可主动选择/被动触发的策略变量&lt;/strong&gt;。比如”意外之财”直接给代币、“掀桌”能和同分对手换位、“正义报复”赢了就掠夺对手代币。它让”公平的赛制”多了一点”不公平但可博弈”的趣味，也让每个玩家有自己的一张暗牌。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;防摆烂、防作弊：规则的另一半&lt;a href=&quot;#防摆烂防作弊规则的另一半&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;再好的奖励也有漏洞。所以另一半规则是”兜底”：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;防摆烂&lt;/strong&gt;：全程定期反馈家长群，只陈述事实；错题下次必须会，屡次不订正就扣代币。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;防作弊&lt;/strong&gt;：出现作弊行为扣 1 代币，一视同仁，但不当面点破，由系统银行自动扣。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;激励&lt;/strong&gt;：完成”以下犯上”成就、当上团队 MVP、打出”最不可思议”赛果、瑞士轮完成两次复仇，都能额外拿代币。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这本质上是在说：&lt;strong&gt;奖励要够诱人，但偷懒和作假必须明确有代价，而代价由系统执行、不由人执行&lt;/strong&gt;——这样老师不必当那个”说了算”的人，规则本身在起作用。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;最后：规则是手段，不是目的&lt;a href=&quot;#最后规则是手段不是目的&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这套联赛的初衷，自始至终是”激励各位好好复习，备考期末”。规则只是把”好好复习”这种喊口号的话，变成了一套&lt;strong&gt;能被看到、被追到、被奖励&lt;/strong&gt;的流程。真正重要的是那句写在法典里的话：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;不会就是不会，真正踏踏实实地自己花时间搞懂就行。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;如果你也想在自己班里试一套类似的机制，不用照搬这个复杂度——抓住”&lt;strong&gt;即时反馈 + 可累积回报 + 明确的代价&lt;/strong&gt;”这三点，就已经能撬动很多原本不想刷题的人了。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>星域幻想</title><link>https://stulanez.com/posts/star-domain-fantasy/</link><guid isPermaLink="true">https://stulanez.com/posts/star-domain-fantasy/</guid><description>旅行者黄壹甄穿过星海、幻象与恶作剧，在荒诞的宇宙旅途中寻找生命、归属与自我的答案。</description><pubDate>Wed, 26 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;旅行者黄壹甄穿过星海、幻象与恶作剧，在荒诞的宇宙旅途中寻找生命、归属与自我的答案。&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;/posts/star-domain-fantasy/&quot;&gt;前往网站阅读完整分章版《星域幻想》&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>永恒欲望上线了</title><link>https://stulanez.com/posts/hello-stulanez/</link><guid isPermaLink="true">https://stulanez.com/posts/hello-stulanez/</guid><description>站点刚挂到 stulanez.com。这里会慢慢写下代码、生活，以及还想继续做的事。</description><pubDate>Wed, 26 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这是永恒欲望的第一篇。&lt;/p&gt;
&lt;p&gt;站点基于 &lt;a href=&quot;https://github.com/CuteLeaf/Firefly&quot; target=&quot;_blank&quot;&gt;Firefly&lt;/a&gt; 搭建，部署在 Vercel，域名是 &lt;code&gt;stulanez.com&lt;/code&gt;。现在还很空，之后会把想留下的东西慢慢写进来。&lt;/p&gt;
&lt;p&gt;如果页面哪里看起来还像演示站，告诉我就行，我们继续改。&lt;/p&gt;</content:encoded></item></channel></rss>