<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>架构 on Square Uncle</title>
    <link>https://squareuncle.com/tags/%E6%9E%B6%E6%9E%84/</link>
    <description>Recent content in 架构 on Square Uncle</description>
    <generator>Hugo -- 0.147.7</generator>
    <language>zh-cn</language>
    <lastBuildDate>Thu, 02 Apr 2026 21:15:00 +0800</lastBuildDate>
    <atom:link href="https://squareuncle.com/tags/%E6%9E%B6%E6%9E%84/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>主权级下载器：在 YouTube 的 n-sig 迷雾中开工</title>
      <link>https://squareuncle.com/posts/2026-04-02-sovereign-youtube-downloader-architecture/</link>
      <pubDate>Thu, 02 Apr 2026 21:15:00 +0800</pubDate>
      <guid>https://squareuncle.com/posts/2026-04-02-sovereign-youtube-downloader-architecture/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;YouTube 下载器架构封面&#34; loading=&#34;lazy&#34; src=&#34;https://squareuncle.com/images/youtube_downloader_architecture.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;[!TIP]&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;受众&lt;/strong&gt;：对自托管工具感兴趣、经常与各种“限制”博弈的开发者。
&lt;strong&gt;核心目标&lt;/strong&gt;：构建一个完全受控的 YouTube 媒体采集系统，解决 &lt;code&gt;n challenge&lt;/code&gt; 签名挑战。
&lt;strong&gt;问题-方案映射&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;登录墙/Cookie $\rightarrow$ Manifest v3 浏览器插件同步&lt;/li&gt;
&lt;li&gt;动态签名 (n-sig) $\rightarrow$ Docker 内置 External JS Solver (node)&lt;/li&gt;
&lt;li&gt;实时观测 $\rightarrow$ Socket.io 流式转发 stdout&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;
&lt;p&gt;最近在折腾自己的“数字主权”基础设施，其中一个刚需就是 YouTube 下载。市面上的工具很多，但随着 YouTube 对 &lt;code&gt;n-sig&lt;/code&gt;（一种通过混淆 JS 动态生成的签名）的限制加码，很多开源项目开始在大音轨下载上“翻车”。&lt;/p&gt;
&lt;p&gt;作为一个写了 20 年代码的老兵，我最受不了的就是“工具不可控”。于是，我把这套老伙计重新打磨了一下，做了一个“主权级”的架构。&lt;/p&gt;
&lt;h2 id=&#34;1-架构为什么非要搞这么复杂&#34;&gt;1. 架构：为什么非要搞这么复杂？&lt;/h2&gt;
&lt;p&gt;很多人觉得 &lt;code&gt;yt-dlp&lt;/code&gt; 一行命令能解决的事，为什么要搞插件、Docker 和后端？&lt;/p&gt;
&lt;p&gt;答案是：&lt;strong&gt;骨感现实&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cookie 维护&lt;/strong&gt;：手动导 &lt;code&gt;cookies.txt&lt;/code&gt; 太脏。我写了一个 Manifest v3 插件，点一下直接同步到云端。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;环境隔离&lt;/strong&gt;：我的开发机是 Windows，但下载器必须部署在 Linux Docker 里，且需要精准控制 &lt;code&gt;ffmpeg&lt;/code&gt; 和 &lt;code&gt;yt-dlp&lt;/code&gt; 的版本。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这就是我们的“三足鼎立”：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;插件 (Bridge)&lt;/strong&gt;：负责打通浏览器会话。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;后端 (Engine)&lt;/strong&gt;：Node.js + Socket.io，负责进程管理和实时日志。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;容器 (Infra)&lt;/strong&gt;：解决一切环境依赖。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;2-泥地打滚解决-n-sig-的深层逻辑&#34;&gt;2. 泥地打滚：解决 n-sig 的深层逻辑&lt;/h2&gt;
&lt;p&gt;前阵子，我的下载器突然报错：&lt;code&gt;n challenge solving failed&lt;/code&gt;。这是 YouTube 升级了混淆逻辑，&lt;code&gt;yt-dlp&lt;/code&gt; 默认的 Python 模拟器解不动了。&lt;/p&gt;</description>
    </item>
    <item>
      <title>手搓龙虾 (3): 将微信连接到 CLI 原生内核</title>
      <link>https://squareuncle.com/posts/2026-03-24-visagent-wechat-clawbot-integration/</link>
      <pubDate>Tue, 24 Mar 2026 12:45:00 +0800</pubDate>
      <guid>https://squareuncle.com/posts/2026-03-24-visagent-wechat-clawbot-integration/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;VisAgent 微信集成封面&#34; loading=&#34;lazy&#34; src=&#34;https://squareuncle.com/images/visagent_wechat_integration_cover.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;继我们之前讨论过的 &lt;a href=&#34;#ZgotmplZ&#34;&gt;RoleEngine 核心&lt;/a&gt; 之后，是时候填补原生 CLI “大脑”与现实世界通信平台——&lt;strong&gt;微信&lt;/strong&gt;之间的鸿沟了。&lt;/p&gt;
&lt;p&gt;在 VisAgent 中，我们不迷信臃肿的重量级框架。相反，我们采用 &lt;strong&gt;CLI 原生桥接 (CLI-Native Bridge)&lt;/strong&gt; 模式。本文将探讨我们如何将 “Clawbot”（我们的微信接口）连接到手搓的 Gemini CLI 内核。&lt;/p&gt;
&lt;h2 id=&#34;请求流从聊天到-cli&#34;&gt;请求流：从聊天到 CLI&lt;/h2&gt;
&lt;p&gt;该架构是一系列专用工具组成的链条，每个工具只做一件事并做到极致。以下是消息如何从手机传递到 AI 的过程：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;sequenceDiagram
    participant User as 📱 微信用户
    participant Daemon as ⚙️ WeClaw (Go)
    participant Bridge as 🌉 visagent_invoke.py
    participant Engine as 🧠 RoleEngine (Python)
    participant CLI as 🐚 Gemini CLI (Binary)

    User-&amp;gt;&amp;gt;Daemon: 发送消息
    Daemon-&amp;gt;&amp;gt;Bridge: 生成进程 (JSON)
    Bridge-&amp;gt;&amp;gt;Engine: 初始化角色
    Engine-&amp;gt;&amp;gt;CLI: subprocess.run(stdin=prompt)
    CLI--&amp;gt;&amp;gt;Engine: 原始 AI 输出
    Engine-&amp;gt;&amp;gt;Engine: 过滤 Agent 噪音
    Engine--&amp;gt;&amp;gt;Bridge: OK + 清净输出
    Bridge--&amp;gt;&amp;gt;Daemon: JSON 事件
    Daemon--&amp;gt;&amp;gt;User: 回复微信
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;1-桥梁visagent_invokepy&#34;&gt;1. 桥梁：&lt;code&gt;visagent_invoke.py&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;由于我们的微信守护进程 (&lt;strong&gt;WeClaw&lt;/strong&gt;) 是用 Go 编写的，而我们的 Agent 逻辑是用 Python 编写的，我们需要一个轻量化、高性能的桥梁。我们没有采用复杂的 RPC 系统，而是使用了 &lt;strong&gt;CLI 桥接&lt;/strong&gt;。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
