<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss/feed.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Ksable&apos;s 小屋</title><description>一个记录生活，分享技术的博客</description><link>https://blog.ksable.top</link><item><title>碎碎念: 用 AI 给自己写了个博客后台</title><link>https://blog.ksable.top/post/ssn/%E7%A2%8E%E7%A2%8E%E5%BF%B5-26-10-18-%E7%94%A8-ai-%E7%BB%99%E8%87%AA%E5%B7%B1%E5%86%99%E4%BA%86%E4%B8%AA%E5%8D%9A%E5%AE%A2%E5%90%8E%E5%8F%B0</link><guid isPermaLink="false">ssn/碎碎念-26-10-18-用-ai-给自己写了个博客后台</guid><description>从下午三点半到晚上十点半，5个多小时、17 个提交，我让 AI 帮我写了个博客后台。比之前的 Decap CMS 方便，界面更好看，手机上也能用，现在已经部署在 sakura.ksable.top，以后更新博客会方便很多。</description><pubDate>Sun, 18 Oct 2026 15:50:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;本文由 AI 辅助编写&lt;/p&gt;
&lt;p&gt;本文纯 AI 手笔，人工含量：0%&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;今天下午三点半，我做了个决定：自己写一个博客后台。&lt;/p&gt;
&lt;p&gt;晚上十点半，它已经能用了。&lt;/p&gt;
&lt;p&gt;5个多小时，17 个提交，近七亿 Token。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;这个想法其实在心里放很久了。&lt;/p&gt;
&lt;p&gt;2024 年的时候，为了能在线改博客，我折腾过 Decap CMS，从 Netlify 到 Git Gateway 一步一步配，配完还写了篇&lt;a href=&quot;/post/post/posts-%E4%BD%BF%E7%94%A8-decap-cms-%E4%BD%9C%E4%B8%BA-hexo-%E5%90%8E%E7%AB%AF%E4%BB%A5%E5%AE%9E%E7%8E%B0%E5%9C%A8%E7%BA%BF%E7%BC%96%E8%BE%91%E4%BF%9D%E5%A7%86%E7%BA%A7%E6%95%99%E7%A8%8B/&quot;&gt;保姆级教程&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;但说实在的，那玩意儿配好之后，我用的次数一只手数得过来。界面不太好看，手机上更难用，想加个字段还得回去改配置、再重新部署。后来博客从 Hexo 搬到了 Astro，Netlify 的 Identity 我也不用了，Decap 就一直搁在那儿。&lt;/p&gt;
&lt;p&gt;所以这些年我更新博客的方式，还是老一套：开电脑、开编辑器、改完 push。人在外面的时候，基本就等于不更新。&lt;/p&gt;
&lt;p&gt;就一直想着，什么时候能有一个自己用着顺手的。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;今天终于动手了。&lt;/p&gt;
&lt;p&gt;我把想法和需求跟 AI 讲了一遍，还认真写了个 &lt;code&gt;plan.md&lt;/code&gt;——现在这东西还在仓库里，写得挺像那么回事的。&lt;/p&gt;
&lt;p&gt;然后先让它出了四套视觉方向。我一眼就看中了 01 号「樱糖手帐」：文件是索引卡，编辑是纸，提交是盖章。&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://k-pan.r2.pzyq.dpdns.org/blog/post/ssn/%E7%A2%8E%E7%A2%8E%E5%BF%B5-26-10-18-%E7%94%A8-AI-%E7%BB%99%E8%87%AA%E5%B7%B1%E5%86%99%E4%BA%86%E4%B8%AA%E5%8D%9A%E5%AE%A2%E5%90%8E%E5%8F%B0/1.png&quot; alt=&quot;四套视觉方向的对比&quot; loading=&quot;lazy&quot; width=&quot;1425&quot; height=&quot;1515&quot; /&gt;&lt;figcaption&gt;四套视觉方向的对比&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;接着就是一下午加一晚上。&lt;/p&gt;
&lt;p&gt;代码几乎都是 AI 写的。需求是我提的，视觉方向是我挑的，每个界面也是我一张张截图看过去的；但具体怎么实现，我基本没管。我的工作更像是：提要求、点按钮，然后说「这个不好看，再改改」。&lt;/p&gt;
&lt;p&gt;中间也折腾了不少。比如夜间模式，也不是拍脑袋定的，先单独做了一页对比稿，才定下来用暖墨纸；还有 PWA，代码明明写好了，&lt;code&gt;pnpm dev&lt;/code&gt; 里怎么都看不到 Service Worker，折腾半天才知道开发环境根本不注册，得 &lt;code&gt;build&lt;/code&gt; 之后再 &lt;code&gt;preview&lt;/code&gt; 才能验。&lt;/p&gt;
&lt;p&gt;最后还加了「本机备份」。写文章最怕手滑刷新，现在底栏会显示「本机已备份 22&lt;/p&gt;&lt;div&gt;&lt;/div&gt;」，刷新后还能把没保存的内容捞回来，心里踏实多了。&lt;p&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;到晚上十点半，最后一个提交之后，我打开网页，点开一篇文章，改了个标题，点「盖章保存」。&lt;/p&gt;
&lt;p&gt;然后去 GitHub 上看，commit 多了一条。&lt;/p&gt;
&lt;p&gt;那一刻还挺爽的。&lt;/p&gt;
&lt;p&gt;顺手把 &lt;code&gt;dist/&lt;/code&gt; 发布到了 &lt;a href=&quot;https://sakura.ksable.top/&quot;&gt;sakura.ksable.top&lt;/a&gt;，这下在教室、在宿舍、在路上，打开网页就能写。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;说回正题，为什么说它比之前的 Decap 方便：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;不用装环境。它就是个纯静态网页，现在部署在 &lt;a href=&quot;https://sakura.ksable.top/&quot;&gt;sakura.ksable.top&lt;/a&gt;，地址收藏在手机浏览器里，和刷帖子一样随手。&lt;/li&gt;
&lt;li&gt;界面好看多了。不是那种「能用就行」的 CMS 后台，是一张手帐纸；晚上还有夜间模式。&lt;/li&gt;
&lt;li&gt;手机上终于能用了。左边抽屉是文件树，下面是正文，盖章按钮固定在纸尾。&lt;/li&gt;
&lt;li&gt;保存就是提交。不用开终端，也不用等本地构建，改完点一下，GitHub 上就多一个 commit。&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;img src=&quot;https://k-pan.r2.pzyq.dpdns.org/blog/post/ssn/%E7%A2%8E%E7%A2%8E%E5%BF%B5-26-10-18-%E7%94%A8-AI-%E7%BB%99%E8%87%AA%E5%B7%B1%E5%86%99%E4%BA%86%E4%B8%AA%E5%8D%9A%E5%AE%A2%E5%90%8E%E5%8F%B0/2.png&quot; alt=&quot;手机上也能改文章了&quot; loading=&quot;lazy&quot; width=&quot;375&quot; height=&quot;1691&quot; /&gt;&lt;figcaption&gt;手机上也能改文章了&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;以后想发碎碎念，不用等回家、不用等有空，路上想到什么，掏出手机就能改两句。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;不过说实话，这次做完，最让我有感触的不是界面，是 AI。&lt;/p&gt;
&lt;p&gt;以前写东西，最卡的是「想得到、做不出来」：脑子里有个大概样子，但不会 CSS，不会 React，查半天文档，写两天，做出来个四不像。&lt;/p&gt;
&lt;p&gt;现在不一样了。我只要把想要的说清楚，剩下的 AI 都能做，还做得比我好。&lt;/p&gt;
&lt;p&gt;但做了这一下午我也发现：AI 能替我把代码写出来，替不了我做决定。&lt;/p&gt;
&lt;p&gt;什么样的界面算好看、哪个交互顺手、什么地方该省、什么地方必须留——这些没人能替我想。今天 16 个提交，每一个都是我自己点的头。&lt;/p&gt;
&lt;p&gt;所以门槛降低之后，真正难的反而是另一件事：你到底想要什么。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;写完这篇已经快十二点了，明天还有课，先睡了。&lt;/p&gt;
&lt;p&gt;以后应该能勤快地更新博客了吧……先立个 flag，别下个月又一个月不更新。&lt;/p&gt;
&lt;p&gt;线上地址：&lt;a href=&quot;https://sakura.ksable.top/&quot;&gt;https://sakura.ksable.top/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;项目地址：&lt;a href=&quot;https://github.com/God-2077/astro-blog-studio&quot;&gt;God-2077/astro-blog-studio&lt;/a&gt;&lt;/p&gt;</content:encoded><category>category:碎碎念</category><category>tag:S-5</category></item><item><title>Posts: Astro Blog Studio：给静态博客一个纯前端的在线编辑后台</title><link>https://blog.ksable.top/post/post/posts-astro-blog-studio-%E7%BB%99%E9%9D%99%E6%80%81%E5%8D%9A%E5%AE%A2%E4%B8%80%E4%B8%AA%E7%BA%AF%E5%89%8D%E7%AB%AF%E7%9A%84%E5%9C%A8%E7%BA%BF%E7%BC%96%E8%BE%91%E5%90%8E%E5%8F%B0</link><guid isPermaLink="false">post/posts-astro-blog-studio-给静态博客一个纯前端的在线编辑后台</guid><description>静态博客更新文章太麻烦：开电脑、改 Markdown、再 commit、push、等构建。Astro Blog Studio 是一个纯前端、无后端的浏览器工作台，用 GitHub API 直接读写博客仓库里的 Markdown，支持文件树、实时预览、frontmatter 表单、盖章提交、本机备份、夜间模式与 PWA。本文介绍它的功能、设计、安全模型、使用方法和已知限制。</description><pubDate>Sun, 18 Oct 2026 15:30:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;本文由 AI 辅助编写&lt;/p&gt;
&lt;p&gt;本文纯 AI 手笔，人工含量：0%&lt;/p&gt;
&lt;/blockquote&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;每次想改点东西，流程大概是：打开电脑 → 打开编辑器 → 找到那一篇 → 改完 → commit → push → 等 CI 构建完才算上线。要只是改个错别字，人又刚好在外面，就只能先记在备忘录里，回家再说。&lt;/p&gt;
&lt;p&gt;2024 年的时候我折腾过 Decap CMS，还写过一篇&lt;a href=&quot;/post/post/posts-%E4%BD%BF%E7%94%A8-decap-cms-%E4%BD%9C%E4%B8%BA-hexo-%E5%90%8E%E7%AB%AF%E4%BB%A5%E5%AE%9E%E7%8E%B0%E5%9C%A8%E7%BA%BF%E7%BC%96%E8%BE%91%E4%BF%9D%E5%A7%86%E7%BA%A7%E6%95%99%E7%A8%8B/&quot;&gt;保姆级教程&lt;/a&gt;，算是解决了「人在外面也能改文章」的问题。&lt;/p&gt;
&lt;p&gt;但用久了还是有几个地方不太舒服：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;界面不太好看（可能是我要求太高了）&lt;/li&gt;
&lt;li&gt;手机上基本没法用&lt;/li&gt;
&lt;li&gt;想加一个 frontmatter 字段，要回去改 &lt;code&gt;config.yml&lt;/code&gt;，再重新部署&lt;/li&gt;
&lt;li&gt;后来博客从 Hexo 搬到了 Astro，Netlify 的 Identity 那套也早就不用了&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;于是就有了这个项目——&lt;strong&gt;Astro Blog Studio&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;现在它已经部署在 &lt;a href=&quot;https://sakura.ksable.top/&quot;&gt;sakura.ksable.top&lt;/a&gt; 上了，打开就能用。&lt;/p&gt;
&lt;p&gt;本文会介绍它是什么、长什么样、能做什么，以及和 Decap CMS 相比有什么不同，最后也会把已知的限制写清楚，方便你判断它适不适合你。&lt;/p&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;一个纯前端、没有后端的浏览器工作台，用 GitHub API 直接读写博客仓库里的 Markdown。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;没有服务器，没有数据库，没有第三方统计。整个应用就是一个静态网页，可以丢在任何静态托管上；浏览器直接和 &lt;code&gt;api.github.com&lt;/code&gt; 打交道。&lt;/p&gt;
&lt;p&gt;一次保存大概是这个流程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开网页，解锁（设备指纹或密码）&lt;/li&gt;
&lt;li&gt;在左边的索引卡里找到文件&lt;/li&gt;
&lt;li&gt;改正文，或者改 frontmatter&lt;/li&gt;
&lt;li&gt;点「盖章保存」，提交到 GitHub&lt;/li&gt;
&lt;li&gt;收到一张提交小票（sha、路径、时间、GitHub 链接）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;不用开本地编辑器，也不用开终端。&lt;/p&gt;
&lt;p&gt;源码开源在 GitHub 上，协议是 AGPL-3.0；我自己也部署了一份，打开就能用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;线上地址：&lt;a href=&quot;https://sakura.ksable.top/&quot;&gt;sakura.ksable.top&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;源码：&lt;a href=&quot;https://github.com/God-2077/astro-blog-studio&quot;&gt;God-2077/astro-blog-studio&lt;/a&gt;&lt;/li&gt;
&lt;/ul&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;/td&gt;&lt;td&gt;React 19 + TypeScript + Vite 7&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;编辑器&lt;/td&gt;&lt;td&gt;CodeMirror 6 + marked + DOMPurify&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GitHub&lt;/td&gt;&lt;td&gt;Octokit（REST + GraphQL）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;样式&lt;/td&gt;&lt;td&gt;Tailwind CSS 4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;状态&lt;/td&gt;&lt;td&gt;TanStack Query + Zustand&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;离线&lt;/td&gt;&lt;td&gt;vite-plugin-pwa&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;另外还配了 108 个单元测试、7 个真实仓库的集成测试和 19 个 Playwright 测试——毕竟改的是自己的博客仓库，不敢马虎。&lt;/p&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;在写代码之前，先让 AI 出了四套视觉方向，最后挑了 01 号「樱糖手帐」。&lt;/p&gt;
&lt;p&gt;思路是把博客编辑做成一张摊在桌上的手帐纸：&lt;strong&gt;文件是索引卡，编辑是纸，提交是盖章。&lt;/strong&gt;&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://k-pan.r2.buasis.eu.org/blog/post/note/Posts-Astro-Blog-Studio-%E7%BB%99%E9%9D%99%E6%80%81%E5%8D%9A%E5%AE%A2%E4%B8%80%E4%B8%AA%E7%BA%AF%E5%89%8D%E7%AB%AF%E7%9A%84%E5%9C%A8%E7%BA%BF%E7%BC%96%E8%BE%91%E5%90%8E%E5%8F%B0/1.png&quot; alt=&quot;Astro Blog Studio 工作台：左侧索引卡、今天写点什么、最近动过&quot; loading=&quot;lazy&quot; width=&quot;1425&quot; height=&quot;1091&quot; /&gt;&lt;figcaption&gt;Astro Blog Studio 工作台：左侧索引卡、今天写点什么、最近动过&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;打开就是「今天写点什么？」：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;左边是一叠索引卡：目录树、路径搜索&lt;/li&gt;
&lt;li&gt;中间是三张手写便签：全部文章、草稿、加密&lt;/li&gt;
&lt;li&gt;下面是「最近动过」，按 frontmatter 里的 &lt;code&gt;updated&lt;/code&gt; / &lt;code&gt;date&lt;/code&gt; 排&lt;/li&gt;
&lt;li&gt;右边是提交小票、今日小目标、GitHub API 配额&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;整个界面里只有一个实心樱粉按钮，就是「新建文章」；印章是唯一的红。&lt;/p&gt;
&lt;p&gt;编辑器则是「三张纸」：&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://k-pan.r2.buasis.eu.org/blog/post/note/Posts-Astro-Blog-Studio-%E7%BB%99%E9%9D%99%E6%80%81%E5%8D%9A%E5%AE%A2%E4%B8%80%E4%B8%AA%E7%BA%AF%E5%89%8D%E7%AB%AF%E7%9A%84%E5%9C%A8%E7%BA%BF%E7%BC%96%E8%BE%91%E5%90%8E%E5%8F%B0/2.png&quot; alt=&quot;Astro Blog Studio 编辑器：文件头、frontmatter 表单、Markdown 正文和实时预览&quot; loading=&quot;lazy&quot; width=&quot;1425&quot; height=&quot;1411&quot; /&gt;&lt;figcaption&gt;Astro Blog Studio 编辑器：文件头、frontmatter 表单、Markdown 正文和实时预览&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;文件头（路径、状态、GitHub / 移动 / 删除）、frontmatter 表单、Markdown 正文，右边实时预览。底栏右下角是「盖章保存」的印章。&lt;/p&gt;
&lt;p&gt;主题默认跟随系统；切到夜间是暖墨色的纸，不是反相，也不刺眼：&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://k-pan.r2.buasis.eu.org/blog/post/note/Posts-Astro-Blog-Studio-%E7%BB%99%E9%9D%99%E6%80%81%E5%8D%9A%E5%AE%A2%E4%B8%80%E4%B8%AA%E7%BA%AF%E5%89%8D%E7%AB%AF%E7%9A%84%E5%9C%A8%E7%BA%BF%E7%BC%96%E8%BE%91%E5%90%8E%E5%8F%B0/3.png&quot; alt=&quot;Astro Blog Studio 夜间模式&quot; loading=&quot;lazy&quot; width=&quot;1425&quot; height=&quot;1091&quot; /&gt;&lt;figcaption&gt;Astro Blog Studio 夜间模式&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;几个我用着顺手的功能&lt;a href=&quot;#几个我用着顺手的功能&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;文件树、搜索和「最近动过」&lt;a href=&quot;#文件树搜索和最近动过&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;左边是仓库的目录树，只显示 Markdown；搜索框可以搜路径（&lt;code&gt;Ctrl/Cmd + K&lt;/code&gt; 聚焦）。&lt;/p&gt;
&lt;p&gt;工作台的「最近动过」不是取前几篇，而是用 GraphQL 批量读取全库的 frontmatter，按 &lt;code&gt;updated&lt;/code&gt; / &lt;code&gt;date&lt;/code&gt; 排序。同时读取几批可以在设置里调（1–10，默认 3），调高会快一些，太高可能触发 GitHub 限流。&lt;/p&gt;
&lt;p&gt;超过 1000 篇时只索引前 1000 篇，界面上会提示；GraphQL 不可用时会回退到 Contents API。&lt;/p&gt;
&lt;h3&gt;表单 / 源文件双模式&lt;a href=&quot;#表单--源文件双模式&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;这个是我最喜欢的一个设计。&lt;/p&gt;
&lt;p&gt;平时用「表单」：frontmatter 的字段是动态生成的，名字、类型、必填都能在设置里配；&lt;code&gt;date&lt;/code&gt; 有格式提示，&lt;code&gt;list&lt;/code&gt; 用逗号分隔，&lt;code&gt;password&lt;/code&gt; 会打码。&lt;/p&gt;
&lt;p&gt;但有时候就是需要直接改整份文件，比如调整键的顺序、改引号、加注释。这时候切到「源文件」：一块 CodeMirror 直接编辑 &lt;code&gt;---&lt;/code&gt; 围栏 + 正文，保存时按输入原样写回——只还原原文件的 CRLF/LF 和 BOM，不解析 frontmatter，也不帮你「顺手修正」。&lt;/p&gt;
&lt;p&gt;两边来回切的时候，未保存的内容会先组合进去，不会丢。&lt;/p&gt;
&lt;h3&gt;盖章保存：提交消息、提交小票和冲突&lt;a href=&quot;#盖章保存提交消息提交小票和冲突&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;保存不是一个「保存」按钮，是「盖章」。&lt;/p&gt;
&lt;p&gt;提交消息支持模板，比如 &lt;code&gt;update: {path}&lt;/code&gt;，能用的占位符有 &lt;code&gt;{path}&lt;/code&gt;、&lt;code&gt;{title}&lt;/code&gt;、&lt;code&gt;{newPath}&lt;/code&gt;、&lt;code&gt;{dir}&lt;/code&gt;、&lt;code&gt;{name}&lt;/code&gt;、&lt;code&gt;{date}&lt;/code&gt; 等等，设置里可以改。&lt;/p&gt;
&lt;p&gt;保存成功后会收到一张小票：提交 sha、路径、时间、GitHub 链接。&lt;/p&gt;
&lt;p&gt;更新和删除都带 &lt;code&gt;sha&lt;/code&gt; 做乐观锁。如果远端已经变过，会返回 409，弹出「重新加载 / 覆盖远端 / 取消」，不会静默把你的改动盖掉。&lt;/p&gt;
&lt;p&gt;移动和重命名是用 Git Data API 一次提交完成的，不会出现「先加后删」的中间状态。&lt;/p&gt;
&lt;h3&gt;没保存就刷新？本机有备份&lt;a href=&quot;#没保存就刷新本机有备份&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;写文章最怕的就是手滑。&lt;/p&gt;
&lt;p&gt;编辑器会在大约 600ms 防抖后，把整份文件的快照写进浏览器的 IndexedDB，底栏显示「本机已备份 HH&lt;/p&gt;&lt;div&gt;&lt;/div&gt;」。&lt;p&gt;&lt;/p&gt;
&lt;p&gt;下次进入同一个文件（包括刷新后还没提交的新稿），会弹窗问你要不要恢复，可以选「稍后 / 丢弃备份 / 恢复备份」。恢复旧稿后保存仍然走 409 冲突处理，不会覆盖远端的新改动。&lt;/p&gt;
&lt;p&gt;保存、移动、删除成功后会自动清掉对应的备份；设置里也可以关掉或清除。备份只存在本机，不上传，也不进 Service Worker 缓存。&lt;/p&gt;
&lt;h3&gt;手机和 PWA&lt;a href=&quot;#手机和-pwa&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;手机上：索引收进左侧抽屉，预览放到正文下面，盖章按钮固定在纸尾。&lt;/p&gt;
&lt;p&gt;另外它是可以安装的 PWA：构建产物带 manifest 和 Service Worker，应用壳（HTML/JS/CSS/字体/图标）预缓存，第二次打开、弱网甚至断网都能先把界面打开——不过读文件和保存还是要联网，&lt;code&gt;api.github.com&lt;/code&gt; 永远是 NetworkOnly。&lt;/p&gt;
&lt;p&gt;有新版本时会弹窗提示，点「立即刷新」才刷新，不会偷偷自动刷新。&lt;/p&gt;
&lt;h3&gt;PAT 只存在浏览器里&lt;a href=&quot;#pat-只存在浏览器里&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;可能有人会担心：把 GitHub 令牌放在浏览器里靠谱吗？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;令牌用 AES-GCM-256 加密后写进 localStorage，密钥由 PBKDF2-SHA256（60 万次）派生&lt;/li&gt;
&lt;li&gt;解锁后的令牌只在内存里；锁定会清空内存、查询缓存和编辑会话&lt;/li&gt;
&lt;li&gt;只有一个外部请求：&lt;code&gt;api.github.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;没有第三方脚本、统计、字体 CDN；预览用 DOMPurify 净化；外链自动加 &lt;code&gt;rel=&quot;noreferrer noopener&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;应用本身也设置了 &lt;code&gt;noindex, nofollow&lt;/code&gt;，不会被搜索引擎收录&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;需要说明的是：设备指纹不是安全边界。如果想更稳妥，设置一个密码并开启「密码 + 设备」双因子，公共电脑上用完记得锁定。&lt;/p&gt;
&lt;h2&gt;和 Decap CMS 相比&lt;a href=&quot;#和-decap-cms-相比&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;之前写过一篇 Decap CMS 的教程，这里就顺手对比一下。&lt;/p&gt;













































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Decap CMS&lt;/th&gt;&lt;th&gt;Astro Blog Studio&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;部署&lt;/td&gt;&lt;td&gt;需要 Netlify Identity + Git Gateway&lt;/td&gt;&lt;td&gt;任意静态托管 + PAT&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;登录&lt;/td&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;通用 CMS&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;td&gt;抽屉索引 + 固定盖章&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;frontmatter&lt;/td&gt;&lt;td&gt;改 &lt;code&gt;config.yml&lt;/code&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;td&gt;表单 + CodeMirror 源文件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;离线&lt;/td&gt;&lt;td&gt;无&lt;/td&gt;&lt;td&gt;PWA 应用壳&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Decap CMS 的功能其实更全（媒体库、编辑工作流等），只是它面向所有静态网站，配置很重，界面也不是按我的习惯来的。Astro Blog Studio 只服务我自己的博客，所以可以把每一个细节都做成自己顺手的样子——比如提交消息模板、frontmatter 字段、本机备份，都是按我的使用习惯做的。&lt;/p&gt;
&lt;p&gt;如果你也在维护静态博客，并且：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文章和源码在 GitHub 上&lt;/li&gt;
&lt;li&gt;只想给自己一个人用&lt;/li&gt;
&lt;li&gt;愿意创建和管理一个 PAT&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;那它可能也适合你。&lt;/p&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;a href=&quot;https://sakura.ksable.top/&quot;&gt;sakura.ksable.top&lt;/a&gt;，打开就能用；也可以自己跑一份，或者部署到自己的域名。&lt;/p&gt;
&lt;h3&gt;1. 创建 GitHub Token&lt;a href=&quot;#1-创建-github-token&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在 GitHub 创建一个 fine-grained personal access token，只授权你的内容仓库：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Repository permissions → Contents: Read and write&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Metadata: Read-only&lt;/code&gt;（会自动带上）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不需要 PR、Actions、Pages 的权限。具体步骤可以看 &lt;a href=&quot;https://docs.github.com/zh/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens&quot;&gt;GitHub 官方文档&lt;/a&gt;。&lt;/p&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;直接打开 &lt;a href=&quot;https://sakura.ksable.top/&quot;&gt;sakura.ksable.top&lt;/a&gt;，第一次进去是 Setup 页。&lt;/p&gt;
&lt;p&gt;先说明一下：这个页面只是前端，仓库、令牌和设置都只存在你自己的浏览器里（令牌是加密后才落盘的），我这边看不到任何人的内容。如果介意在别人的域名下输入令牌，就按第 4 步自己部署一份，代码是同一份。&lt;/p&gt;
&lt;p&gt;想先看看界面、又不想填令牌的话，可以打开演示模式，用的是内存里的假数据，不联网、不写仓库：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://sakura.ksable.top/?demo=1&quot;&gt;https://sakura.ksable.top/?demo=1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;想本地跑也可以：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; clone&lt;/span&gt;&lt;span&gt; git@github.com:God-2077/astro-blog-studio.git&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; astro-blog-studio&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; dev&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;打开 &lt;a href=&quot;http://localhost:5173&quot;&gt;http://localhost:5173&lt;/a&gt; 就行。&lt;/p&gt;
&lt;h3&gt;3. 连接仓库&lt;a href=&quot;#3-连接仓库&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在 Setup 页里填：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;仓库：&lt;code&gt;owner/name&lt;/code&gt; 或者 GitHub URL&lt;/li&gt;
&lt;li&gt;分支：不填就用默认分支&lt;/li&gt;
&lt;li&gt;文章根目录：我这个博客是 &lt;code&gt;src&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;排除规则：比如 &lt;code&gt;src/content/blog/en&lt;/code&gt;、&lt;code&gt;src/content/blog/ja&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;然后选择解锁方式：勾选设备指纹，刷新后自动解锁；或者再设一个密码。&lt;/p&gt;
&lt;h3&gt;4. 部署（可选）&lt;a href=&quot;#4-部署可选&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;如果直接用线上地址，这一步可以跳过。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pnpm build&lt;/code&gt; 之后把 &lt;code&gt;dist/&lt;/code&gt; 丢到任意静态托管就行（Cloudflare Pages、Vercel、GitHub Pages、Netlify 都可以）。用的是 HashRouter，不需要 SPA 重写规则。&lt;/p&gt;
&lt;p&gt;如果部署在子路径，构建时加 &lt;code&gt;STUDIO_BASE=/studio/&lt;/code&gt;。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;建议给站点加 CSP，至少限制 &lt;code&gt;script-src &apos;self&apos;&lt;/code&gt;、&lt;code&gt;connect-src &apos;self&apos; https://api.github.com&lt;/code&gt;、&lt;code&gt;img-src &apos;self&apos; data: https:&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&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;单文件编辑；没有图片上传、没有跨文件搜索（只搜路径）、也没有版本历史 UI&lt;/li&gt;
&lt;li&gt;冲突处理只有「重新加载 / 覆盖 / 取消」，没有逐行 merge&lt;/li&gt;
&lt;li&gt;只支持 UTF-8 的 Markdown / MDX；二进制文件和超大文件会提示不支持&lt;/li&gt;
&lt;li&gt;GitHub Contents API 单文件大约 1MB 限制；分支保护、只读令牌会在写的时候返回 403&lt;/li&gt;
&lt;li&gt;设备指纹不是安全边界；公共电脑请设密码 + 双因子&lt;/li&gt;
&lt;li&gt;离线只缓存前端：断网能打开界面，但文件树、正文、提交还是要联网，没有离线保存队列&lt;/li&gt;
&lt;li&gt;预览不是跟正式站 100% 一致（差异会写在页面上，源文件始终是保底）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;之后想做的&lt;a href=&quot;#之后想做的&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;图片粘贴上传&lt;/li&gt;
&lt;li&gt;跨文件全文搜索&lt;/li&gt;
&lt;li&gt;命令面板&lt;/li&gt;
&lt;li&gt;封面 / 日历视图&lt;/li&gt;
&lt;li&gt;离线编辑和保存队列&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;先把这些记下来，做到哪算哪。&lt;/p&gt;
&lt;h2&gt;常见问题&lt;a href=&quot;#常见问题&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;需要服务器或数据库吗？&lt;a href=&quot;#需要服务器或数据库吗&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;不需要。它就是个纯静态网页，所有读写都从浏览器直接请求 &lt;code&gt;api.github.com&lt;/code&gt;；&lt;code&gt;pnpm build&lt;/code&gt; 之后把 &lt;code&gt;dist/&lt;/code&gt; 放到静态托管就能用，没有服务端运行时。&lt;/p&gt;
&lt;h3&gt;只能给 Astro 博客用吗？&lt;a href=&quot;#只能给-astro-博客用吗&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;不是。应用只认 GitHub 仓库里的 Markdown 文件，文章根目录、扩展名、排除规则、frontmatter 字段都能在设置里改，所以 Hexo、Hugo、Astro 这类用 Markdown 写文章的静态博客都能接。&lt;/p&gt;
&lt;h3&gt;把 PAT 放在浏览器里安全吗？&lt;a href=&quot;#把-pat-放在浏览器里安全吗&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;令牌加密后才落盘，解锁后只在内存里；应用不加载任何第三方脚本，外部请求只有 &lt;code&gt;api.github.com&lt;/code&gt;。设备指纹不是安全边界，公共电脑上建议设密码并开启双因子。&lt;/p&gt;
&lt;h3&gt;手机上能写文章吗？&lt;a href=&quot;#手机上能写文章吗&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;可以。文件树收在抽屉里，预览在正文下面，保存按钮固定在底部，还可以把它安装到手机主屏。&lt;/p&gt;
&lt;h3&gt;会不会把仓库改坏？&lt;a href=&quot;#会不会把仓库改坏&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;保存和删除都带 &lt;code&gt;sha&lt;/code&gt; 校验，远端有变化会先弹窗让你选，不会静默覆盖；frontmatter 只回写改过的字段，CRLF/LF、BOM 和结尾换行都会保留。&lt;/p&gt;
&lt;h2&gt;相关链接&lt;a href=&quot;#相关链接&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;线上地址：&lt;a href=&quot;https://sakura.ksable.top/&quot;&gt;sakura.ksable.top&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;项目仓库：&lt;a href=&quot;https://github.com/God-2077/astro-blog-studio&quot;&gt;God-2077/astro-blog-studio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;旧文：&lt;a href=&quot;/post/post/posts-%E4%BD%BF%E7%94%A8-decap-cms-%E4%BD%9C%E4%B8%BA-hexo-%E5%90%8E%E7%AB%AF%E4%BB%A5%E5%AE%9E%E7%8E%B0%E5%9C%A8%E7%BA%BF%E7%BC%96%E8%BE%91%E4%BF%9D%E5%A7%86%E7%BA%A7%E6%95%99%E7%A8%8B/&quot;&gt;使用 Decap CMS 作为 Hexo 后端以实现在线编辑（保姆级教程）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&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;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;有问题欢迎在下方评论，或者去 GitHub 提 issue。&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded><category>category:文章</category></item><item><title>碎碎念: 💩🐎的运动世界</title><link>https://blog.ksable.top/post/noindex/%E6%B2%A1%E6%9C%A8%E7%9A%84%E8%BF%90%E5%8A%A8%E6%A0%A1%E5%9B%AD</link><guid isPermaLink="false">noindex/没木的运动校园</guid><description>警告，该文章含🐎巨大，心智不成熟者请勿阅读</description><pubDate>Fri, 09 Oct 2026 15:26:59 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;警告，该文章含量巨大，心智不成熟者请勿阅读&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;

&lt;div&gt;点击我&lt;/div&gt;
</content:encoded><category>category:碎碎念</category><category>tag:S-3</category></item><item><title>碎碎念: 粉红色的小裙子哟</title><link>https://blog.ksable.top/post/ssn/%E7%A2%8E%E7%A2%8E%E5%BF%B5-%E7%B2%89%E7%BA%A2%E8%89%B2%E7%9A%84%E5%B0%8F%E8%A3%99%E5%AD%90%E5%93%9F</link><guid isPermaLink="false">ssn/碎碎念-粉红色的小裙子哟</guid><description>粉红色的小裙子哟！有点喜欢上自己了。。。</description><pubDate>Sun, 06 Sep 2026 16:13:00 GMT</pubDate><content:encoded>&lt;p&gt;粉红色的小裙子哟！&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://k-pan.r2.buasis.eu.org/blog/post/ssn/%E7%A2%8E%E7%A2%8E%E5%BF%B5-%E7%B2%89%E7%BA%A2%E8%89%B2%E7%9A%84%E5%B0%8F%E8%A3%99%E5%AD%90%E5%93%9F/IMG_20260907_000032.webp&quot; alt=&quot;粉红色的小裙子&quot; loading=&quot;lazy&quot; width=&quot;5184&quot; height=&quot;3888&quot; /&gt;&lt;figcaption&gt;粉红色的小裙子&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;有点喜欢上自己了。。。&lt;/p&gt;</content:encoded><category>category:碎碎念</category></item><item><title>碎碎念: 26-09-06</title><link>https://blog.ksable.top/post/ssn/%E7%A2%8E%E7%A2%8E%E5%BF%B5-26-09-06</link><guid isPermaLink="false">ssn/碎碎念-26-09-06</guid><description>我的新衣服到了，有空穿下。
新衣服</description><pubDate>Sun, 06 Sep 2026 09:57:49 GMT</pubDate><content:encoded>&lt;p&gt;我的新衣服到了，有空穿下。&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://k-pan.r2.buasis.eu.org/blog/post/ssn/%E7%A2%8E%E7%A2%8E%E5%BF%B5-26-09-06/image.webp&quot; alt=&quot;新衣服&quot; loading=&quot;lazy&quot; width=&quot;3072&quot; height=&quot;4096&quot; /&gt;&lt;figcaption&gt;新衣服&lt;/figcaption&gt;&lt;/figure&gt;</content:encoded><category>category:碎碎念</category></item><item><title>碎碎念: 26-08-30</title><link>https://blog.ksable.top/post/ssn/%E7%A2%8E%E7%A2%8E%E5%BF%B5-26-08-30</link><guid isPermaLink="false">ssn/碎碎念-26-08-30</guid><description>28、29号就要去学校报到了，我想，没几个大学会这么早开学的。
昨天开了个大班会，今天早上又开了个小班会。辅导员废话好多啊~
辅导员是个女生的，报到那天，她脸上抹了一层厚厚的白粉。（脸上一直掉粉）

今天晚上就在 400 米跑道那边集合，作军训前的编排。从明天开始就要军训了，要军训 21 天，苦。</description><pubDate>Sun, 30 Aug 2026 15:57:33 GMT</pubDate><content:encoded>&lt;p&gt;28、29号就要去学校报到了，我想，没几个大学会这么早开学的。&lt;/p&gt;
&lt;p&gt;昨天开了个大班会，今天早上又开了个小班会。&lt;span&gt;辅导员废话好多啊~&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;辅导员是个女生的，&lt;span&gt;报到那天，她脸上抹了一层厚厚的白粉。（脸上一直掉粉）&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;今天晚上就在 400 米跑道那边集合，作军训前的编排。从明天开始就要军训了，要军训 21 天，苦。&lt;/p&gt;
&lt;p&gt;云南的太阳很毒，紫外线特别强。希望军训时，都是像今天一样的阴天天气，避免避免被太阳晒伤。（我还专门买了个防晒霜）&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://k-pan.r2.buasis.eu.org/blog/post/ssn/%E7%A2%8E%E7%A2%8E%E5%BF%B5-26-08-30/w.webp&quot; alt=&quot;w.webp&quot; loading=&quot;lazy&quot; width=&quot;4096&quot; height=&quot;3072&quot; /&gt;&lt;figcaption&gt;w.webp&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://k-pan.r2.buasis.eu.org/blog/post/ssn/%E7%A2%8E%E7%A2%8E%E5%BF%B5-26-08-30/q.webp&quot; alt=&quot;q.webp&quot; loading=&quot;lazy&quot; width=&quot;4032&quot; height=&quot;3024&quot; /&gt;&lt;figcaption&gt;q.webp&lt;/figcaption&gt;&lt;/figure&gt;
&lt;hr /&gt;
&lt;p&gt;之前一直用的 &lt;code&gt;i.yuki.sh&lt;/code&gt; 站点关闭了，感谢大佬的无私贡献。&lt;/p&gt;
&lt;p&gt;就最近开始考虑自己搭建个反代 &lt;code&gt;i.pximg.net&lt;/code&gt; 的服务，技术栈：Node.js + Hono + SQLite。实现看图自由。&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://k-pan.r2.buasis.eu.org/pixiv/%E3%82%AF%E3%83%A9%E3%83%8A_Atlas_%E3%82%A2%E3%83%AA%E3%82%B9%E3%82%B1%E3%82%A4_141853037_p0.png&quot; alt=&quot;クラナ_Atlas_アリスケイ&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;クラナ_Atlas_アリスケイ&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://k-pan.r2.buasis.eu.org/pixiv/%E3%82%82%E3%82%82%E3%82%93%E3%81%9F_%E3%81%8B%E3%81%8D%E6%B0%B7%E3%81%82%E3%82%8A%E3%81%8C%E3%81%A8%E2%80%A6%E3%81%BF%E3%81%A6%E3%82%88%EF%BC%81%E3%83%92%E3%82%AB%E3%83%AA%E3%81%AE%E6%89%80%E3%81%A0%E3%81%91%E5%BD%B1%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%A6%E6%9A%91%E3%81%84%E3%82%88%E3%83%BC%E3%83%BC%EF%BC%81_148915796_p0.jpg&quot; alt=&quot;ももんた_かき氷ありがと…みてよ！ヒカリの所だけ影なってて暑いよーー！&quot; loading=&quot;lazy&quot; /&gt;&lt;figcaption&gt;ももんた_かき氷ありがと…みてよ！ヒカリの所だけ影なってて暑いよーー！&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://k-pan.r2.buasis.eu.org/pixiv/-AKOvO-_%E3%83%8A%E3%82%AE%E3%82%B5_145711770_p1.jpg&quot; alt=&quot;-AKOvO-_ナギサ&quot; loading=&quot;lazy&quot; width=&quot;2467&quot; height=&quot;3798&quot; /&gt;&lt;figcaption&gt;-AKOvO-_ナギサ&lt;/figcaption&gt;&lt;/figure&gt;</content:encoded><category>category:碎碎念</category><category>tag:S-4</category></item><item><title>便笺: Alice in Cradle （爱丽丝的摇篮曲）反编译去码</title><link>https://blog.ksable.top/post/note/%E4%BE%BF%E7%AC%BA-alice-in-cradle-%E7%88%B1%E4%B8%BD%E4%B8%9D%E7%9A%84%E6%91%87%E7%AF%AE%E6%9B%B2-%E5%8F%8D%E7%BC%96%E8%AF%91%E5%8E%BB%E7%A0%81</link><guid isPermaLink="false">note/便笺-alice-in-cradle-爱丽丝的摇篮曲-反编译去码</guid><description>1
前言
《Alice In Cradle（アリス イン クレイドル）》是一款由 ひなゆあ、橋野みずは 开发的 R-18 同人 ACT 游戏，目前正在制作中。
Alice In Cradle 好玩，推荐。本文将教你把 Alice In Cradle 的马赛克给去掉。这样你就能美美的享受游戏。</description><pubDate>Sun, 30 Aug 2026 05:33:22 GMT</pubDate><content:encoded>&lt;figure&gt;&lt;img src=&quot;https://k-pan.r2.buasis.eu.org/blog/post/note/%E4%BE%BF%E7%AC%BA-Alice-in-Cradle-%E7%88%B1%E4%B8%BD%E4%B8%9D%E7%9A%84%E6%91%87%E7%AF%AE%E6%9B%B2-%E5%8F%8D%E7%BC%96%E8%AF%91%E5%8E%BB%E7%A0%81/1.png&quot; alt=&quot;1&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1600&quot; /&gt;&lt;figcaption&gt;1&lt;/figcaption&gt;&lt;/figure&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;《Alice In Cradle（アリス イン クレイドル）》是一款由 ひなゆあ、橋野みずは 开发的 R-18 同人 ACT 游戏，目前正在制作中。&lt;/p&gt;
&lt;p&gt;Alice In Cradle 好玩，推荐。本文将教你把 Alice In Cradle 的马赛克给去掉。这样你就能美美的享受游戏。&lt;/p&gt;
&lt;p&gt;如果你不想下载 dnspy 工具来反编译，也可以下载我编译好的 &lt;code&gt;Assembly-CSharp.dll&lt;/code&gt; 文件（0.30b版本）。点击 &lt;a href=&quot;https://k-pan.r2.buasis.eu.org/blog/post/note/%E4%BE%BF%E7%AC%BA-Alice-in-Cradle-%E7%88%B1%E4%B8%BD%E4%B8%9D%E7%9A%84%E6%91%87%E7%AF%AE%E6%9B%B2-%E5%8F%8D%E7%BC%96%E8%AF%91%E5%8E%BB%E7%A0%81/Assembly-CSharp.dll&quot;&gt;Assembly-CSharp.dll&lt;/a&gt; 下载。&lt;/p&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;准备 dnspy 工具，dnspy 是一个反编译工具，可在 &lt;a href=&quot;https://github.com/dnSpy/dnSpy&quot;&gt;GitHub&lt;/a&gt; 上下载。&lt;/p&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;code&gt;FnDrawMosaic&lt;/code&gt; 的第一行添加 &lt;code&gt;return false;&lt;/code&gt;，让它画不了马赛克。&lt;/p&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;打开 dnspy 工具。点击 “文件” -&amp;gt; “打开”，选择 &lt;code&gt;{AIC安装目录}/AliceInCradle_Data/Managed/Assembly-CSharp.dll&lt;/code&gt; 文件。&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://k-pan.r2.buasis.eu.org/blog/post/note/%E4%BE%BF%E7%AC%BA-Alice-in-Cradle-%E7%88%B1%E4%B8%BD%E4%B8%9D%E7%9A%84%E6%91%87%E7%AF%AE%E6%9B%B2-%E5%8F%8D%E7%BC%96%E8%AF%91%E5%8E%BB%E7%A0%81/dnSpy_IvvPxL5GwN.png&quot; alt=&quot;dnSpy_IvvPxL5GwN.png&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1539&quot; /&gt;&lt;figcaption&gt;dnSpy_IvvPxL5GwN.png&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;打开搜索程序集，搜索 &lt;code&gt;FnDrawMosaic&lt;/code&gt;，并双击搜索结果转到引用位置。&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://k-pan.r2.buasis.eu.org/blog/post/note/%E4%BE%BF%E7%AC%BA-Alice-in-Cradle-%E7%88%B1%E4%B8%BD%E4%B8%9D%E7%9A%84%E6%91%87%E7%AF%AE%E6%9B%B2-%E5%8F%8D%E7%BC%96%E8%AF%91%E5%8E%BB%E7%A0%81/dnSpy_y8MtieqndF.png&quot; alt=&quot;dnSpy_y8MtieqndF.png&quot; loading=&quot;lazy&quot; width=&quot;1618&quot; height=&quot;845&quot; /&gt;&lt;figcaption&gt;dnSpy_y8MtieqndF.png&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://k-pan.r2.buasis.eu.org/blog/post/note/%E4%BE%BF%E7%AC%BA-Alice-in-Cradle-%E7%88%B1%E4%B8%BD%E4%B8%9D%E7%9A%84%E6%91%87%E7%AF%AE%E6%9B%B2-%E5%8F%8D%E7%BC%96%E8%AF%91%E5%8E%BB%E7%A0%81/dnSpy_IVLRG3EFBA.png&quot; alt=&quot;dnSpy_IVLRG3EFBA.png&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1539&quot; /&gt;&lt;figcaption&gt;dnSpy_IVLRG3EFBA.png&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;右键黄色的 &lt;code&gt;FnDrawMosaic&lt;/code&gt; 方法，点击右键菜单的 “编辑方法”。&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://k-pan.r2.buasis.eu.org/blog/post/note/%E4%BE%BF%E7%AC%BA-Alice-in-Cradle-%E7%88%B1%E4%B8%BD%E4%B8%9D%E7%9A%84%E6%91%87%E7%AF%AE%E6%9B%B2-%E5%8F%8D%E7%BC%96%E8%AF%91%E5%8E%BB%E7%A0%81/N9ZliSNGpI.png&quot; alt=&quot;N9ZliSNGpI.png&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1600&quot; /&gt;&lt;figcaption&gt;N9ZliSNGpI.png&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;添加一行 &lt;code&gt;return false;&lt;/code&gt; 在 &lt;code&gt;FnDrawMosaic&lt;/code&gt; 方法的开头，并点击编译按钮。&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://k-pan.r2.buasis.eu.org/blog/post/note/%E4%BE%BF%E7%AC%BA-Alice-in-Cradle-%E7%88%B1%E4%B8%BD%E4%B8%9D%E7%9A%84%E6%91%87%E7%AF%AE%E6%9B%B2-%E5%8F%8D%E7%BC%96%E8%AF%91%E5%8E%BB%E7%A0%81/dnSpy_WVjfTlPP7o.png&quot; alt=&quot;dnSpy_WVjfTlPP7o.png&quot; loading=&quot;lazy&quot; width=&quot;1950&quot; height=&quot;1095&quot; /&gt;&lt;figcaption&gt;dnSpy_WVjfTlPP7o.png&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;点击左上方的 “文件” -&amp;gt; “保存模块”。在新窗口点击 “保存” 按钮。这时导出的 &lt;code&gt;Assembly-CSharp.dll&lt;/code&gt; 文件就是反编译后的文件。把它覆盖掉 &lt;code&gt;{AIC安装目录}/AliceInCradle_Data/Managed/Assembly-CSharp.dll&lt;/code&gt; 文件，即可完成反编译去码。&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://k-pan.r2.buasis.eu.org/blog/post/note/%E4%BE%BF%E7%AC%BA-Alice-in-Cradle-%E7%88%B1%E4%B8%BD%E4%B8%9D%E7%9A%84%E6%91%87%E7%AF%AE%E6%9B%B2-%E5%8F%8D%E7%BC%96%E8%AF%91%E5%8E%BB%E7%A0%81/dnSpy_QucbY3He39.png&quot; alt=&quot;dnSpy_QucbY3He39.png&quot; loading=&quot;lazy&quot; width=&quot;1239&quot; height=&quot;682&quot; /&gt;&lt;figcaption&gt;dnSpy_QucbY3He39.png&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&quot;https://k-pan.r2.buasis.eu.org/blog/post/note/%E4%BE%BF%E7%AC%BA-Alice-in-Cradle-%E7%88%B1%E4%B8%BD%E4%B8%9D%E7%9A%84%E6%91%87%E7%AF%AE%E6%9B%B2-%E5%8F%8D%E7%BC%96%E8%AF%91%E5%8E%BB%E7%A0%81/dnSpy_IKtcPDGWqh.png&quot; alt=&quot;dnSpy_IKtcPDGWqh.png&quot; loading=&quot;lazy&quot; width=&quot;1115&quot; height=&quot;687&quot; /&gt;&lt;figcaption&gt;dnSpy_IKtcPDGWqh.png&lt;/figcaption&gt;&lt;/figure&gt;</content:encoded><category>category:便笺</category></item><item><title>碎碎念: 26-08-29</title><link>https://blog.ksable.top/post/ssn/%E7%A2%8E%E7%A2%8E%E5%BF%B5-26-08-29</link><guid isPermaLink="false">ssn/碎碎念-26-08-29</guid><description>

云南晚上是有蚊子的。


云南本地话听不懂，一群人在宿舍里嘀嘀咕咕的，一句也听不懂。


云南的天气有毒。



没出太阳时冷死了，早上和晚上也很冷。
这里太阳很毒，紫外线超强，容易晒伤皮肤。
偶尔阴雨连绵，还是喜欢广东的天气。
</description><pubDate>Sat, 29 Aug 2026 07:19:00 GMT</pubDate><content:encoded>&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;云南晚上是有蚊子的。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;云南本地话听不懂，一群人在宿舍里嘀嘀咕咕的，一句也听不懂。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;云南的天气有毒。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;没出太阳时冷死了，早上和晚上也很冷。&lt;/li&gt;
&lt;li&gt;这里太阳很毒，紫外线超强，容易晒伤皮肤。&lt;/li&gt;
&lt;li&gt;偶尔阴雨连绵，还是喜欢广东的天气。&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>category:碎碎念</category><category>tag:S-5</category></item><item><title>碎碎念: 26-08-28</title><link>https://blog.ksable.top/post/ssn/%E7%A2%8E%E7%A2%8E%E5%BF%B5-26-08-28</link><guid isPermaLink="false">ssn/碎碎念-26-08-28</guid><description>我将记住 “2026年 8月 28日”。</description><pubDate>Fri, 28 Aug 2026 15:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我将记住 “2026年 8月 28日”。&lt;/p&gt;</content:encoded><category>category:碎碎念</category><category>tag:S-4</category></item><item><title>便笺: Fun-ASR 本地部署与批量推理</title><link>https://blog.ksable.top/post/note/%E4%BE%BF%E7%AC%BA-fun-asr-%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2%E4%B8%8E%E6%89%B9%E9%87%8F%E6%8E%A8%E7%90%86</link><guid isPermaLink="false">note/便笺-fun-asr-本地部署与批量推理</guid><description>提供 Fun-ASR-Nano-2512-GGUF 本地部署与批量推理教程，涵盖 Conda 环境搭建、依赖安装及 Python 批量转录脚本。实现离线、高速的多格式音频（MP3/WAV/M4A）转文字并生成 SRT 字幕，是替代云端 API 的最佳免费方案。</description><pubDate>Mon, 10 Aug 2026 12:12:02 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;a href=&quot;#前言&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;提供 Fun-ASR-Nano-2512-GGUF 本地部署与批量推理教程，涵盖 Conda 环境搭建、依赖安装及 Python 批量转录脚本。实现离线、高速的多格式音频（MP3/WAV/M4A）转文字并生成 SRT 字幕，是替代云端 API 的最佳免费方案。&lt;/p&gt;
&lt;p&gt;本文使用的是 &lt;a href=&quot;https://www.modelscope.cn/models/HaujetZhao/Fun-ASR-Nano-2512-GGUF&quot;&gt;HaujetZhao/Fun-ASR-Nano-2512-GGUF&lt;/a&gt; 模型。原因，最简单，最快速。&lt;/p&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;a href=&quot;https://www.modelscope.cn/models/HaujetZhao/Fun-ASR-Nano-2512-GGUF&quot;&gt;HaujetZhao/Fun-ASR-Nano-2512-GGUF&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;modelscope&lt;/span&gt;&lt;span&gt; download&lt;/span&gt;&lt;span&gt; --model&lt;/span&gt;&lt;span&gt; HaujetZhao/Fun-ASR-Nano-2512-GGUF&lt;/span&gt;&lt;span&gt; --local_dir&lt;/span&gt;&lt;span&gt; ./Fun-ASR-Nano-2512-GGUF&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; ./Fun-ASR-Nano-2512-GGUF&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;创建虚拟环境&lt;a href=&quot;#创建虚拟环境&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;conda 环境&lt;a href=&quot;#conda-环境&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;conda&lt;/span&gt;&lt;span&gt; create&lt;/span&gt;&lt;span&gt; -n&lt;/span&gt;&lt;span&gt; fun-asr-gguf&lt;/span&gt;&lt;span&gt; python=&lt;/span&gt;&lt;span&gt;3.12&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;conda&lt;/span&gt;&lt;span&gt; activate&lt;/span&gt;&lt;span&gt; fun-asr-gguf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;venv 环境&lt;a href=&quot;#venv-环境&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;python&lt;/span&gt;&lt;span&gt; -m&lt;/span&gt;&lt;span&gt; venv&lt;/span&gt;&lt;span&gt; fun-asr-gguf&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;source&lt;/span&gt;&lt;span&gt; fun-asr-gguf/bin/activate&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&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;code&gt;requirements.txt&lt;/code&gt; 中的 模型导出依赖，因为我们只需要运行模型，不需要导出模型。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;pip&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; -r&lt;/span&gt;&lt;span&gt; requirements.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;网络差时，可以使用镜像源安装依赖&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;pip&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; -r&lt;/span&gt;&lt;span&gt; requirements.txt&lt;/span&gt;&lt;span&gt; -i&lt;/span&gt;&lt;span&gt; https://pypi.tuna.tsinghua.edu.cn/simple&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;运行 推理脚本&lt;a href=&quot;#运行-推理脚本&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;python&lt;/span&gt;&lt;span&gt; 03-Inference.py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;进阶版，批量推理&lt;a href=&quot;#进阶版批量推理&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;&quot;&quot;&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;使用方式：&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    python batch_asr.py&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;&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&quot;&quot;&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;1. 仅支持单线程批量处理，无法多文件并发处理。强行使用多线程会在第二步报错  ✗ 初始化失败: [ONNXRuntimeError] : 3 : NO_SUCHFILE : Load model from ./model/Fun-ASR-Nano-Encoder-Adaptor.fp32.onnx failed:Load model ./model/Fun-ASR-Nano-Encoder-Adaptor.fp32.onnx failed. File doesn&apos;t exist.&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;2. 难处理 AI “复读机” 现象。语音识别由 fun_asr_gguf 处理，较长的音频将会分批处理后合并返回结果。该脚本只能获取合并后的结果，较难检测 “重复文本”。也不能重试某个音频片段（只能整个重试）。未来想要处理 AI “复读机”，只能在 fun_asr_gguf 中添加相关逻辑。&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; os&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; sys&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; time&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; dataclasses&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; fun_asr_gguf &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; create_asr_engine&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# ==================== Vulkan 选项 ====================&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# os.environ[&quot;VK_ICD_FILENAMES&quot;] = &quot;none&quot;       # 禁止 Vulkan&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# os.environ[&quot;GGML_VK_VISIBLE_DEVICES&quot;] = &quot;0&quot;   # 禁止 Vulkan 用独显（强制用集显）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# os.environ[&quot;GGML_VK_DISABLE_F16&quot;] = &quot;1&quot;       # 禁止 VulkanFP16 计算（Intel集显fp16有溢出问题）&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;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;input_dir &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &quot;./input&quot;&lt;/span&gt;&lt;span&gt;               # 音频文件输入文件夹&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;output_dir &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &quot;./output&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;
&lt;span&gt;&lt;span&gt;audio_extensions &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;.mp3&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;.wav&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;.m4a&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;.flac&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;.ogg&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;.aac&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;.wma&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;.opus&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;.webm&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;# ==================== 模型路径配置 ====================&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;model_dir &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &quot;./model&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;encoder_onnx_path &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; f&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;model_dir&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/Fun-ASR-Nano-Encoder-Adaptor.fp32.onnx&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;ctc_onnx_path &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; f&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;model_dir&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/Fun-ASR-Nano-CTC.int8.onnx&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;decoder_gguf_path &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; f&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;model_dir&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/Fun-ASR-Nano-Decoder.q8_0.gguf&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;tokens_path &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; f&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;model_dir&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/tokens.txt&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;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;hotwords_path &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &quot;&quot;&lt;/span&gt;&lt;span&gt;         # 热词文件路径，留空字符串 &quot;&quot; 则不使用&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;similar_threshold &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 0.6&lt;/span&gt;&lt;span&gt;             # 热词模糊匹配阈值&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;max_hotwords &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 10&lt;/span&gt;&lt;span&gt;                   # 最多提供给 LLM 的热词数量&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;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;language &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; None&lt;/span&gt;&lt;span&gt;                     # 语言 (None=自动检测, &quot;中文&quot;, &quot;英文&quot;, &quot;日文&quot; 等)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;context &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;
&lt;span&gt;&lt;span&gt;enable_ctc &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; True&lt;/span&gt;&lt;span&gt;                   # 是否启用 CTC 辅助（提供时间戳和热词）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;segment_size &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 60.0&lt;/span&gt;&lt;span&gt;                 # 长音频分段大小（秒）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;overlap &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 4.0&lt;/span&gt;&lt;span&gt;                       # 分段之间的重叠（秒）&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;start_second &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 0.0&lt;/span&gt;&lt;span&gt;                  # 开始时间（秒），None 表示从头开始&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;duration &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; None&lt;/span&gt;&lt;span&gt;                     # 转录时长（秒），None 表示到音频结尾&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;srt &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; True&lt;/span&gt;&lt;span&gt;                          # 是否同时生成 SRT 字幕文件&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;verbose &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; True&lt;/span&gt;&lt;span&gt;                      # 是否打印详细信息&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;json_output &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; False&lt;/span&gt;&lt;span&gt;                 # 是否同时输出 JSON 格式结果&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;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Fun-ASR-Nano-2512&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;Fun-ASR-MLT-Nano-2512&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;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;&quot;&quot;&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;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; collect_audio_files&lt;/span&gt;&lt;span&gt;(root_dir, extensions):&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;&quot;&quot;递归收集指定目录下所有匹配扩展名的音频文件&quot;&quot;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    files &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; []&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; not&lt;/span&gt;&lt;span&gt; os.path.isdir(root_dir):&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;[错误] 输入目录不存在: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;root_dir&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        return&lt;/span&gt;&lt;span&gt; files&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    for&lt;/span&gt;&lt;span&gt; dirpath, _, filenames &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; os.walk(root_dir):&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        for&lt;/span&gt;&lt;span&gt; fname &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; filenames:&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.splitext(fname)[&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;].lower()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            if&lt;/span&gt;&lt;span&gt; ext &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; extensions:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                files.append(os.path.join(dirpath, fname))&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    return&lt;/span&gt;&lt;span&gt; sorted&lt;/span&gt;&lt;span&gt;(files)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; ensure_output_path&lt;/span&gt;&lt;span&gt;(input_audio_path, input_root, output_root):&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;&quot;&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;    例如: input_root=./input, output_root=./output&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          input_audio_path=./input/meeting/rec1.mp3&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          -&amp;gt; ./output/meeting/rec1.txt&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;&quot;&quot;&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; os.path.relpath(input_audio_path, input_root)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    name_without_ext &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; os.path.splitext(rel)[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    output_path &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; os.path.join(output_root, name_without_ext &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &quot;.txt&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    os.makedirs(os.path.dirname(output_path), &lt;/span&gt;&lt;span&gt;exist_ok&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;True&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    return&lt;/span&gt;&lt;span&gt; output_path&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;():&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    print&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; 70&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    print&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;
&lt;span&gt;&lt;span&gt;    print&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; 70&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;span&gt;&lt;span&gt;    audio_files &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; collect_audio_files(input_dir, audio_extensions)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; not&lt;/span&gt;&lt;span&gt; audio_files:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;[提示] 在 &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;input_dir&lt;/span&gt;&lt;span&gt;!r&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; 中没有找到匹配的音频文件。&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;  支持的格式: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;audio_extensions&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        return&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;共找到 &lt;/span&gt;&lt;span&gt;{len&lt;/span&gt;&lt;span&gt;(audio_files)&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&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;    # ---------- 处理 hotwords_path ----------&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    hw_path &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; hotwords_path &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; hotwords_path.strip() &lt;/span&gt;&lt;span&gt;else&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;    # ---------- 创建 ASR 引擎 ----------&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;初始化 ASR 引擎...&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    engine &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; create_asr_engine(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        encoder_onnx_path&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;encoder_onnx_path,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        ctc_onnx_path&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;ctc_onnx_path,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        decoder_gguf_path&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;decoder_gguf_path,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        tokens_path&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;tokens_path,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        hotwords_path&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;hw_path,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        similar_threshold&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;similar_threshold,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        max_hotwords&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;max_hotwords,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        enable_ctc&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;enable_ctc,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        verbose&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;verbose,&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;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;预跑一遍，分配内存...&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    engine.transcribe(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        audio_files[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        language&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;language,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        context&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;context,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        verbose&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;False&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        duration&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;10.0&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;span&gt;&lt;span&gt;    # ---------- 批量识别 ----------&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    total &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; len&lt;/span&gt;&lt;span&gt;(audio_files)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    success_count &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;    fail_list &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;    for&lt;/span&gt;&lt;span&gt; idx, audio_path &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; enumerate&lt;/span&gt;&lt;span&gt;(audio_files, &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\n{&lt;/span&gt;&lt;span&gt;&apos;=&apos;&lt;/span&gt;&lt;span&gt; *&lt;/span&gt;&lt;span&gt; 70}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;[&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;/&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;total&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;] 处理: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;audio_path&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&apos;=&apos;&lt;/span&gt;&lt;span&gt; *&lt;/span&gt;&lt;span&gt; 70}&lt;/span&gt;&lt;span&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;        output_txt &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; ensure_output_path(audio_path, input_dir, output_dir)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        try&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            result &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; engine.transcribe(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                audio_path,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                language&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;language,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                context&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;context,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                verbose&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;verbose,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                segment_size&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;segment_size,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                overlap&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;overlap,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                start_second&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;start_second,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                duration&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;duration,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                srt&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;srt,&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;            # 写入 txt 文件&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            with&lt;/span&gt;&lt;span&gt; open&lt;/span&gt;&lt;span&gt;(output_txt, &lt;/span&gt;&lt;span&gt;&quot;w&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;encoding&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;utf-8&quot;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; f:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                f.write(result.text)&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;            if&lt;/span&gt;&lt;span&gt; json_output:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                import&lt;/span&gt;&lt;span&gt; json&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                json_path &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; os.path.splitext(output_txt)[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;] &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;                with&lt;/span&gt;&lt;span&gt; open&lt;/span&gt;&lt;span&gt;(json_path, &lt;/span&gt;&lt;span&gt;&quot;w&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;encoding&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;utf-8&quot;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; f:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                    json.dump(dataclasses.asdict(result), f, &lt;/span&gt;&lt;span&gt;ensure_ascii&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;False&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;indent&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            # 如果开启了 srt 且未在同目录生成，将 srt 文件移到输出目录&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            if&lt;/span&gt;&lt;span&gt; srt:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                src_srt &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; os.path.splitext(audio_path)[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &quot;.srt&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                dst_srt &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; os.path.splitext(output_txt)[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &quot;.srt&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                if&lt;/span&gt;&lt;span&gt; os.path.isfile(src_srt) &lt;/span&gt;&lt;span&gt;and&lt;/span&gt;&lt;span&gt; os.path.abspath(src_srt) &lt;/span&gt;&lt;span&gt;!=&lt;/span&gt;&lt;span&gt; os.path.abspath(dst_srt):&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                    try&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                        os.replace(src_srt, dst_srt)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                    except&lt;/span&gt;&lt;span&gt; OSError&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                        pass&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            success_count &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;            print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;  -&amp;gt; 输出: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;output_txt&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&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;        except&lt;/span&gt;&lt;span&gt; Exception&lt;/span&gt;&lt;span&gt; as&lt;/span&gt;&lt;span&gt; e:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            fail_list.append((audio_path, &lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;(e)))&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;  [失败] &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&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;
&lt;span&gt;&lt;span&gt;    print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\n{&lt;/span&gt;&lt;span&gt;&apos;=&apos;&lt;/span&gt;&lt;span&gt; *&lt;/span&gt;&lt;span&gt; 70}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;批量处理完成&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&apos;=&apos;&lt;/span&gt;&lt;span&gt; *&lt;/span&gt;&lt;span&gt; 70}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;  总计: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;total&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;  成功: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;success_count&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;  失败: &lt;/span&gt;&lt;span&gt;{len&lt;/span&gt;&lt;span&gt;(fail_list)&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; fail_list:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;失败列表:&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        for&lt;/span&gt;&lt;span&gt; path, err &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; fail_list:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;  - &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;    错误: &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;err&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&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;
&lt;span&gt;&lt;span&gt;    engine.cleanup()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    return&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt; if&lt;/span&gt;&lt;span&gt; not&lt;/span&gt;&lt;span&gt; fail_list &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; __name__&lt;/span&gt;&lt;span&gt; ==&lt;/span&gt;&lt;span&gt; &quot;__main__&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    exit&lt;/span&gt;&lt;span&gt;(main())&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content:encoded><category>category:便笺</category></item><item><title>碎碎念: 26-07-21</title><link>https://blog.ksable.top/post/ssn/%E7%A2%8E%E7%A2%8E%E5%BF%B5-26-07-21</link><guid isPermaLink="false">ssn/碎碎念-26-07-21</guid><description>嗷嗷，终于过科目一了
考了两次才过 
我觉得考科目一主要是看运气，当然 要是把所有题目都做背下了运气好与坏也影响不了最后的结果了。

第一次考前，在 ”驾校一点通“ 上模拟考的都是九十几，听网上说 考试 的题都比 模拟 考简单多。
所以呢，就去考了。
但谁知，咋 考试 的题都比 模拟考</description><pubDate>Tue, 21 Jul 2026 15:33:39 GMT</pubDate><content:encoded>&lt;p&gt;嗷嗷，终于过科目一了&lt;/p&gt;
&lt;p&gt;考了两次才过 &lt;/p&gt;
&lt;p&gt;我觉得考科目一主要是看运气，当然 要是把所有题目都做背下了运气好与坏也影响不了最后的结果了。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;第一次考前，在 ”驾校一点通“ 上模拟考的都是九十几，听网上说 考试 的题都比 模拟 考简单多。&lt;/p&gt;
&lt;p&gt;所以呢，就去考了。&lt;/p&gt;
&lt;p&gt;但谁知，咋 考试 的题都比 模拟考 难多了，都不是一个层次的。&lt;/p&gt;
&lt;p&gt;给我出了一大堆 记分、罚款 的难题，哭死我。(大概有三十多道，补考也是那么多)&lt;/p&gt;
&lt;p&gt;还因为平时刷题刷傻了， 模拟 考时，那题 来来回回 就那几道，容易把答案背下来，但知识点却没背。就是刷多了，读了一半的题目内容，手自动点到正确的选项了。&lt;/p&gt;
&lt;p&gt;回家后，被我爸给骂死了。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;第二次考前，我就不刷题了，死记 《道路交通安全违法行为记分管理办法》 以及各种处罚 等。&lt;/p&gt;
&lt;p&gt;感觉我快把那《记分管理办法》 背下来了。~ ~ ~&lt;/p&gt;
&lt;p&gt;然后就去考了。考时特别紧张，感觉特别冷。&lt;/p&gt;
&lt;p&gt;万幸，我考过了，99分。&lt;/p&gt;
&lt;p&gt;~~但我好想骂人，为啥这次出的题那么简单。我死记的记分、罚款题，它才出了不到6道。啊啊啊啊啊 ~ ~ ~~&lt;/p&gt;</content:encoded><category>category:碎碎念</category><category>tag:S-4</category></item><item><title>便笺: 科目一 · 道路交通安全违法记分笔记</title><link>https://blog.ksable.top/post/note/%E4%BE%BF%E7%AC%BA-%E7%A7%91%E7%9B%AE%E4%B8%80-%E9%81%93%E8%B7%AF%E4%BA%A4%E9%80%9A%E5%AE%89%E5%85%A8%E8%BF%9D%E6%B3%95%E8%AE%B0%E5%88%86%E7%AC%94%E8%AE%B0</link><guid isPermaLink="false">note/便笺-科目一-道路交通安全违法记分笔记</guid><description>
本文基于 公安部第163号令《道路交通安全违法行为记分管理办法》（2022年4月1日起施行） 进行整理。不能保证所有内容的准确性。若有错误，请以官方法规为准。


 依据：公安部第163号令《道路交通安全违法行为记分管理办法》（2022年4月1日起施行）
 分值：12分 / 9分 / 6分 /</description><pubDate>Sun, 19 Jul 2026 18:05:30 GMT</pubDate><content:encoded>&lt;div&gt;
&lt;p&gt;本文基于 &lt;a href=&quot;https://www.gov.cn/gongbao/content/2022/content_5679697.htm&quot;&gt;公安部第163号令《道路交通安全违法行为记分管理办法》（2022年4月1日起施行）&lt;/a&gt; 进行整理。不能保证所有内容的准确性。若有错误，请以&lt;a href=&quot;https://www.gov.cn/gongbao/content/2022/content_5679697.htm&quot;&gt;官方法规&lt;/a&gt;为准。&lt;/p&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt; 依据：&lt;a href=&quot;https://www.gov.cn/gongbao/content/2022/content_5679697.htm&quot;&gt;公安部第163号令《道路交通安全违法行为记分管理办法》（2022年4月1日起施行）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; 分值：12分 / 9分 / 6分 / 3分 / 1分&lt;/p&gt;
&lt;p&gt; 记分周期：12个月，满分12分&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt; 记分分值总览&lt;a href=&quot;#-记分分值总览&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&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;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;12分&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;7条&lt;/td&gt;&lt;td&gt; 最严重&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;9分&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;7条&lt;/td&gt;&lt;td&gt; 严重&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;6分&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;11条&lt;/td&gt;&lt;td&gt; 较重&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;3分&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;15条&lt;/td&gt;&lt;td&gt; 一般&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;1分&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;10条&lt;/td&gt;&lt;td&gt;⚪ 较轻&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt; 一次记 12 分（共 7 条）&lt;a href=&quot;#-一次记-12-分共-7-条&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;口诀：酒、逃、替、伪造、逆&lt;/p&gt;
&lt;/blockquote&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;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;strong&gt;饮酒后&lt;/strong&gt;驾驶机动车&lt;/td&gt;&lt;td&gt; 酒驾必12分&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;造成&lt;strong&gt;致人轻伤以上或死亡&lt;/strong&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;3&lt;/td&gt;&lt;td&gt;&lt;strong&gt;使用伪造、变造&lt;/strong&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;4&lt;/td&gt;&lt;td&gt;&lt;strong&gt;校车/公路客运/旅游客运&lt;/strong&gt;载人超&lt;strong&gt;20%以上&lt;/strong&gt;，或&lt;strong&gt;其他载客汽车&lt;/strong&gt;超&lt;strong&gt;100%以上&lt;/strong&gt;&lt;/td&gt;&lt;td&gt; 严重超载&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;strong&gt;校车/中型以上客货车/危险品车&lt;/strong&gt;在高速/快速路超速&lt;strong&gt;20%以上&lt;/strong&gt;，或&lt;strong&gt;其他机动车&lt;/strong&gt;在高速/快速路超速&lt;strong&gt;50%以上&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;⚡ 高速狂飙&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;在&lt;strong&gt;高速/快速路&lt;/strong&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;7&lt;/td&gt;&lt;td&gt;&lt;strong&gt;代替他人&lt;/strong&gt;接受处罚和记分&lt;strong&gt;牟取经济利益&lt;/strong&gt;（买分卖分）&lt;/td&gt;&lt;td&gt; 卖分牟利&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt; 一次记 9 分（共 7 条）&lt;a href=&quot;#-一次记-9-分共-7-条&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;口诀：高速违停、无牌 / 遮牌、驾驶车型不符、无校车资格、疲劳驾驶 4 小时 +&lt;/p&gt;
&lt;/blockquote&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;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;驾驶&lt;strong&gt;7座以上&lt;/strong&gt;载客汽车超载&lt;strong&gt;50%以上未达100%&lt;/strong&gt;&lt;/td&gt;&lt;td&gt; 7座半超&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;strong&gt;校车/中型以上客货车/危险品车&lt;/strong&gt;在&lt;strong&gt;高速/快速路以外&lt;/strong&gt;道路超速&lt;strong&gt;50%以上&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;️ 普路狂飙&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;在&lt;strong&gt;高速/快速路&lt;/strong&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;4&lt;/td&gt;&lt;td&gt;&lt;strong&gt;未悬挂号牌&lt;/strong&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;5&lt;/td&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;6&lt;/td&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;7&lt;/td&gt;&lt;td&gt;连续驾驶&lt;strong&gt;中型以上载客汽车/危险品车&lt;/strong&gt;超&lt;strong&gt;4小时&lt;/strong&gt;未休息或休息少于&lt;strong&gt;20分钟&lt;/strong&gt;&lt;/td&gt;&lt;td&gt; 客危疲劳&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt; 一次记 6 分（共 11 条）&lt;a href=&quot;#-一次记-6-分共-11-条&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;口诀：危化品违规、闯红灯、暂扣证驾车、轻微伤逃逸&lt;/p&gt;
&lt;/blockquote&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;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;strong&gt;校车/公路客运/旅游客运&lt;/strong&gt;超载&lt;strong&gt;未达20%&lt;/strong&gt;，或&lt;strong&gt;7座以上&lt;/strong&gt;超&lt;strong&gt;20%&lt;sub&gt;50%&lt;/sub&gt;&lt;/strong&gt;，或&lt;strong&gt;其他载客汽车&lt;/strong&gt;超&lt;strong&gt;50%100%&lt;/strong&gt;&lt;/td&gt;&lt;td&gt; 中度过载&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;strong&gt;校车/中型以上客货车/危险品车&lt;/strong&gt;在高速/快速路超速&lt;strong&gt;未达20%&lt;/strong&gt;，或在普通路超速&lt;strong&gt;20%~50%&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;⚡ 中度超速&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;&lt;strong&gt;校车/客货车/危险品车以外&lt;/strong&gt;的机动车在高速/快速路超速&lt;strong&gt;20%~50%&lt;/strong&gt;，或在普通路超速&lt;strong&gt;50%以上&lt;/strong&gt;&lt;/td&gt;&lt;td&gt; 小车超速&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;载货汽车超载&lt;strong&gt;超过最大允许总质量50%以上&lt;/strong&gt;&lt;/td&gt;&lt;td&gt; 严重超货&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;运载&lt;strong&gt;爆炸/易燃易爆/剧毒/放射性&lt;/strong&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;6&lt;/td&gt;&lt;td&gt;运载&lt;strong&gt;超限不可解体&lt;/strong&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;7&lt;/td&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;8&lt;/td&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;9&lt;/td&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;10&lt;/td&gt;&lt;td&gt;造成&lt;strong&gt;致人轻微伤或财产损失&lt;/strong&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;11&lt;/td&gt;&lt;td&gt;在&lt;strong&gt;高速/快速路&lt;/strong&gt;上&lt;strong&gt;违法占用应急车道&lt;/strong&gt;行驶&lt;/td&gt;&lt;td&gt; 占应急道&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt; 一次记 3 分（共 15 条）&lt;a href=&quot;#-一次记-3-分共-15-条&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;口诀：不按车道、逆行、穿插、打电话、不避让行人和校车、号牌安装不当、未系安全带、摩托不戴头盔&lt;/p&gt;
&lt;/blockquote&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;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;strong&gt;校车/客运/7座以上以外&lt;/strong&gt;的载客汽车超载&lt;strong&gt;20%~50%&lt;/strong&gt;&lt;/td&gt;&lt;td&gt; 小车超载&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;strong&gt;校车/客货车/危险品车以外&lt;/strong&gt;的机动车在&lt;strong&gt;普通路&lt;/strong&gt;超速&lt;strong&gt;20%~50%&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;️ 普路超速&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&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;4&lt;/td&gt;&lt;td&gt;&lt;strong&gt;不按规定超车、让行&lt;/strong&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;5&lt;/td&gt;&lt;td&gt;遇前方排队/缓行时&lt;strong&gt;借道超车&lt;/strong&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;6&lt;/td&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;7&lt;/td&gt;&lt;td&gt;行经&lt;strong&gt;人行横道&lt;/strong&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;8&lt;/td&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;9&lt;/td&gt;&lt;td&gt;载货汽车超载&lt;strong&gt;30%~50%&lt;/strong&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;10&lt;/td&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;11&lt;/td&gt;&lt;td&gt;车辆&lt;strong&gt;发生故障/事故停车后&lt;/strong&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;12&lt;/td&gt;&lt;td&gt;驾驶&lt;strong&gt;未定期安检&lt;/strong&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;13&lt;/td&gt;&lt;td&gt;校车上路前&lt;strong&gt;未检查车况&lt;/strong&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;14&lt;/td&gt;&lt;td&gt;连续驾驶&lt;strong&gt;载货汽车&lt;/strong&gt;超&lt;strong&gt;4小时&lt;/strong&gt;未休息或休息少于&lt;strong&gt;20分钟&lt;/strong&gt;&lt;/td&gt;&lt;td&gt; 货车疲劳&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;高速公路上&lt;strong&gt;低于规定最低时速&lt;/strong&gt;行驶&lt;/td&gt;&lt;td&gt; 高速龟速&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;⚪ 一次记 1 分（共 10 条）&lt;a href=&quot;#-一次记-1-分共-10-条&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;口诀：不会车 / 倒车 / 掉头、不按规定用灯光、违反禁行标志、载货超限&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;口诀：看到（检，标，会，安，掉，灯）扣1分&lt;/p&gt;
&lt;/blockquote&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;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;&lt;strong&gt;校车/中型以上客货车/危险品车&lt;/strong&gt;在&lt;strong&gt;普通路&lt;/strong&gt;超速&lt;strong&gt;10%~20%&lt;/strong&gt;&lt;/td&gt;&lt;td&gt; 微超速&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;strong&gt;不按规定会车&lt;/strong&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;3&lt;/td&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;4&lt;/td&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;5&lt;/td&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;6&lt;/td&gt;&lt;td&gt;载货汽车超载&lt;strong&gt;未达30%&lt;/strong&gt;&lt;/td&gt;&lt;td&gt; 微超货&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7&lt;/td&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;8&lt;/td&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;9&lt;/td&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;10&lt;/td&gt;&lt;td&gt;驾驶&lt;strong&gt;摩托车不戴安全头盔&lt;/strong&gt;&lt;/td&gt;&lt;td&gt; 不戴头盔&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt; 高频考点速记&lt;a href=&quot;#-高频考点速记&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&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;p&gt;超载（货车超载）的记分标准，高速与普通道路完全一样，不做区分。&lt;/p&gt;
&lt;/div&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;超载≥50%&lt;/td&gt;&lt;td&gt;记 6 分&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;30%≤超载＜50%&lt;/td&gt;&lt;td&gt;记 3 分&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;超载＜30%&lt;/td&gt;&lt;td&gt;记 1 分&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&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;p&gt;超员（载客汽车）的记分标准，高速与普通道路完全一样，不做区分。&lt;/p&gt;
&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;校车/公路客运/旅游客运：&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  超 20%以上          → 12分&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  未达 20%            → 6分&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;7座以上载客汽车：&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  超 100%以上          → 12分&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  超 50%~100%         → 9分&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  超 20%~50%          → 6分&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;span&gt;&lt;span&gt;  超 100%以上          → 12分&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  超 50%~100%         → 6分&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  超 20%~50%          → 3分&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt; 超速记忆链条&lt;a href=&quot;#-超速记忆链条&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;校车/中型以上客货车/危险品车：&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  高速/快速路 超20%以上     → 12分&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  高速/快速路 未达20%        → 6分&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  普通路     超50%以上       → 9分&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  普通路     20%~50%         → 6分&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  普通路     10%~20%         → 1分&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;span&gt;&lt;span&gt;  高速/快速路 超50%以上      → 12分&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  高速/快速路 20%~50%       → 6分&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  普通路     超50%以上       → 6分&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  普通路     20%~50%        → 3分&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&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;/td&gt;&lt;td&gt;&lt;strong&gt;12分&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;违法停车&lt;/td&gt;&lt;td&gt;&lt;strong&gt;9分&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;违法占用应急车道&lt;/td&gt;&lt;td&gt;&lt;strong&gt;6分&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;不按规定车道行驶&lt;/td&gt;&lt;td&gt;&lt;strong&gt;3分&lt;/strong&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;strong&gt;3分&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&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;strong&gt;轻伤以上或死亡&lt;/strong&gt; → 逃逸&lt;/td&gt;&lt;td&gt;&lt;strong&gt;12分&lt;/strong&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;strong&gt;6分&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&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;/td&gt;&lt;td&gt;&lt;strong&gt;12分&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;未悬挂 / 故意遮挡污损&lt;/td&gt;&lt;td&gt;&lt;strong&gt;9分&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;不按规定安装&lt;/td&gt;&lt;td&gt;&lt;strong&gt;3分&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&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;th&gt;分值&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;中型以上载客汽车 / 危险品运输车&lt;/td&gt;&lt;td&gt;连续超4小时+休息不足20分钟&lt;/td&gt;&lt;td&gt;&lt;strong&gt;9分&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;载货汽车&lt;/td&gt;&lt;td&gt;连续超4小时+休息不足20分钟&lt;/td&gt;&lt;td&gt;&lt;strong&gt;3分&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&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;/td&gt;&lt;td&gt;&lt;strong&gt;3分&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;以上以外（普通机动车）&lt;/td&gt;&lt;td&gt;&lt;strong&gt;1分&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt; 加分项：学法减分&lt;a href=&quot;#-加分项学法减分&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;处理完违章后累积记分&lt;strong&gt;未满12分&lt;/strong&gt;，可通过学法减分！&lt;/p&gt;
&lt;/blockquote&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;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;网上学习&lt;/td&gt;&lt;td&gt;3日内累计满30分钟 + 考试合格&lt;/td&gt;&lt;td&gt;&lt;strong&gt;减1分&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;现场学习&lt;/td&gt;&lt;td&gt;满1小时 + 考试合格&lt;/td&gt;&lt;td&gt;&lt;strong&gt;减2分&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;公益活动&lt;/td&gt;&lt;td&gt;满1小时&lt;/td&gt;&lt;td&gt;&lt;strong&gt;减1分&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ 一个记分周期内&lt;strong&gt;最多减6分&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;有以下情形之一的，不予受理：&lt;a href=&quot;#有以下情形之一的不予受理&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;在本记分周期内或者上一个记分周期内，机动车驾驶人有二次以上参加满分教育记录的。&lt;/li&gt;
&lt;li&gt;在最近三个记分周期内，机动车驾驶人因造成交通事故后逃逸&lt;/li&gt;
&lt;li&gt;饮酒后驾驶机动车，或者使用伪造、变造的机动车号牌、行驶证、驾驶证、校车标牌&lt;/li&gt;
&lt;li&gt;使用其他机动车号牌、行驶证，或者买分卖分受到过处罚的&lt;/li&gt;
&lt;li&gt;在实习期内，或者机动车驾驶证逾期未审验，或者机动车驾驶证被扣留、暂扣期间的&lt;/li&gt;
&lt;li&gt;机动车驾驶人名下有安全技术检验超过有效期或者未按规定办理注销登记的机动车的；&lt;/li&gt;
&lt;li&gt;在最近三个记分周期内，机动车驾驶人参加接受交通安全教育扣减交通违法行为记分或者机动车驾驶人满分教育、审验教育时，有弄虚作假、冒名顶替记录的&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;常考: 二次以上参加满分教育记录、实习期、饮酒后的三个记分周期&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;⚖️ 法律责任（新增）&lt;a href=&quot;#️-法律责任新增&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;依据：《道路交通安全违法行为记分管理办法》第六章（第29~33条）&lt;/p&gt;
&lt;/blockquote&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;记满12分，驾驶证被扣留或收到满分教育通知后&lt;strong&gt;30日内拒不参加&lt;/strong&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;strong&gt;请他人代罚代记分&lt;/strong&gt;并支付经济利益&lt;/td&gt;&lt;td&gt;处支付经济利益&lt;strong&gt;三倍以下&lt;/strong&gt;罚款（最高≤5万元）；&lt;strong&gt;原违法行为仍依法处罚&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;代替他人&lt;/strong&gt;接受处罚和记分&lt;strong&gt;牟取经济利益&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;处违法所得&lt;strong&gt;三倍以下&lt;/strong&gt;罚款（最高≤5万元）；&lt;strong&gt;撤销原行政处罚决定&lt;/strong&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;strong&gt;五倍以下&lt;/strong&gt;罚款（最高≤10万元）；构成治安违法的，依法治安处罚&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&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;strong&gt;签注记录、考试中弄虚作假&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;相应记录/成绩无效，处&lt;strong&gt;1000元以下&lt;/strong&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;strong&gt;1000元以下&lt;/strong&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;strong&gt;2000元以下&lt;/strong&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;strong&gt;三倍以下&lt;/strong&gt;罚款（最高≤2万元）；无违法所得的，处&lt;strong&gt;2万元以下&lt;/strong&gt;罚款&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;对交通警察/辅警的处分（了解即可）&lt;a href=&quot;#对交通警察辅警的处分了解即可&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;拒不核实异议、考试舞弊、串通代罚、篡改数据、未严格审核导致代罚等情形，给予处分、解聘或追究刑事责任。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt; 考试高频点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;记满12分&lt;strong&gt;30日内&lt;/strong&gt;不参加学习 → &lt;strong&gt;驾驶证停止使用&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;请人代罚 → &lt;strong&gt;三倍罚款（≤5万）&lt;/strong&gt;；代人受罚牟利 → &lt;strong&gt;三倍罚款（≤5万）+撤销处罚&lt;/strong&gt;；组织者 → &lt;strong&gt;五倍罚款（≤10万）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;学法减分弄虚作假 → &lt;strong&gt;撤销减分 + 恢复记分 + 1000元以下罚款&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;代替他人参加满分教育/学法减分 → &lt;strong&gt;2000元以下罚款&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr /&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;修正：速记 → 7座以上载客汽车 → 超载 100%以上 → 12分&lt;/li&gt;
&lt;li&gt;修正：速记 → 「高速/快速路」专属扣分 → 低于最低时速(&lt;strong&gt;不包括快速路&lt;/strong&gt;) → 3分&lt;/li&gt;
&lt;li&gt;修正：笔记 6 分第 9 条的记忆口诀写为「无证驾驶」，但该条款的准确含义是驾驶证被暂扣 / 扣留期间驾驶机动车。现在修正为「被扣仍驾」&lt;/li&gt;
&lt;li&gt;修正：超载与超员的知识混淆，现在明确区分。并补上遗漏的超载记忆链条。&lt;/li&gt;
&lt;li&gt;补充：学法减分的条件。&lt;/li&gt;
&lt;li&gt;补充：学法减分的条件。&lt;/li&gt;
&lt;li&gt;补充：法律责任章节（2026-07-20）&lt;/li&gt;
&lt;li&gt;修改：把扣分关键词 改为 口诀 (2026-07-21 09:48&lt;div&gt;&lt;/div&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;p&gt;保我过科目一吧 &lt;/p&gt;
&lt;/div&gt;</content:encoded><category>category:便笺</category></item><item><title>🔒 碎碎念-26-07-10 恶梦</title><link>https://blog.ksable.top/post/ssn/%E7%A2%8E%E7%A2%8E%E5%BF%B5-26-07-10-%E6%81%B6%E6%A2%A6</link><guid isPermaLink="false">ssn/碎碎念-26-07-10-恶梦</guid><description>此文章已加密，请在网页中查看</description><pubDate>Fri, 10 Jul 2026 05:16:34 GMT</pubDate><content:encoded>&lt;p&gt;此文章已加密，请在网页中查看&lt;/p&gt;</content:encoded><category>category:碎碎念</category><category>tag:S-2</category></item><item><title>Posts: Wallpaper Engine 壁纸推荐 - 二次元随机壁纸</title><link>https://blog.ksable.top/post/post/posts-wallpaper-engine-%E5%A3%81%E7%BA%B8%E6%8E%A8%E8%8D%90-%E4%BA%8C%E6%AC%A1%E5%85%83%E9%9A%8F%E6%9C%BA%E5%A3%81%E7%BA%B8</link><guid isPermaLink="false">post/posts-wallpaper-engine-壁纸推荐-二次元随机壁纸</guid><description>Wallpaper Engine 壁纸推荐 - 二次元随机壁纸，支持悬浮时钟、一言（Hitokoto）展示与壁纸轮播。</description><pubDate>Fri, 10 Jul 2026 04:30:35 GMT</pubDate><content:encoded>&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;所以就弄了个随机壁纸，调用 栗次元API(&lt;a href=&quot;https://t.alcy.cc/ycy&quot;&gt;https://t.alcy.cc/ycy&lt;/a&gt;) 来获取随机壁纸。&lt;/p&gt;
&lt;p&gt;Github: &lt;a href=&quot;https://github.com/God-2077/FloatingClock_Wallpaper&quot;&gt;God-2077/FloatingClock_Wallpaper&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Steam workshop: &lt;a href=&quot;https://steamcommunity.com/sharedfiles/filedetails/?id=3758991075&quot;&gt;3758991075&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;功能&lt;a href=&quot;#功能&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;数字时钟，带 VanillaTilt 3D 悬浮倾斜效果&lt;/li&gt;
&lt;li&gt;一言句子展示，点击 / 按 &lt;code&gt;R&lt;/code&gt; 键手动刷新，支持自动定时刷新&lt;/li&gt;
&lt;li&gt;壁纸轮播模式（可配置 URL 列表与间隔）&lt;/li&gt;
&lt;li&gt;双击时钟切换装饰元素显示/隐藏&lt;/li&gt;
&lt;li&gt;入场动画 &amp;amp; 过渡效果&lt;/li&gt;
&lt;li&gt;支持 Wallpaper Engine 暂停/恢复：暂停后当前周期完成后自动停止一言和轮播，恢复后继续运行&lt;/li&gt;
&lt;/ul&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;下载 Steam 并安装 Wallpaper Engine&lt;/p&gt;
&lt;p&gt;方式一，订阅 &lt;a href=&quot;https://steamcommunity.com/sharedfiles/filedetails/?id=3758991075&quot;&gt;[web 二次元壁纸（随机-可自定义）]&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;方式二，在 Wallpaper Engine 中点击--打开壁纸--从 Url 打开，输入 &lt;code&gt;https://god-2077.github.io/FloatingClock_Wallpaper/&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;技术栈&lt;a href=&quot;#技术栈&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;纯 HTML / CSS / JavaScript（无框架）&lt;/li&gt;
&lt;li&gt;VanillaTilt（3D 倾斜效果）&lt;/li&gt;
&lt;li&gt;Hitokoto API（v1.hitokoto.cn）&lt;/li&gt;
&lt;li&gt;Google Fonts（Inter / Noto Serif SC）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;快捷操作&lt;a href=&quot;#快捷操作&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&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;/td&gt;&lt;td&gt;刷新句子&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;按 &lt;code&gt;R&lt;/code&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;h2&gt;工作流程&lt;a href=&quot;#工作流程&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3&gt;初始化&lt;a href=&quot;#初始化&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;页面加载后 1 秒延迟初始化（&lt;code&gt;setTimeout&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;若 Wallpaper Engine 属性变更事件先触发，则提前初始化&lt;/li&gt;
&lt;li&gt;启动时钟、一言、壁纸三大模块&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;一言自动刷新&lt;a href=&quot;#一言自动刷新&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&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;  └─ 已暂停 → 标记 pending，停止&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                ↓ WE 恢复 (setPaused)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;             预加载 → 计时器开始 → 切换 → [检查暂停] → 循环&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;壁纸轮播&lt;a href=&quot;#壁纸轮播&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&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;  └─ 已暂停 → 标记 pending，停止&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                ↓ WE 恢复 (setPaused)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;             预加载 → 计时器开始 → 切换 → [检查暂停] → 循环&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;暂停 / 恢复&lt;a href=&quot;#暂停--恢复&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;暂停由 Wallpaper Engine 内置 &lt;code&gt;setPaused&lt;/code&gt; 事件驱动，无需额外配置&lt;/li&gt;
&lt;li&gt;暂停&lt;strong&gt;不会立即中断&lt;/strong&gt;当前计时周期，而是在当次切换完成后停止&lt;/li&gt;
&lt;li&gt;恢复后自动续上计时器，继续正常运行&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>category:文章</category></item><item><title>碎碎念: 26-06-14</title><link>https://blog.ksable.top/post/ssn/%E7%A2%8E%E7%A2%8E%E5%BF%B5-26-06-14</link><guid isPermaLink="false">ssn/碎碎念-26-06-14</guid><description>好像是昨天来着，更新了下博客，把源码和文章内容拆成两个仓库了。
一个公开仓库(astro-blog)，一个私有仓库(astro-blog-content)，通过自动化流程构建博客，构建产物推送到 astro-blog-deploy 仓库。
本地开发，先克隆 astro-blog 仓库，再克隆</description><pubDate>Sun, 14 Jun 2026 05:16:42 GMT</pubDate><content:encoded>&lt;p&gt;好像是昨天来着，更新了下博客，把源码和文章内容拆成两个仓库了。&lt;/p&gt;
&lt;p&gt;一个公开仓库(&lt;a href=&quot;https://github.com/God-2077/astro-blog&quot;&gt;astro-blog&lt;/a&gt;)，一个私有仓库(&lt;a href=&quot;https://github.com/God-2077/astro-blog-content&quot;&gt;astro-blog-content&lt;/a&gt;)，通过自动化流程构建博客，构建产物推送到 &lt;a href=&quot;https://github.com/God-2077/astro-blog-deploy&quot;&gt;astro-blog-deploy&lt;/a&gt; 仓库。&lt;/p&gt;
&lt;p&gt;本地开发，先克隆 astro-blog 仓库，再克隆 astro-blog-content 仓库，用软链接挂载博客文章等资源。&lt;/p&gt;
&lt;p&gt;完美实现了 博客源码 与 文章内容 的分离。&lt;/p&gt;</content:encoded><category>category:碎碎念</category><category>tag:S-5</category></item><item><title>碎碎念: 26-06-06</title><link>https://blog.ksable.top/post/ssn/%E7%A2%8E%E7%A2%8E%E5%BF%B5-26-06-06</link><guid isPermaLink="false">ssn/碎碎念-26-06-06</guid><description>诸位恩师倾囊余下的应试诀窍，字字都是临别惦念，末了送上诚挚期许。铃声落下的刹那，我们匆匆走完了高中最后一堂课，数载寒窗，就此仓促收梢。</description><pubDate>Sat, 06 Jun 2026 15:27:35 GMT</pubDate><content:encoded>&lt;p&gt;诸位恩师倾囊余下的应试诀窍，字字都是临别惦念，末了送上诚挚期许。铃声落下的刹那，我们匆匆走完了高中最后一堂课，数载寒窗，就此仓促收梢。&lt;/p&gt;</content:encoded><category>category:碎碎念</category><category>tag:S-5</category></item><item><title>碎碎念: 期末 · C</title><link>https://blog.ksable.top/post/ssn/%E7%A2%8E%E7%A2%8E%E5%BF%B5-%E6%9C%9F%E6%9C%AB-c</link><guid isPermaLink="false">ssn/碎碎念-期末-c</guid><description>2026.5.15.
今天上晚自习前，天下起了大雨。
（这段时间，出门要小心，因为天上可能突降暴雨）
很多人来教室时，都是穿拖鞋。阮也不意外。
她穿着件短袖，露出那光滑的手臂。裤子刚挽到膝盖处，恰到好处地将小腿裸露在外面。
她衣着单薄，给人一种弱弱的感觉，激起人的保护欲。
令她在我眼中，有些诱人。</description><pubDate>Fri, 15 May 2026 15:03:36 GMT</pubDate><content:encoded>&lt;p&gt;2026.5.15.&lt;/p&gt;
&lt;p&gt;今天上晚自习前，天下起了大雨。&lt;/p&gt;
&lt;p&gt;（这段时间，出门要小心，因为天上可能突降暴雨）&lt;/p&gt;
&lt;p&gt;很多人来教室时，都是穿拖鞋。阮也不意外。&lt;/p&gt;
&lt;p&gt;她穿着件短袖，露出那光滑的手臂。裤子刚挽到膝盖处，恰到好处地将小腿裸露在外面。&lt;/p&gt;
&lt;p&gt;她衣着单薄，给人一种弱弱的感觉，激起人的保护欲。&lt;/p&gt;
&lt;p&gt;令她在我眼中，有些诱人。&lt;/p&gt;
&lt;p&gt;我最近的精神状态似乎有些不太正常。&lt;/p&gt;
&lt;p&gt;以往我对阮是没啥想法的，我视她为同辆公交车上的路人甲，是一起前往下一站的路人。&lt;/p&gt;
&lt;p&gt;—&lt;/p&gt;
&lt;p&gt;高考意味着新的开始，却也意味着同样多的告别与离去。&lt;/p&gt;
&lt;p&gt;我没什么要好的朋友，和班里很多人都不熟。或许高考后，大家各奔东西，结伴旅游，但他们的脑海中，手机里，相册中都未曾留下过我的痕迹。而我，一个孤单的人变得更孤单了。&lt;/p&gt;</content:encoded><category>category:碎碎念</category><category>tag:S-3</category></item><item><title>🔒 碎碎念: 期末 · A</title><link>https://blog.ksable.top/post/ssn/%E7%A2%8E%E7%A2%8E%E5%BF%B5-%E8%BF%91%E6%97%A5</link><guid isPermaLink="false">ssn/碎碎念-近日</guid><description>此文章已加密，请在网页中查看</description><pubDate>Tue, 12 May 2026 18:59:53 GMT</pubDate><content:encoded>&lt;p&gt;此文章已加密，请在网页中查看&lt;/p&gt;</content:encoded><category>category:碎碎念</category><category>tag:S-2</category></item><item><title>碎碎念: 近期几项技术推进小结</title><link>https://blog.ksable.top/post/ssn/%E7%A2%8E%E7%A2%8E%E5%BF%B5-%E8%BF%91%E6%9C%9F%E5%87%A0%E9%A1%B9%E6%8A%80%E6%9C%AF%E6%8E%A8%E8%BF%9B%E5%B0%8F%E7%BB%93</link><guid isPermaLink="false">ssn/碎碎念-近期几项技术推进小结</guid><description>本文介绍了博客的多项优化：使用 CDN 加速静态资源、集成多语言翻译与赞赏按钮、添加浏览器语言检测；并分享了自用的批量翻译工具 fast_md_fanyi、友链聚合平台 FriendFeed，以及对 astro-koharu 项目的代码修复贡献。</description><pubDate>Tue, 12 May 2026 16:00:00 GMT</pubDate><content:encoded>&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;搭建 CDN 传输博客的静态 JS、CSS，以缓解博客压力&lt;/li&gt;
&lt;li&gt;将大量文章翻译为多语言 &lt;a href=&quot;#fast_md_fanyi&quot;&gt;翻译工具&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;添加文章赞赏按钮支持&lt;/li&gt;
&lt;li&gt;添加浏览器语言检测及切换提示功能&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;fast_md_fanyi&lt;a href=&quot;#fast_md_fanyi&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;自用的博客文章批量翻译工具，目前处于长久维护期中&lt;/p&gt;
&lt;p&gt;Github: &lt;a href=&quot;https://github.com/God-2077/fast_md_fanyi&quot;&gt;https://github.com/God-2077/fast_md_fanyi&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;FriendFeed&lt;a href=&quot;#friendfeed&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;友链文章聚合平台，目前处于长久维护期中&lt;/p&gt;
&lt;p&gt;Website: &lt;a href=&quot;https://friendfeed.ksable.top/&quot;&gt;https://friendfeed.ksable.top/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Github: &lt;a href=&quot;https://github.com/God-2077/FriendFeed&quot;&gt;https://github.com/God-2077/FriendFeed&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;astro-koharu&lt;a href=&quot;#astro-koharu&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;主要是发现一些代码问题并修复，但提的 PR，作者都没有回复&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;fix: 修复 React Grab 总是被启用问题 #184&lt;/li&gt;
&lt;li&gt;删除 Layout.astro 中无用的预连接第三方域名资源提示 #182&lt;/li&gt;
&lt;li&gt;feat(LinkEmbed): 修复 LinkEmbed 配置不生效问题、以及其它相关的若干问题 #180&lt;/li&gt;
&lt;/ol&gt;</content:encoded><category>category:碎碎念</category><category>tag:S-5</category></item><item><title>碎碎念: 今天我生日</title><link>https://blog.ksable.top/post/ssn/%E7%A2%8E%E7%A2%8E%E5%BF%B5-%E4%BB%8A%E5%A4%A9%E6%88%91%E7%94%9F%E6%97%A5</link><guid isPermaLink="false">ssn/碎碎念-今天我生日</guid><description>今天我生日，能和我说声生日快乐吗</description><pubDate>Sun, 26 Apr 2026 16:52:01 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;今天我生日，能和我说声生日快乐吗&lt;/strong&gt;&lt;/p&gt;
&lt;figure&gt;&lt;img src=&quot;https://ik.imagekit.io/ziw9wtigz/Posts/%E7%A2%8E%E7%A2%8E%E5%BF%B5-%E4%BB%8A%E5%A4%A9%E6%88%91%E7%94%9F%E6%97%A5/Screenshot_2026-04-27-00-29-56-600_com.android.calendar-edit.jpg&quot; alt=&quot;生日&quot; loading=&quot;lazy&quot; width=&quot;1043&quot; height=&quot;1558&quot; /&gt;&lt;figcaption&gt;生日&lt;/figcaption&gt;&lt;/figure&gt;</content:encoded><category>category:碎碎念</category><category>tag:S-3</category></item></channel></rss>