<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>EchoPing&#39;s Blog</title>
        <link>/</link>
        <description>最新内容 - EchoPing&#39;s Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Tue, 21 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>为 骁龙410棒子换上 Alpine 系统</title>
            <link>/tutorials/26-07-21-openstick-alpine/</link>
            <pubDate>Tue, 21 Jul 2026 00:00:00 +0000</pubDate>
            <guid>/tutorials/26-07-21-openstick-alpine/</guid>
            <description>&lt;p&gt;本教程面向小白，大部分工作都借助如codex，opencode等 AI Agent 工具完成操作。&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;利用现成的 Debian 刷机包，只替换 rootfs，得到更轻量的 Alpine 系统。应该适用于所有有可用 Debian 包的 骁龙410 随身 WiFi 设备。&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;操作流程&#34;&gt;操作流程&#xA;&lt;/h2&gt;&lt;h3 id=&#34;1-fork-仓库并克隆到本地&#34;&gt;1. Fork 仓库并克隆到本地&#xA;&lt;/h3&gt;&lt;p&gt;Fork &lt;a class=&#34;link&#34; href=&#34;https://github.com/kinsamanka/OpenStick-Builder&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;kinsamanka/OpenStick-Builder&lt;/a&gt; 到自己的 GitHub 账号。&#xA;注意：Fork 时&lt;strong&gt;取消勾选「仅复制 main 分支」&lt;/strong&gt;，我们需要 alpine 分支。&lt;/p&gt;&#xA;&lt;p&gt;Fork 完成后把 alpine 分支克隆到本地（建议将 Fork 后的仓库地址告诉 Agent，由 Agent 完成克隆，避免分支选错等问题）。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;克隆 https://github.com/kinsamanka/OpenStick-Builder 的 alpine 分支到本地，先不要改代码，阅读这个项目结构，说明主要目录、使用方式&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;这里的项目地址需要替换为你 Fork 后的仓库地址&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;2-准备工作区&#34;&gt;2. 准备工作区&#xA;&lt;/h3&gt;&lt;p&gt;在工作区放两个文件夹：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;工作区/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├── OpenStick-Builder/    ← 克隆的项目（alpine 分支）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└── 刷机包/               ← 你的设备的完整 Debian 刷机包（含 boot.img、rootfs.img等）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;刷机包就是你设备当前能用的那个 Debian 刷机包。&lt;/p&gt;&#xA;&lt;h3 id=&#34;3-复制提示词发送给-agent&#34;&gt;3. 复制提示词，发送给 Agent&#xA;&lt;/h3&gt;&lt;p&gt;打开你的 AI Agent，把工作区两个文件夹都加进去，然后复制发送下面的提示词（系统配置按需修改）：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;31&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;32&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;33&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;34&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;35&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;36&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;37&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;38&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;39&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;请先不要改代码，先阅读 OpenStick-Builder 项目代码，理解项目结构。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;背景：&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 刷机包文件夹里是一个可用的 Debian 一键刷机包（MSM8916 平台）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 项目代码里已经有完整的构建脚本（alpine 分支）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 我需要你帮我把这套构建适配到我的设备&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;你要做的事：&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;1. 从刷机包的 rootfs.img 里提取内核模块（/lib/modules/ 整个目录）和WiFi 固件（/lib/firmware/ 下的 wcnss.b00-b11、wcnss.mdt、wlan/prima/WCNSS_qcom_wlan_nv.bin、mba.mbn、qcom/a300_*.fw、qcom/venus-1.8/），放到项目的 prebuilt/&amp;lt;设备名&amp;gt;/ 对应目录。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2. 从刷机包复制底层固件（aboot.bin、gpt_both0.bin、hyp.mbn、rpm.mbn、sbl1.mbn、tz.mbn 等）到 prebuilt/&amp;lt;设备名&amp;gt;/，供 extract_fw.sh 使用。如果刷机包里没有这些文件，可以从工作流中去掉 extract_fw.sh 步骤。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;3. 修改构建脚本（alpine_rootfs.sh、extract_fw.sh），把里面的路径改为 prebuilt/&amp;lt;设备名&amp;gt;/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;4. 内核模块的目标目录名必须和内核版本字符串完全一致（从 /lib/modules/ 下的目录名获取）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;5. 修改主机名、root 密码为我指定的值&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;6. 修改 .github/workflows/build.yml 里的 artifact 名称为我的设备名&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;核心规则（违反会导致设备变砖）：&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 绝对不要修改、重新打包、或重新生成 boot.img&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- boot.img 直接使用刷机包里的原始文件&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 我们只构建 rootfs.img，boot.img 由刷机包提供&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;系统配置：&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 主机名：OpenStick&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- root 密码：password&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- SSH：PermitRootLogin yes，host keys 在宿主机用 ssh-keygen 预生成&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- USB 网络：NCM gadget，VID=0x1D6B PID=0x0104，IP 192.168.5.1/24 shared&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- WiFi 热点：SSID Openstick，密码 12345678，IP 192.168.4.1/24 shared&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- WiFi 模块自动加载：/etc/modules-load.d/wcnss.conf 写入 qcom_wcnss_pil&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 首次启动自动扩容：/etc/local.d/resize-rootfs.start，&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  用 awk &amp;#39;$2 == &amp;#34;/&amp;#34; {print $1}&amp;#39; /proc/mounts 获取根设备，resize2fs 扩容&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 不需要 ModemManager（不插 SIM 卡）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 频率由内核 schedutil 动态管理，不需要额外配置&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 需要安装 e2fsprogs-extra（提供 resize2fs）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- rc-update add local default（否则 local.d 脚本不执行）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;构建环境：GitHub Actions ubuntu-latest，qemu-aarch64-static 交叉构建。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Alpine v3.24，postmarketos 仓库 v25.12（msm-firmware-loader、rmtfs）。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rootfs 镜像：512MB ext4，分区标签 rootfs，img2simg 转 sparse。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;完成后请检查所有改动是否完整一致，给我总结完成情况。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;h3 id=&#34;4-agent-完成后推送到仓库&#34;&gt;4. Agent 完成后，推送到仓库&#xA;&lt;/h3&gt;&lt;p&gt;Agent 改完代码后，把改动提交并推送到你 Fork 仓库的 alpine 分支。&#xA;也可以直接让 Agent 完成提交和推送。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;提交代码至 Github 仓库的 alpine 分支，并根据当前 git diff，生成一条清晰的 commit message。&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;h3 id=&#34;5-触发-github-actions-构建&#34;&gt;5. 触发 GitHub Actions 构建&#xA;&lt;/h3&gt;&lt;p&gt;打开你 Fork 的仓库页面 → Actions（操作） → 对应的工作流 → Run workflow（运行工作流程） → 选 alpine 分支 → 点绿色按钮。&lt;/p&gt;&#xA;&lt;p&gt;等构建完成（大约 2 分钟），刷新页面，底部会多出一个 Artifact（附件）。下载附件到本地，里面有构建出的 rootfs.img。&#xA;如果报错就带着日志发给 Agent ，让他修复后重新推送和触发构建。&lt;/p&gt;&#xA;&lt;h3 id=&#34;6-处理产物&#34;&gt;6. 处理产物&#xA;&lt;/h3&gt;&lt;p&gt;把下载的附件解压，将 rootfs 复制到刷机包文件夹里，替换原来的 rootfs 。&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;注意与刷机包的 rootfs 后缀保持一致，如附件中的 rootfs 为 &lt;code&gt;.bin&lt;/code&gt; 格式，但是实际刷机包中为 &lt;code&gt;.img&lt;/code&gt; 格式，就需要将附件中的 rootfs 修改为 &lt;code&gt;.img&lt;/code&gt; 格式。&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;h3 id=&#34;7-刷机&#34;&gt;7. 刷机&#xA;&lt;/h3&gt;&lt;p&gt;运行刷机包原有的脚本刷入即可。&lt;/p&gt;&#xA;&lt;p&gt;刷入完毕后，Windows 设备管理器里出现「Linux Foundation NCM」网卡即说明启动成功。然后 &lt;code&gt;ssh root@192.168.5.1&lt;/code&gt; 登录。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;验证是否成功&#34;&gt;验证是否成功&#xA;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;设备管理器出现 PID:0104 → 正常&lt;/li&gt;&#xA;&lt;li&gt;设备管理器出现 PID:9006 → 内核未启动，检查 boot.img 是否为刷机包原始文件&lt;/li&gt;&#xA;&lt;li&gt;能 ping 通 192.168.5.1 → USB 网络正常&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;出问题怎么办&#34;&gt;出问题怎么办&#xA;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;设备变砖：进入 9008 模式擦除 boot 分区，设备即可自动进入 fastboot 模式&lt;/li&gt;&#xA;&lt;li&gt;SSH 连不上但设备管理器有 NCM 网卡：等 30 秒再试，首次启动要生成熵和扩容&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
        </item><item>
            <title>Tiku-cfw：基于 Cloudflare Worker 的 AI 题库服务</title>
            <link>/projects/tiku-cfw/</link>
            <pubDate>Sat, 18 Jul 2026 00:00:00 +0000</pubDate>
            <guid>/projects/tiku-cfw/</guid>
            <description>&lt;p&gt;Tiku-cfw 是一个部署在 Cloudflare Workers 上的 AI 题库服务。它兼容 &lt;a class=&#34;link&#34; href=&#34;https://docs.ocsjs.com&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;OCS 网课助手&lt;/a&gt; 的 AnswererWrapper 规范，接收来自 OCS 脚本的搜题请求，先查本地缓存（D1 数据库），命中则直接返回；未命中则调用 AI 模型获取答案，并自动将结果写入缓存。&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;核心思路：用 AI 模型做题，用缓存省钱。同一道题只消耗一次 Token，之后所有请求都走缓存，响应速度极快。&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;为什么做这个&#34;&gt;为什么做这个&#xA;&lt;/h2&gt;&lt;p&gt;OCS 网课助手需要对接题库才能自动答题，但公共题库覆盖率有限，自建题库又需要服务器和运维。Tiku-cfw 利用 Cloudflare Workers 的免费额度和 D1 数据库，实现了零成本、零运维的 AI 题库方案。&lt;/p&gt;&#xA;&lt;p&gt;AI 模型负责&amp;quot;做题&amp;quot;，D1 负责&amp;quot;记住答案&amp;quot;。第一次遇到新题时调用模型（稍慢），之后同一道题直接走缓存秒回。题目经过归一化处理后做精确哈希匹配，缓存永不过期。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;核心特性&#34;&gt;核心特性&#xA;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;OCS 兼容&lt;/strong&gt;：完全遵循 AnswererWrapper 规范，在 OCS 脚本中填入配置即可使用，无需额外适配。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;AI 多渠道调度&lt;/strong&gt;：支持文本模型和视觉模型两类渠道，按权重调度、最少使用优先轮询，渠道故障自动禁用降级。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;智能缓存&lt;/strong&gt;：题目归一化后精确匹配，命中即返回，永不过期。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;图片题目支持&lt;/strong&gt;：包含图片的题目自动路由到视觉模型渠道处理。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Web 管理面板&lt;/strong&gt;：仪表盘统计、题库管理、API Key 管理、AI 渠道配置、搜索日志，一应俱全。支持深色/浅色主题。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;零成本部署&lt;/strong&gt;：Cloudflare Workers 免费额度 + D1 免费额度 + GitHub Actions 自动部署，不花一分钱。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;技术栈&#34;&gt;技术栈&#xA;&lt;/h2&gt;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;层级&lt;/th&gt;&#xA;          &lt;th&gt;技术&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;运行时&lt;/td&gt;&#xA;          &lt;td&gt;Cloudflare Workers&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;数据库&lt;/td&gt;&#xA;          &lt;td&gt;D1（SQLite）&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;AI 接口&lt;/td&gt;&#xA;          &lt;td&gt;OpenAI 兼容 API&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;后端语言&lt;/td&gt;&#xA;          &lt;td&gt;TypeScript&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;前端&lt;/td&gt;&#xA;          &lt;td&gt;Tailwind CSS + 原生 JS SPA&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;部署&lt;/td&gt;&#xA;          &lt;td&gt;GitHub Actions → Cloudflare Workers&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;工作流程&#34;&gt;工作流程&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;OCS 脚本发起搜题请求&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  → Worker 接收，归一化题目文本&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  → 计算哈希，查询 D1 缓存&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  → 命中 → 直接返回答案（毫秒级）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  → 未命中 → 选择 AI 渠道（按权重 + 最少使用）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;           → 有图片？路由到视觉模型&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;           → 调用模型获取答案&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;           → 写入 D1 缓存&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;           → 返回答案&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;渠道调度策略：多渠道按权重分配请求，同渠道内多 Key 轮询，优先使用调用次数最少的 Key。某渠道连续失败后自动禁用，避免浪费请求。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;部署与使用&#34;&gt;部署与使用&#xA;&lt;/h2&gt;&lt;p&gt;项目推荐通过 GitHub Actions 自动部署，全程在浏览器中操作，无需安装任何命令行工具。大致流程：Fork 仓库 → 创建 D1 数据库 → 配置 GitHub Secrets → 运行迁移 → 推送触发部署。&lt;/p&gt;&#xA;&lt;p&gt;也支持命令行部署（wrangler）和本地开发调试。&lt;/p&gt;&#xA;&lt;p&gt;部署完成后，在管理面板中配置 AI 渠道和 API Key，复制 OCS 配置 JSON 粘贴到网课助手脚本中即可开始使用。&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;详细的分步部署指南、API 文档、管理面板使用说明都在仓库 README 中。&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;项目地址&#34;&gt;项目地址&#xA;&lt;/h2&gt;&lt;p&gt;GitHub：&lt;a class=&#34;link&#34; href=&#34;https://github.com/EchoPing07/Tiku-cfw&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://github.com/EchoPing07/Tiku-cfw&lt;/a&gt;&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>kgcheckin：酷狗概念版 VIP 每日自动签到</title>
            <link>/projects/kgcheckin/</link>
            <pubDate>Fri, 10 Jul 2026 00:00:00 +0000</pubDate>
            <guid>/projects/kgcheckin/</guid>
            <description>&lt;p&gt;酷狗概念版每天可以免费领取 VIP，但需要手动打开 App 听歌、看广告才能完成签到。kgcheckin 把这套流程脚本化，挂到青龙面板上每天自动跑，从此不用再惦记这件事。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;为什么做这个&#34;&gt;为什么做这个&#xA;&lt;/h2&gt;&lt;p&gt;酷狗概念版的 VIP 领取需要每天手动操作：打开 App → 听歌 → 看广告。一天不操作就断签，多账号更是折磨。作为一个青龙面板用户，把这件事自动化是最自然的选择。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;核心特性&#34;&gt;核心特性&#xA;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;每日自动签到&lt;/strong&gt;：自动完成听歌任务与广告任务，无需手动打开 App。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;多账号支持&lt;/strong&gt;：一份环境变量配置多个账号（&lt;code&gt;@&lt;/code&gt; 分隔），一次任务全部签到。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Token 自动续期&lt;/strong&gt;（可选）：配置青龙 OpenAPI 凭证后，每周日自动刷新 token 并回写环境变量，长期免维护。未配置则跳过刷新，避免 token 提前失效。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;日志脱敏&lt;/strong&gt;：昵称、用户 ID 等敏感信息在日志中自动打码（如 &lt;code&gt;张**三&lt;/code&gt;、&lt;code&gt;204***16&lt;/code&gt;），token 显示为 &lt;code&gt;[REDACTED]&lt;/code&gt;。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;通知推送&lt;/strong&gt;：复用青龙内置的 &lt;code&gt;sendNotify&lt;/code&gt;，签到结果直达你已配置的通知渠道（Server 酱、Telegram、企业微信等）。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;零 HTTP 服务&lt;/strong&gt;：脚本以函数调用方式直接请求接口，不启动任何常驻服务，内存占用极低。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;工作原理&#34;&gt;工作原理&#xA;&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;青龙定时任务触发（每天凌晨 1:10）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  → 读取 KUGOU_CK 环境变量，解析出所有账号&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  → 逐账号验证 token 有效性&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  → 调用听歌接口领取 VIP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  → 调用广告接口领取 VIP（多次）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  → 查询 VIP 到期时间&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  → 汇总结果，发送通知&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  → （每周日）刷新 token → 通过 OpenAPI 写回环境变量 → 校验&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;API 签名和加密模块基于 &lt;a class=&#34;link&#34; href=&#34;https://github.com/MakcRe/KuGouMusicApi&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;MakcRe/KuGouMusicApi&lt;/a&gt;，包含 MD5、AES、RSA 等酷狗接口所需的加解密逻辑。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;token-续期机制&#34;&gt;Token 续期机制&#xA;&lt;/h2&gt;&lt;p&gt;酷狗的 token 会过期，过期后必须重新抓包。配置自动续期后，脚本每周日运行时会自动刷新 token 并通过青龙 OpenAPI 写回 &lt;code&gt;KUGOU_CK&lt;/code&gt; 环境变量。&lt;/p&gt;&#xA;&lt;p&gt;写回后会再次读取进行校验。如果校验失败（权限不足、网络抖动等），脚本会通过通知渠道把新 token 推送给你，方便手动更新，避免账号断签。&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;不配置 OpenAPI 凭证时，脚本不会刷新 token，当前 token 在有效期内可以一直正常使用。&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;技术栈&#34;&gt;技术栈&#xA;&lt;/h2&gt;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;项目&lt;/th&gt;&#xA;          &lt;th&gt;说明&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;运行时&lt;/td&gt;&#xA;          &lt;td&gt;Node.js（青龙面板内置）&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;依赖&lt;/td&gt;&#xA;          &lt;td&gt;仅 axios&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;加密&lt;/td&gt;&#xA;          &lt;td&gt;MD5 / AES / RSA（酷狗接口签名）&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;部署&lt;/td&gt;&#xA;          &lt;td&gt;青龙面板订阅管理&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;通知&lt;/td&gt;&#xA;          &lt;td&gt;青龙 sendNotify&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;部署与使用&#34;&gt;部署与使用&#xA;&lt;/h2&gt;&lt;p&gt;整体流程：在青龙面板添加仓库订阅 → 安装 axios 依赖 → 抓包获取 userid 和 token → 配置 &lt;code&gt;KUGOU_CK&lt;/code&gt; 环境变量 → 创建定时任务。&lt;/p&gt;&#xA;&lt;p&gt;抓包工具推荐：iOS 用 Stream 或 Shadowrocket，Android 用 HttpCanary 或 Packet Capture。过滤 &lt;code&gt;gateway.kugou.com&lt;/code&gt; 域名，从请求的 Cookie 或 Header 中提取 &lt;code&gt;userid&lt;/code&gt; 和 &lt;code&gt;token&lt;/code&gt;。&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;详细的分步部署指南、环境变量说明、常见问题排查都在仓库 README 中。&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;常见问题速览&#34;&gt;常见问题速览&#xA;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;error_code 130012 / 20028 / 30002&lt;/strong&gt;：这些是&amp;quot;今日已完成&amp;quot;的正常状态码，不是错误。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Cannot find module &amp;lsquo;axios&amp;rsquo;&lt;/strong&gt;：依赖没装好，回青龙「依赖管理」重新安装。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;多账号只有第一个成功&lt;/strong&gt;：检查 &lt;code&gt;KUGOU_CK&lt;/code&gt; 格式，账号内部用 &lt;code&gt;#&lt;/code&gt;，账号之间用 &lt;code&gt;@&lt;/code&gt;，不要有多余空格。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;相关链接&#34;&gt;相关链接&#xA;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;项目仓库：&lt;a class=&#34;link&#34; href=&#34;https://github.com/EchoPing07/kgcheckin&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;EchoPing07/kgcheckin&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;API 签名模块致谢：&lt;a class=&#34;link&#34; href=&#34;https://github.com/MakcRe/KuGouMusicApi&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;MakcRe/KuGouMusicApi&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;本项目仅用于个人学习与自动化自己的账号签到，请勿用于任何商业用途或批量薅羊毛。&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;</description>
        </item><item>
            <title>Esurfing-go-webui：带 Web 管理界面的天翼校园网认证客户端</title>
            <link>/projects/esurfing-go-webui/</link>
            <pubDate>Sat, 30 May 2026 00:00:00 +0000</pubDate>
            <guid>/projects/esurfing-go-webui/</guid>
            <description>&lt;p&gt;很多学校的天翼校园网需要客户端认证才能上网，原版 &lt;a class=&#34;link&#34; href=&#34;https://github.com/DreamwareN/Esurfing-go&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Esurfing-go&lt;/a&gt; 已经能用命令行完成认证和心跳保活，但配置多张网卡、查看运行状态时仍然离不开手敲命令和编辑配置文件。&lt;/p&gt;&#xA;&lt;p&gt;Esurfing-go-webui 在它的基础上加了一层 Web 管理界面，把多网卡管理、实时日志、会话恢复这些常用功能做成了可视化操作。单二进制零依赖，下载即用。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;解决什么问题&#34;&gt;解决什么问题&#xA;&lt;/h2&gt;&lt;p&gt;一台设备（软路由、随身 WiFi、宿舍小主机）上往往有多张网卡，每张网卡可能对应不同的认证账号。原版只能靠命令行和配置文件管理，状态不直观，出问题要翻日志；进程崩溃或重启后认证状态丢失，需要重新登录。&lt;/p&gt;&#xA;&lt;p&gt;Esurfing-go-webui 针对这些痛点，提供了浏览器里就能完成所有操作的管理面板。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;相比原版的增强&#34;&gt;相比原版的增强&#xA;&lt;/h2&gt;&lt;h3 id=&#34;web-管理面板&#34;&gt;Web 管理面板&#xA;&lt;/h3&gt;&lt;p&gt;响应式设计，手机、平板、电脑都能正常访问。卡片式展示每张网卡的状态，支持启用/禁用、登录/登出/强制登出等操作。系统网卡自动发现，新增网卡时不用手动猜接口名。&lt;/p&gt;&#xA;&lt;h3 id=&#34;会话持久化与恢复&#34;&gt;会话持久化与恢复&#xA;&lt;/h3&gt;&lt;p&gt;认证状态、心跳信息会持久化保存。进程崩溃或重启后自动恢复会话、续上心跳，无需重新走一遍完整的认证流程。&lt;/p&gt;&#xA;&lt;h3 id=&#34;实时日志&#34;&gt;实时日志&#xA;&lt;/h3&gt;&lt;p&gt;通过 SSE（Server-Sent Events）实时推送日志到浏览器，支持按级别过滤。日志落盘持久化，自动清理过期条目，避免磁盘被写满。&lt;/p&gt;&#xA;&lt;h3 id=&#34;认证冷却机制&#34;&gt;认证冷却机制&#xA;&lt;/h3&gt;&lt;p&gt;多接口认证间自动冷却，避免短时间内并发认证导致的冲突和异常。&lt;/p&gt;&#xA;&lt;h3 id=&#34;restful-api&#34;&gt;RESTful API&#xA;&lt;/h3&gt;&lt;p&gt;所有界面操作都有对应的 HTTP API，方便接入自动化脚本、Home Assistant 或其他自研工具。&lt;/p&gt;&#xA;&lt;h3 id=&#34;打包与系统集成&#34;&gt;打包与系统集成&#xA;&lt;/h3&gt;&lt;p&gt;提供 Deb 包（systemd 服务）和 Opkg 包（OpenWrt init 脚本），开箱即用，开机自启。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;认证流程&#34;&gt;认证流程&#xA;&lt;/h2&gt;&lt;p&gt;了解认证流程有助于排查问题：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;HTTP 204 在线检测&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  → 302 重定向（未在线）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  → GetSchoolInfo（获取学校信息）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  → GetEConfig（获取加密配置）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  → GetUserAndAcIP（获取用户与 AC 设备 IP）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  → GetAlgoId（获取算法 ID）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  → NewCipher（构造加密器，支持 AES/3DES/SM4/ZUC/XTEA）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  → GetTicket（获取 ticket）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  → Login（登录认证）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  → 心跳保活&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;会话持久化保存的就是登录后的会话与心跳信息，进程重启后直接续上心跳，跳过前面整套认证流程。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;技术栈&#34;&gt;技术栈&#xA;&lt;/h2&gt;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;项目&lt;/th&gt;&#xA;          &lt;th&gt;说明&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;语言&lt;/td&gt;&#xA;          &lt;td&gt;Go 1.25.3+&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;前端&lt;/td&gt;&#xA;          &lt;td&gt;单文件 HTML（embed 嵌入）&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;加密&lt;/td&gt;&#xA;          &lt;td&gt;SM4 / ZUC 国密算法（gmsm 库）&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;部署&lt;/td&gt;&#xA;          &lt;td&gt;单二进制 / Deb / Opkg&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;平台&lt;/td&gt;&#xA;          &lt;td&gt;Linux / Windows / macOS / OpenWrt&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;支持平台&#34;&gt;支持平台&#xA;&lt;/h2&gt;&lt;p&gt;通过 Go 交叉编译覆盖主流架构：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Linux&lt;/strong&gt;：amd64、arm（v7）、arm64、mips、mipsle、mips64、mips64le、riscv64&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Windows&lt;/strong&gt;：amd64、arm64&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;macOS&lt;/strong&gt;：amd64、arm64&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Deb 包覆盖 amd64、armhf、arm64；Opkg 包覆盖 x86_64、arm_cortex-a9、aarch64、mips_24kc、mipsel_24kc。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;部署与使用&#34;&gt;部署与使用&#xA;&lt;/h2&gt;&lt;p&gt;项目支持预编译二进制、源码构建、Deb 包、Opkg 包等多种部署方式。配置文件为 JSON 格式，支持多网卡独立配置和全局设置。详细的部署步骤、配置字段说明、API 文档都在仓库 README 中。&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;最简部署：从 Releases 下载对应平台的二进制文件，&lt;code&gt;chmod +x&lt;/code&gt; 后直接运行，浏览器访问 &lt;code&gt;http://设备IP:8080&lt;/code&gt; 即可。&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;dns-注意事项&#34;&gt;DNS 注意事项&#xA;&lt;/h2&gt;&lt;p&gt;如果网络环境使用了 DoH（DNS over HTTPS），未认证状态下 DoH 无法工作，会导致认证所需域名解析失败。此时需要在接口配置中手动指定 &lt;code&gt;dns_address&lt;/code&gt;（需带端口号，如 &lt;code&gt;119.29.29.29:53&lt;/code&gt;），一般填写 DHCP 获取的 DNS 地址即可。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;相关链接&#34;&gt;相关链接&#xA;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;项目地址：&lt;a class=&#34;link&#34; href=&#34;https://github.com/EchoPing07/Esurfing-go-webui&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;EchoPing07/Esurfing-go-webui&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;原版项目：&lt;a class=&#34;link&#34; href=&#34;https://github.com/DreamwareN/Esurfing-go&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;DreamwareN/Esurfing-go&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;如果在使用过程中遇到问题，建议先打开 Web 界面的实时日志面板观察认证流程卡在哪一步，再结合上面的认证流程逐步排查。&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>DownOnly：用无害下载流量平衡你的宽带上下行</title>
            <link>/projects/downonly/</link>
            <pubDate>Thu, 12 Feb 2026 00:00:00 +0000</pubDate>
            <guid>/projects/downonly/</guid>
            <description>&lt;p&gt;家里有 NAS 跑 PT 或者做上传服务的朋友，大概率遇到过这种情况：宽带突然被限速，或者接到运营商电话，说你涉嫌&amp;quot;商业 PCDN 经营&amp;quot;。原因很简单——你的上行流量远大于下行，触发了运营商的风控模型。&lt;/p&gt;&#xA;&lt;p&gt;DownOnly 就是为了解决这个问题而生的。它在设定的时间窗口内从公开源下载数据，然后直接丢弃，制造真实但无害的下行流量，把上下行比例拉回正常范围。&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;核心思路：不伪造数据、不修改流量统计，而是产生真实的 HTTP 下载行为。运营商看到的就是正常用户的下载流量。&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;为什么做这个&#34;&gt;为什么做这个&#xA;&lt;/h2&gt;&lt;p&gt;当前宽带运营环境下，NAS 用户、PT 玩家、自建服务用户由于上传流量与下载流量比例异常，容易被运营商的大数据算法误判为&amp;quot;商业 PCDN&amp;quot;行为，后果包括被限速甚至停网、强制签保证书、频繁接到&amp;quot;警告&amp;quot;电话。&lt;/p&gt;&#xA;&lt;p&gt;DownOnly 的立场很明确：不推荐浪费公共网络资源，但也不希望合法合规的行为被套上莫须有的罪名。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;设计原则&#34;&gt;设计原则&#xA;&lt;/h2&gt;&lt;p&gt;整个项目围绕一个目标：&lt;strong&gt;跑了跟没跑一样&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;零磁盘写入&lt;/strong&gt;：所有下载数据直接写入 &lt;code&gt;io.Discard&lt;/code&gt;，不产生任何磁盘 I/O。对闪存设备（棒子、电视盒子）完全友好，不损耗 eMMC 寿命。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;极低资源占用&lt;/strong&gt;：运行内存 6-15MB，进程优先级 nice 19（Linux 最低），&lt;code&gt;GOGC=200&lt;/code&gt; 减少 GC 频率。512MB 内存的设备也能流畅运行，不会跟你的 PT 客户端抢资源。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;不影响其他服务&lt;/strong&gt;：低优先级运行，带宽可限速，时间窗口可配置。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;核心能力&#34;&gt;核心能力&#xA;&lt;/h2&gt;&lt;h3 id=&#34;智能调度&#34;&gt;智能调度&#xA;&lt;/h3&gt;&lt;ul&gt;&#xA;&lt;li&gt;自定义每日运行时间段（支持跨午夜），比如只在凌晨 2 点到 6 点跑&lt;/li&gt;&#xA;&lt;li&gt;每日流量限额区间随机化，避免每天流量一模一样被识别&lt;/li&gt;&#xA;&lt;li&gt;两次下载之间随机休息，也可禁用休息实现连续下载&lt;/li&gt;&#xA;&lt;li&gt;程序重启后自动恢复上次运行状态&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;流量伪装&#34;&gt;流量伪装&#xA;&lt;/h3&gt;&lt;ul&gt;&#xA;&lt;li&gt;内置 4 种主流浏览器 User-Agent 自动轮换&lt;/li&gt;&#xA;&lt;li&gt;多下载源随机切换，单源失败自动重试，全部失败进入休息&lt;/li&gt;&#xA;&lt;li&gt;流量特征接近正常用户浏览行为&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;安全防护&#34;&gt;安全防护&#xA;&lt;/h3&gt;&lt;ul&gt;&#xA;&lt;li&gt;默认仅允许局域网访问 WebUI，需手动开启公网访问&lt;/li&gt;&#xA;&lt;li&gt;下载地址校验：禁止内网/私有地址，DNS 解析后二次校验防止 DNS Rebinding&lt;/li&gt;&#xA;&lt;li&gt;优雅退出：捕获 SIGINT/SIGTERM，退出前自动保存所有数据&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;监控与审计&#34;&gt;监控与审计&#xA;&lt;/h3&gt;&lt;ul&gt;&#xA;&lt;li&gt;实时 Mbps 速率统计 + 30 秒折线图&lt;/li&gt;&#xA;&lt;li&gt;按日记录流量并以柱状图展示，支持按月查看历史&lt;/li&gt;&#xA;&lt;li&gt;日志按天归档，每日上限 1000 条，自动清理 7 天前过期日志&lt;/li&gt;&#xA;&lt;li&gt;数据自动归档本年度，跨年自动清理&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;webui&#34;&gt;WebUI&#xA;&lt;/h3&gt;&lt;ul&gt;&#xA;&lt;li&gt;深色/浅色模式，自动跟随系统主题&lt;/li&gt;&#xA;&lt;li&gt;响应式设计，手机、平板、PC 均可操作&lt;/li&gt;&#xA;&lt;li&gt;所有配置网页端实时修改，无需重启&lt;/li&gt;&#xA;&lt;li&gt;下载地址管理：添加/删除/批量测试可达性&lt;/li&gt;&#xA;&lt;li&gt;日志查看器：按日期切换，实时自动刷新&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;技术栈&#34;&gt;技术栈&#xA;&lt;/h2&gt;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;项目&lt;/th&gt;&#xA;          &lt;th&gt;说明&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;语言&lt;/td&gt;&#xA;          &lt;td&gt;Go 1.22+&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;前端&lt;/td&gt;&#xA;          &lt;td&gt;单文件 HTML（embed 嵌入二进制）&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;部署&lt;/td&gt;&#xA;          &lt;td&gt;systemd / Docker / 一键脚本&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;平台&lt;/td&gt;&#xA;          &lt;td&gt;Linux（x86_64 / ARM64 / ARMv7 / ARMv6）&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;镜像&lt;/td&gt;&#xA;          &lt;td&gt;GHCR + Docker Hub&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;已测试设备&#34;&gt;已测试设备&#xA;&lt;/h2&gt;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;设备&lt;/th&gt;&#xA;          &lt;th&gt;内存&lt;/th&gt;&#xA;          &lt;th&gt;系统&lt;/th&gt;&#xA;          &lt;th&gt;备注&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;骁龙410棒子&lt;/td&gt;&#xA;          &lt;td&gt;512MB&lt;/td&gt;&#xA;          &lt;td&gt;Debian 11&lt;/td&gt;&#xA;          &lt;td&gt;内存占用约 6MB，完全无压力&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;网心云 OEC&lt;/td&gt;&#xA;          &lt;td&gt;2GB&lt;/td&gt;&#xA;          &lt;td&gt;fnOS 1.1.19&lt;/td&gt;&#xA;          &lt;td&gt;Docker 部署，稳定运行&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;部署与使用&#34;&gt;部署与使用&#xA;&lt;/h2&gt;&lt;p&gt;项目提供一键安装脚本、Docker 部署和手动编译三种方式，详细的部署步骤、配置参数说明、API 文档和故障排查指南都在仓库 README 中。&lt;/p&gt;&#xA;&#xA;    &lt;blockquote&gt;&#xA;        &lt;p&gt;一键安装：&lt;code&gt;curl -fsSL https://raw.githubusercontent.com/EchoPing07/DownOnly/main/install.sh | bash&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;安装完成后访问 &lt;code&gt;http://设备IP:8080&lt;/code&gt; 即可进入 WebUI 管理。&lt;/p&gt;&#xA;&#xA;    &lt;/blockquote&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;免责声明&#34;&gt;免责声明&#xA;&lt;/h2&gt;&lt;p&gt;DownOnly 仅用于个人学习和研究目的。它产生的是真实下载流量，不涉及任何数据伪造或网络攻击行为。请合理使用，因使用本工具产生的一切后果由使用者自行承担。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;项目地址：&lt;a class=&#34;link&#34; href=&#34;https://github.com/EchoPing07/DownOnly&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;https://github.com/EchoPing07/DownOnly&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;有问题欢迎提 Issue，也欢迎 Star 支持。&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
