<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>咕咚的小站</title>
  
  
  <link href="https://gudong226.linuxdo.space/atom.xml" rel="self"/>
  
  <link href="https://gudong226.linuxdo.space/"/>
  <updated>2026-05-10T07:48:39.801Z</updated>
  <id>https://gudong226.linuxdo.space/</id>
  
  <author>
    <name>咕咚</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>那天三个账号一起被拉去验证</title>
    <link href="https://gudong226.linuxdo.space/2026/05/07/browser-per-account/"/>
    <id>https://gudong226.linuxdo.space/2026/05/07/browser-per-account/</id>
    <published>2026-05-07T17:20:00.000Z</published>
    <updated>2026-05-10T07:48:39.801Z</updated>
    
    <content type="html"><![CDATA[<p>那天群里告警先弹的是 A 号。</p><p>我以为又是平台日常风控，没当回事。两分钟后 B 号也叫了，再过一会儿 C 号也挂了。</p><p>那一瞬间我脑子有点空白。</p><p>打开日志一看——这三个账号挨着撞到了滑块。后台跑的是同一份浏览器目录，cookie、缓存、指纹全共享。一个被风控盯上，剩下的就跟着连坐。</p><p>平台不傻这事我之前也想过，但没料到会这么快。</p><p>那天晚上我把 <code>browser_data</code> 拆成了一个账号一份：<code>browser_data/user_&lt;账号ID&gt;</code>。</p><p>磁盘占用变多，启动慢了几秒，启动脚本也得改。但起码不会一爆全爆。</p><p>后来又踩了一个新坑。</p><p>Chromium 异常退出会留下一个 <code>SingletonLock</code>。一开始我看到锁就清掉重启，省事。</p><p>后来发现这种「看到就清」太鲁莽——容器换 hostname 之后旧锁还在、宿主机重启也会留锁、调试时手动 kill 也会留锁。这些里面可能还住着活进程。</p><p>判断条件被我改紧了：只清「当前宿主机 + PID 已死」或者「Docker 容器 hostname 漂移」这两种确定的情况。其他时候宁可走兜底逻辑，也不去乱删。</p><p>总之这事过了之后我就清楚一件事——只要「账号」在你的项目里是个独立单位，就别让它们在底层资源上彼此牵连。</p><p>省那一点磁盘，省了迟早要还。</p>]]></content>
    
    
    <summary type="html">群里告警先弹的是 A 号，两分钟后 B 号也叫了。</summary>
    
    
    
    <category term="项目" scheme="https://gudong226.linuxdo.space/categories/%E9%A1%B9%E7%9B%AE/"/>
    
    
    <category term="折腾" scheme="https://gudong226.linuxdo.space/tags/%E6%8A%98%E8%85%BE/"/>
    
    <category term="隔离" scheme="https://gudong226.linuxdo.space/tags/%E9%9A%94%E7%A6%BB/"/>
    
  </entry>
  
  <entry>
    <title>滑块那块我推倒重来了</title>
    <link href="https://gudong226.linuxdo.space/2026/05/06/slider/"/>
    <id>https://gudong226.linuxdo.space/2026/05/06/slider/</id>
    <published>2026-05-06T18:10:00.000Z</published>
    <updated>2026-05-10T07:48:39.801Z</updated>
    
    <content type="html"><![CDATA[<p>那天我把整套滑块和账密登录都推倒重来了。</p><p>不是之前那版有 bug，是我突然想明白——越想让它「全自动」，它坏得越频繁。</p><p>之前那一版：自动识别滑块 → 自动滑动 → 失败重试 → 换姿势再试。能跑，但每次跑我心都悬着。</p><p>闲鱼那边一直在升级检测。今天能过的姿势，明天可能就被识破。你改一次它改一次，最后变成跟自己玩猫鼠游戏。</p><p>新的版本里思路简单了不少。</p><p>默认就是最朴素那一套，老老实实。撞上滑块就保留这个账号的浏览器画像、复用持久 profile、等下次自动恢复。真搞不定就发通知，等人介入。</p><p>这听起来像后退——「全自动」三个字不要了。</p><p>但跑一周之后告警量直接掉了一半多。</p><p>我不再跟平台拼智斗。「不撞」放第一位，「撞了能恢复」放第二位，「全程无感」反而排到最后。</p><p>后来翻 commit log 才发现，过去几个月我反复改的几乎都是同一个文件——滑块识别那一段。改一次失败一次，再改再失败。直到这一次完全换了思路才停下来。</p><p>很多自动化看着厉害，倒就倒在「想做太多」。</p><p>适当放手让人介入，这套东西反而活得久。</p>]]></content>
    
    
    <summary type="html">改了几个月发现，越想&quot;全自动&quot;就坏得越频繁。</summary>
    
    
    
    <category term="项目" scheme="https://gudong226.linuxdo.space/categories/%E9%A1%B9%E7%9B%AE/"/>
    
    
    <category term="折腾" scheme="https://gudong226.linuxdo.space/tags/%E6%8A%98%E8%85%BE/"/>
    
    <category term="反爬" scheme="https://gudong226.linuxdo.space/tags/%E5%8F%8D%E7%88%AC/"/>
    
  </entry>
  
  <entry>
    <title>自动回复这事我做了好几个月</title>
    <link href="https://gudong226.linuxdo.space/2026/05/03/reply-bot/"/>
    <id>https://gudong226.linuxdo.space/2026/05/03/reply-bot/</id>
    <published>2026-05-03T17:15:00.000Z</published>
    <updated>2026-05-10T07:48:39.801Z</updated>
    
    <content type="html"><![CDATA[<p>我以为做个自动回复机器人是个轻巧活儿。</p><p>匹配关键词、调个 API、Cookie 抓一下，几个晚上能跑起来。</p><p>后来这事做了好几个月。</p><p>最早出问题的是会话——我天真地以为每条消息独立处理就行。跑两天就崩：同一个买家半小时前问过、十分钟前又问、刚刚还在问，机器人每次都热情回他一遍，把人整懵了。我赶紧加上下文。</p><p>接着是商品。买家说「这个还有吗」，他指的”这个”是哪个 SKU？我得从聊天页面结构里反推——他点进来的是哪张卡片、截图发的是哪个商品。这一段我改了不下十次。</p><p>后来是 AI 接入。直接挂了个模型上去，token 用得快、回复又泛。把 AI 摆到关键词后面，立刻就好了。</p><p>再后来是反爬。Cookie 会过期、登录态会掉、滑块会找上门、账号会被风控暂停。我现在每加一个功能都得在心里掂量一下——这个会不会让风控更频繁？</p><p>最后是多账号。一开始所有账号共享一个浏览器目录，撞过一次「全员连坐」之后，老老实实拆成 <code>user_&lt;账号ID&gt;</code> 各管各的。</p><p>每解决一个问题，下一个就在背后排好队等你。</p><p>所谓「自动」从来不是少写代码的意思。是你提前替自己挡住了那些原本要发生的事。</p>]]></content>
    
    
    <summary type="html">我以为几个晚上能搞定，后来这事做了好几个月。</summary>
    
    
    
    <category term="项目" scheme="https://gudong226.linuxdo.space/categories/%E9%A1%B9%E7%9B%AE/"/>
    
    
    <category term="折腾" scheme="https://gudong226.linuxdo.space/tags/%E6%8A%98%E8%85%BE/"/>
    
    <category term="自动回复" scheme="https://gudong226.linuxdo.space/tags/%E8%87%AA%E5%8A%A8%E5%9B%9E%E5%A4%8D/"/>
    
  </entry>
  
  <entry>
    <title>这个文件已经一万六千行了</title>
    <link href="https://gudong226.linuxdo.space/2026/04/22/giant-file/"/>
    <id>https://gudong226.linuxdo.space/2026/04/22/giant-file/</id>
    <published>2026-04-22T15:40:00.000Z</published>
    <updated>2026-05-10T07:48:39.801Z</updated>
    
    <content type="html"><![CDATA[<p>那天我打开 <code>XianyuAutoAsync.py</code>，VS Code 卡了一下才把文件渲染出来。</p><p>光标拉到底部，行号停在 16436。</p><p>写第一版的时候这个文件大概 3000 行。慢慢加功能、慢慢补 bug、慢慢长成现在这样。每次改东西都得先 grep 一遍，确认这一处不会牵连别的地方。</p><p>最近梳理优化方向，我把它列在 P0 里。</p><p>但拆这种文件不能拍脑袋。</p><p>我现在想清楚一件事——先拆结构，不改逻辑。</p><p>具体说就是按域切：连接的进 <code>ws_connection</code>、消息分发进 <code>message_dispatch</code>、订单的进 <code>order_flow</code>、自动回复的进 <code>auto_reply</code>。每一块的代码原样搬过去，连缩进都不动。</p><p>只搬，不优化。</p><p>理由很简单：拆完之后还能跑得起来，是接下来一切优化的前提。如果你边拆边改，出了 bug 都分不清是「拆错了」还是「改错了」。</p><p><code>reply_server.py</code> 也一样，13000 行，路由和业务混在一起。我打算先按 auth &#x2F; cookies &#x2F; orders &#x2F; notifications &#x2F; system 这五块拆出去。</p><p>数据层那个 9000 多行的 <code>db_manager.py</code> 是最后才动的——它牵的最深，先把上层稳住再说。</p><p>写到这我也清楚——这种拆分要花很长时间，不会一两天搞完。</p><p>但要是不开始，就永远在「等以后有空」里推。</p>]]></content>
    
    
    <summary type="html">光标拉到底部，行号停在 16436。</summary>
    
    
    
    <category term="项目" scheme="https://gudong226.linuxdo.space/categories/%E9%A1%B9%E7%9B%AE/"/>
    
    
    <category term="折腾" scheme="https://gudong226.linuxdo.space/tags/%E6%8A%98%E8%85%BE/"/>
    
    <category term="重构" scheme="https://gudong226.linuxdo.space/tags/%E9%87%8D%E6%9E%84/"/>
    
  </entry>
  
  <entry>
    <title>把 AI 摆到了关键词后面</title>
    <link href="https://gudong226.linuxdo.space/2026/04/09/reply-priority/"/>
    <id>https://gudong226.linuxdo.space/2026/04/09/reply-priority/</id>
    <published>2026-04-09T14:30:00.000Z</published>
    <updated>2026-05-10T07:48:39.801Z</updated>
    
    <content type="html"><![CDATA[<p>那天我又把回复优先级调了一遍。</p><p>之前的逻辑很粗：关键词匹配不上就直接走 AI。</p><p>跑了一阵发现不对劲。买家问「多少钱」，AI 回的是「亲，您好哦，价格在商品详情里有标哦」。</p><p>人家想看一个数字，不是这种话。</p><p>我把顺序改了——</p><p>指定商品的回复 → 商品维度关键词 → 通用关键词 → 默认回复 → AI。</p><p>AI 摆到了最后。</p><p>不是它不好用，是它太会说。什么都答得很顺，什么都没解决。买家想知道「发不发顺丰」「能不能少 5 块」「还有没有库存」，这些每一条都有标准答案，关键词就够。</p><p>后来导关键词的方式也变简单。把店里最常问的那十几条手填进去，再用 Excel 批量补一批。十分钟的事，盖掉八成对话。</p><p>剩下两成才让 AI 上场——「这个能配 XX 用吗」「适合送女朋友吗」之类的开放问题，关键词写不全的，让模型来兜。</p><p>跑了几周比之前舒服多了。token 用量也掉下来七成左右。</p><p>也不是说 AI 没用，是它该出场的时机不太一样——你问它的时候它在，你没问它的时候它别抢着说。</p>]]></content>
    
    
    <summary type="html">买家问&quot;多少钱&quot;，AI 回&quot;亲，价格在商品详情里有标哦&quot;。</summary>
    
    
    
    <category term="项目" scheme="https://gudong226.linuxdo.space/categories/%E9%A1%B9%E7%9B%AE/"/>
    
    
    <category term="AI" scheme="https://gudong226.linuxdo.space/tags/AI/"/>
    
    <category term="折腾" scheme="https://gudong226.linuxdo.space/tags/%E6%8A%98%E8%85%BE/"/>
    
  </entry>
  
  <entry>
    <title>我以为 Token 刷新就几行代码</title>
    <link href="https://gudong226.linuxdo.space/2026/04/03/token-refresh/"/>
    <id>https://gudong226.linuxdo.space/2026/04/03/token-refresh/</id>
    <published>2026-04-03T16:30:00.000Z</published>
    <updated>2026-05-10T07:48:39.801Z</updated>
    
    <content type="html"><![CDATA[<p>我以为 token 刷新是个简单事。</p><p>cookie 快过期了，触发一次接口、拿新的 cookie、写回去——几行代码。</p><p>跑了一段时间发现完全不是。</p><p>第一个意外是滑块。刷新接口本身就会触发风控验证。你以为在调一个 API，平台那边可能弹给你一个滑块。我得在刷新链路里嵌入完整的滑块识别，识别失败还要支持人工兜底。</p><p>第二个意外是有头模式白屏。我让 Playwright 启了带界面的浏览器去刷新，结果在 Docker 里显示一片白。后来发现是 xvfb 的虚拟显示和 Chromium 的渲染时序对不上。这一段调了三天。</p><p>第三个意外是会话回写。滑块过了之后，平台会发一个新的 session cookie 给你。我的代码一开始没接住——刷新成功了，但 cookie 没存对，下一次接口又被拒了。这种”成功的失败”最难调。</p><p>第四个意外是人脸验证。某次刷新触发了人脸——我项目里根本没准备这种情况。临时加了一个人脸通知模板，让 app 把验证链接推到我手机，人介入一下。</p><p>第五个意外是并发刷新。同一个账号多个地方触发刷新，可能同时去抢同一把锁。我加了 in-flight 预占机制，让后来的等前面的，避免重复触发风控。</p><p>写到现在我才接受一件事——</p><p>刷新一个 token 不是”调一次接口”。</p><p>是一整条会话恢复链路：会失败、会被识别、会被改写、会撞上意外。</p><p>这件事我大概会一直接着改。</p>]]></content>
    
    
    <summary type="html">cookie 快过期，调个接口换一下——我以为就这么简单。</summary>
    
    
    
    <category term="项目" scheme="https://gudong226.linuxdo.space/categories/%E9%A1%B9%E7%9B%AE/"/>
    
    
    <category term="折腾" scheme="https://gudong226.linuxdo.space/tags/%E6%8A%98%E8%85%BE/"/>
    
    <category term="反爬" scheme="https://gudong226.linuxdo.space/tags/%E5%8F%8D%E7%88%AC/"/>
    
  </entry>
  
  <entry>
    <title>二十个商品一起擦亮，账号就被限了</title>
    <link href="https://gudong226.linuxdo.space/2026/03/22/polish-products/"/>
    <id>https://gudong226.linuxdo.space/2026/03/22/polish-products/</id>
    <published>2026-03-22T14:00:00.000Z</published>
    <updated>2026-05-10T07:48:39.801Z</updated>
    
    <content type="html"><![CDATA[<p>闲鱼上有个功能叫”擦亮”。</p><p>简单说就是给商品刷一下时间戳，让它出现在搜索前列。手动擦一个商品要点三下，店里二十个商品就要点六十下。</p><p>很自然的需求是——一键全擦。</p><p>我第一版写得很直白：拿到商品列表，循环调接口，二十个并发发出去。看起来漂亮。</p><p>跑了两次以后这个账号开始被限频。</p><p>平台不傻——二十个商品同时擦亮 + 同一个 IP + 同一个 cookie，这看上去就是机器在干。后来我加了串行 + 间隔，问题还在：每天都在同一时刻擦，规律都摆得明明白白。</p><p>最后这套东西改成了这样——</p><p>可以选每天一个时段（比如 10 点到 12 点），系统在这个时段里随机分布执行；每个商品之间有随机延迟，几分钟到十几分钟不等；遇到当下高峰还会自动让一让。</p><p>整体看起来更像一个人在没事的时候点一点。</p><p>代价是擦亮一轮要花一两个小时，不是几秒。</p><p>写完这段我才意识到——批量做事的真正难点几乎从来不是”批量”两个字。是怎么让批量看上去不像批量。</p><p>很多自动化项目第一版做得快，是因为它们做的是”机器干活”。第二版做得慢，是因为它们开始做”机器装人”。</p>]]></content>
    
    
    <summary type="html">同一个 IP、同一个 cookie、二十个并发——看上去就是机器在干。</summary>
    
    
    
    <category term="项目" scheme="https://gudong226.linuxdo.space/categories/%E9%A1%B9%E7%9B%AE/"/>
    
    
    <category term="折腾" scheme="https://gudong226.linuxdo.space/tags/%E6%8A%98%E8%85%BE/"/>
    
    <category term="反爬" scheme="https://gudong226.linuxdo.space/tags/%E5%8F%8D%E7%88%AC/"/>
    
  </entry>
  
  <entry>
    <title>（修改测试）从这里开始写第一篇</title>
    <link href="https://gudong226.linuxdo.space/2026/03/16/start-here/"/>
    <id>https://gudong226.linuxdo.space/2026/03/16/start-here/</id>
    <published>2026-03-16T04:00:00.000Z</published>
    <updated>2026-05-10T07:48:39.801Z</updated>
    
    <content type="html"><![CDATA[<p>一个刚开始的博客，最不需要的往往就是复杂后台。</p><p>你真正需要的是三件事：</p><ul><li>一个顺手写作的地方。</li><li>一条稳定发布的路径。</li><li>一套半年后看起来依然清楚的结构。</li></ul><p>这就是这个起步方案背后的想法。</p><h2 id="这套配置优先考虑什么"><a href="#这套配置优先考虑什么" class="headerlink" title="这套配置优先考虑什么"></a>这套配置优先考虑什么</h2><ul><li>用 Markdown 写文章，内容本身最清楚。</li><li>所有修改都进 Git，方便回看和备份。</li><li>先用静态站部署，省钱、省心、速度也够快。</li><li>后面要加搜索、评论、表单时，不需要推倒重来。</li></ul><h2 id="为什么用-Hexo"><a href="#为什么用-Hexo" class="headerlink" title="为什么用 Hexo"></a>为什么用 Hexo</h2><p>Hexo 对博客很合适，因为它本来就是围绕静态博客场景设计的。对个人站来说，这通常意味着更少的维护、更高的性能，以及更低的复杂度。</p><p>同时它也保留了主题、标签、分类和归档这些成熟能力，所以网站长大以后依然能保持清楚。</p><h2 id="接下来做什么"><a href="#接下来做什么" class="headerlink" title="接下来做什么"></a>接下来做什么</h2><p>把这些示例文章替换成你的内容，改好站点信息，接上 GitHub 和 Cloudflare Pages，就已经是一套真正能持续发布的博客流程了。</p>]]></content>
    
    
    <summary type="html">（修改测试）先把博客写起来，再慢慢加功能，比一开始做太重更重要。（修改测试）</summary>
    
    
    
    <category term="博客搭建" scheme="https://gudong226.linuxdo.space/categories/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA/"/>
    
    
    <category term="起步" scheme="https://gudong226.linuxdo.space/tags/%E8%B5%B7%E6%AD%A5/"/>
    
    <category term="搭建" scheme="https://gudong226.linuxdo.space/tags/%E6%90%AD%E5%BB%BA/"/>
    
  </entry>
  
  <entry>
    <title>为长期写作准备一个稳当的底子</title>
    <link href="https://gudong226.linuxdo.space/2026/03/12/steady-foundation/"/>
    <id>https://gudong226.linuxdo.space/2026/03/12/steady-foundation/</id>
    <published>2026-03-12T04:00:00.000Z</published>
    <updated>2026-03-14T04:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>刚开始做博客的时候，很容易高估“以后可能会用到”的东西。</p><p>数据库听起来专业，后台系统看起来完整，全栈框架也像是更面向未来。</p><p>但大多数个人博客，一开始其实都不需要这些。</p><h2 id="先把归档建立起来"><a href="#先把归档建立起来" class="headerlink" title="先把归档建立起来"></a>先把归档建立起来</h2><p>真正有价值的是文章本身。如果内容容易版本管理、容易备份、容易迁移，那么整个平台就会一直保持灵活。</p><p>把文章以 Markdown 文件的形式放在仓库里，是一种很朴素但很可靠的做法。它可读、可迁移，也不依赖某个特定系统。</p><h2 id="复杂度要等到真的有价值时再加"><a href="#复杂度要等到真的有价值时再加" class="headerlink" title="复杂度要等到真的有价值时再加"></a>复杂度要等到真的有价值时再加</h2><p>通常来说，真正值得先加的能力会是这些：</p><ol><li>文章多起来后再补搜索。</li><li>读者真的开始互动后再开评论。</li><li>有明确工作流以后再接表单或自动化。</li></ol><p>这样做的好处是，网站始终保持可理解，同时又不丢掉未来的扩展空间。</p><h2 id="一个很实用的判断标准"><a href="#一个很实用的判断标准" class="headerlink" title="一个很实用的判断标准"></a>一个很实用的判断标准</h2><p>如果一个新功能没有在这个月里明显改善写作、阅读或者发布体验，那它大概率可以再等等。</p>]]></content>
    
    
    <summary type="html">一套好的博客方案，应该让你现在能写，半年后也不会想重做。</summary>
    
    
    
    <category term="技术" scheme="https://gudong226.linuxdo.space/categories/%E6%8A%80%E6%9C%AF/"/>
    
    
    <category term="架构" scheme="https://gudong226.linuxdo.space/tags/%E6%9E%B6%E6%9E%84/"/>
    
    <category term="策略" scheme="https://gudong226.linuxdo.space/tags/%E7%AD%96%E7%95%A5/"/>
    
  </entry>
  
  <entry>
    <title>把发版自动化以后，事情更多了</title>
    <link href="https://gudong226.linuxdo.space/2026/03/11/hot-update/"/>
    <id>https://gudong226.linuxdo.space/2026/03/11/hot-update/</id>
    <published>2026-03-11T15:30:00.000Z</published>
    <updated>2026-05-10T07:48:39.801Z</updated>
    
    <content type="html"><![CDATA[<p>最早发版本的时候我用 SCP。</p><p>把代码打个包传服务器，登上去解压，重启服务，看一眼日志，搞定。一开始一周一次还行；等到改 bug 多了一天发两次，这套手动流程就变得很烦。</p><p>后来我接了 GitHub Actions 自动 release。</p><p>push 到 main 触发流水线、读 <code>static/version.txt</code>、生成 <code>update_files.json</code>、创建 release。听起来很顺。</p><p>写起来才发现真正难的不是构建，是清单。</p><p>哪些文件该进热更包？哪些不该进？我第一版定规则的时候很乐观——所有 <code>.py</code>、<code>.html</code>、<code>.js</code> 都进。</p><p>跑了第二天就出事了。</p><p><code>global_config.yml</code> 一起更新过去，覆盖了用户的本地配置。<code>data/</code> 目录里的运行时数据也带了进去。<code>node_modules</code> 装进了热更包。问题一大堆，全是我没想清楚”哪些文件是开发态的、哪些是运行态的”。</p><p>现在这份排除清单我审了不下十遍：用户配置、运行时目录、Docker 文件、CI 文件、文档、数据库、日志、缓存、备份目录——一律不进热更。</p><p>后来还支持了 <code>deleted_files</code> 列表清理旧文件。这个能力又踩了一个坑——清理之前必须先备份原文件，不然万一要回滚，发现东西已经被删了。</p><p>干这件事让我相信一句话——</p><p>自动化的难点几乎从来不是”自动什么”。是想清楚”绝对不能自动什么”。</p>]]></content>
    
    
    <summary type="html">把 SCP 换成 GitHub Actions 之后，第二天就出事了。</summary>
    
    
    
    <category term="项目" scheme="https://gudong226.linuxdo.space/categories/%E9%A1%B9%E7%9B%AE/"/>
    
    
    <category term="折腾" scheme="https://gudong226.linuxdo.space/tags/%E6%8A%98%E8%85%BE/"/>
    
    <category term="部署" scheme="https://gudong226.linuxdo.space/tags/%E9%83%A8%E7%BD%B2/"/>
    
  </entry>
  
  <entry>
    <title>给自己设计一套能持续下去的写作节奏</title>
    <link href="https://gudong226.linuxdo.space/2026/03/08/writing-rhythm/"/>
    <id>https://gudong226.linuxdo.space/2026/03/08/writing-rhythm/</id>
    <published>2026-03-08T04:00:00.000Z</published>
    <updated>2026-05-10T07:48:39.801Z</updated>
    
    <content type="html"><![CDATA[<p>稳定更新不一定要靠很重的内容系统，它更需要的是一套能让你继续写下去的节奏。</p><h2 id="先把流程变得看得见"><a href="#先把流程变得看得见" class="headerlink" title="先把流程变得看得见"></a>先把流程变得看得见</h2><p>对小博客来说，这样的节奏就已经够用：</p><ul><li>想法先统一记在一个地方。</li><li>每周把其中一个想法推进成草稿。</li><li>当一篇文章已经把一件事说明白时，就发布它。</li></ul><p>最后这一点很重要。很多原本不错的文章，之所以迟迟发不出去，是因为它们想一次说太多事。</p><h2 id="让网站去配合习惯，而不是反过来"><a href="#让网站去配合习惯，而不是反过来" class="headerlink" title="让网站去配合习惯，而不是反过来"></a>让网站去配合习惯，而不是反过来</h2><p>好的工具应该减少阻力，而不是制造仪式感。</p><p>静态内容、本地预览、清楚的页面结构，会让你把注意力留在表达上，而不是耗在基础设施上。</p><h2 id="对未来的自己友好一点"><a href="#对未来的自己友好一点" class="headerlink" title="对未来的自己友好一点"></a>对未来的自己友好一点</h2><p>标题、摘要、标签这些看似细小的东西，其实会决定一年后的归档是否还好翻、好找、好维护。</p>]]></content>
    
    
    <summary type="html">比起复杂内容系统，一个能长期执行的写作习惯往往更有用。</summary>
    
    
    
    <category term="写作" scheme="https://gudong226.linuxdo.space/categories/%E5%86%99%E4%BD%9C/"/>
    
    
    <category term="写作" scheme="https://gudong226.linuxdo.space/tags/%E5%86%99%E4%BD%9C/"/>
    
    <category term="流程" scheme="https://gudong226.linuxdo.space/tags/%E6%B5%81%E7%A8%8B/"/>
    
  </entry>
  
  <entry>
    <title>AI 那家挂了的那一晚</title>
    <link href="https://gudong226.linuxdo.space/2026/03/03/ai-providers/"/>
    <id>https://gudong226.linuxdo.space/2026/03/03/ai-providers/</id>
    <published>2026-03-03T14:30:00.000Z</published>
    <updated>2026-05-10T07:48:39.801Z</updated>
    
    <content type="html"><![CDATA[<p>第一版 AI 接入我写得很简单。</p><p>OpenAI 的 SDK 装好，API key 填上，调用包起来——半天搞定。</p><p>那天晚上我自我感觉良好。</p><p>直到第二周某个晚上，那家 API 突然不通。可能是被墙了，也可能是限流，反正客户端傻乎乎地超时然后报错，自动回复全停了。我躺在床上看着报警，心想糟了。</p><p>那一晚我把 AI 调用层抽出来了。</p><p>不是说切供应商有多难——难的是当时项目里到处都写死了”OpenAI 风格的请求”。模型名写死、URL 写死、请求格式也按它的来。要换一家就得动十几个文件。</p><p>后来重构成现在这个样子：基础地址、模型名、API key、请求格式全从配置走，前端有个表单可以加任意一个兼容 OpenAI 协议的供应商。本地测过 DeepSeek、智谱、Kimi、阿里通义，哪个不通就切哪个。</p><p>带来的好副作用是：客户也能接自己买的 token。</p><p>我后来想，对接外部服务这事，”能跑”和”能换”之间隔了一座山。第一版只关心能跑是合理的——但你迟早要把”能换”补上。</p><p>因为外部服务一定会某一天挂掉。</p><p>不是它不靠谱，是它本来就不该被绑死。</p>]]></content>
    
    
    <summary type="html">那天客户端傻乎乎地超时然后报错，自动回复全停了。</summary>
    
    
    
    <category term="项目" scheme="https://gudong226.linuxdo.space/categories/%E9%A1%B9%E7%9B%AE/"/>
    
    
    <category term="AI" scheme="https://gudong226.linuxdo.space/tags/AI/"/>
    
    <category term="折腾" scheme="https://gudong226.linuxdo.space/tags/%E6%8A%98%E8%85%BE/"/>
    
  </entry>
  
  <entry>
    <title>本来不想做暗色模式的</title>
    <link href="https://gudong226.linuxdo.space/2026/02/09/dark-mode/"/>
    <id>https://gudong226.linuxdo.space/2026/02/09/dark-mode/</id>
    <published>2026-02-09T14:00:00.000Z</published>
    <updated>2026-05-10T07:48:39.801Z</updated>
    
    <content type="html"><![CDATA[<p>最初我没打算做暗色模式。</p><p>理由很简单——我觉得这是个”管理后台”，又不是用户产品，谁会盯着看那么久。</p><p>事实证明我盯着看的时间比谁都长。</p><p>凌晨两点调代码，白屏一打开整个人都精神了。不是干活的精神，是被刺到的精神。两天后我决定先把暗色加上。</p><p>加完之后才发现这事远比想象的麻烦。</p><p>第一个坑是刷新闪白。浏览器从加载到 JS 跑起来之间，会先用默认主题渲染一遍——光这一下就能晃你眼睛。后来我加了内联样式做兜底，刷新前先用 <code>visibility:hidden</code> 把页面藏起来，等主题确定再露出来。</p><p>第二个坑是跟随系统。Mac 的深色切换不是瞬间生效，他有过渡动画，过渡期间 <code>prefers-color-scheme</code> 媒体查询会有一两秒的不稳定。这段时间监听到的事件可能是错的。</p><p>第三个坑是闲鱼官网。你管理后台再黑，跑业务还得回闲鱼网页看消息——那一边只有亮色，两窗口跳来跳去眼睛非常累。后来我顺手用油猴写了一份闲鱼聊天页面的暗色样式，一并塞进了项目仓库。</p><p>写完一回头我才意识到——</p><p>暗色模式不是装饰功能。</p><p>它是只要你晚上还干活，就一定会自己用上的功能。</p>]]></content>
    
    
    <summary type="html">凌晨两点白屏一开，整个人精神了。</summary>
    
    
    
    <category term="项目" scheme="https://gudong226.linuxdo.space/categories/%E9%A1%B9%E7%9B%AE/"/>
    
    
    <category term="折腾" scheme="https://gudong226.linuxdo.space/tags/%E6%8A%98%E8%85%BE/"/>
    
    <category term="前端" scheme="https://gudong226.linuxdo.space/tags/%E5%89%8D%E7%AB%AF/"/>
    
  </entry>
  
  <entry>
    <title>刚跑起来三天，就撞滑块了</title>
    <link href="https://gudong226.linuxdo.space/2026/01/28/early-days/"/>
    <id>https://gudong226.linuxdo.space/2026/01/28/early-days/</id>
    <published>2026-01-28T15:30:00.000Z</published>
    <updated>2026-05-10T07:48:39.801Z</updated>
    
    <content type="html"><![CDATA[<p>那一周我把项目跑起来了。</p><p>不夸张地说，从 fork 别人的代码到本地接进第一个账号，花了不到两天。那天晚上看着控制台第一条买家消息打印出来，我以为最难的部分已经过去了。</p><p>第三天，第一个滑块就找上门。</p><p>前两天写代码很快，是因为闲鱼那一套 API 调通就够了。但滑块这种东西不是”调通”能解决的——它会变。我那一周改了八次重试策略：等待时间、滑动曲线、滑块识别、失败回退……每次都觉得这次稳了，然后跑两小时就被打回原形。</p><p>后来我发现，问题不在重试上。问题在我太想”一次成功”。</p><p>把心态改成”撞了能优雅退回”之后，整套东西反而稳了——失败就保存现场、推个通知、等下一次机会。</p><p>那一周让我学了三件事。</p><p>第一，写一个能跑起来的版本不难。让它一直跑下去才难。</p><p>第二，闲鱼那边的反爬不是技术问题，是策略问题。你跟它”赛跑”永远跑不赢。</p><p>第三，很多看起来聪明的代码，其实只是给自己加戏。最朴素的等待和兜底，往往比花活儿管用。</p><p>跑到现在三个多月，我没在第三件事上犯过新错——那一周给我的教训太深了。</p>]]></content>
    
    
    <summary type="html">前两天写代码很爽，第三天滑块就找上门了。</summary>
    
    
    
    <category term="项目" scheme="https://gudong226.linuxdo.space/categories/%E9%A1%B9%E7%9B%AE/"/>
    
    
    <category term="折腾" scheme="https://gudong226.linuxdo.space/tags/%E6%8A%98%E8%85%BE/"/>
    
    <category term="启动" scheme="https://gudong226.linuxdo.space/tags/%E5%90%AF%E5%8A%A8/"/>
    
  </entry>
  
</feed>
