[{"content":"十月对我好一点吧，九月一堆破事\n给人办卡没搞清楚，二十几张卡的钱全拿不到 傻鸟校园网，说他草台班子都是夸它了，我都不知道从哪里开始吐槽 校园网换系统了，暑假期间居然没有测试，一直用不了，修到中秋放假都还没有弄好，害我用来一个月的流量，用电脑体验堪比吃屎 校园网换系统，我的全新大粪还没用过就难产了（回校是校园网的 WiFi 已经用不了了，宽带是后面新生开学前一天晚上才换新系统的 总结：当初没有好好学习，来了这么一所破学校\n","permalink":"https://echoping.qzz.io/essays/2026-09-29/","summary":"\u003cp\u003e十月对我好一点吧，九月一堆破事\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e给人办卡没搞清楚，二十几张卡的钱全拿不到\u003c/li\u003e\n\u003cli\u003e傻鸟校园网，说他草台班子都是夸它了，我都不知道从哪里开始吐槽\u003c/li\u003e\n\u003cli\u003e校园网换系统了，暑假期间居然没有测试，一直用不了，修到中秋放假都还没有弄好，害我用来一个月的流量，用电脑体验堪比吃屎\u003c/li\u003e\n\u003cli\u003e校园网换系统，我的全新大粪还没用过就难产了（回校是校园网的 WiFi 已经用不了了，宽带是后面新生开学前一天晚上才换新系统的\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e总结：当初没有好好学习，来了这么一所破学校\u003c/p\u003e","title":"烦死人了"},{"content":"杂鱼暑假又短又没用，这么点长度根本满足不了人家嘛\n你就这么想看到我被长长的学期给凌辱到神志不清，眼睛转圈圈，只会呜呜咽咽的样子，然后自己一个人躲在角落偷偷兴奋\n哇，真是下流死了，竟然会对这种画面兴奋，真是搞不懂你是有什么特殊癖好，总之下次给我有点改变，啊\n","permalink":"https://echoping.qzz.io/essays/2026-08-31/","summary":"\u003cp\u003e杂鱼暑假又短又没用，这么点长度根本满足不了人家嘛\u003c/p\u003e\n\u003cp\u003e你就这么想看到我被长长的学期给凌辱到神志不清，眼睛转圈圈，只会呜呜咽咽的样子，然后自己一个人躲在角落偷偷兴奋\u003c/p\u003e","title":"杂鱼暑假"},{"content":"EchoPing07/Better-Esurfing-For-Android\n目前还是私有仓库，等我回学校测试没问题就开源。\n我忍广东校园那个狗屎app很久了，难用死了，自己上手花了一个星期这样做了一个自己比较满意的。\n目前就差登录算法得回学校后才能测试，目前是和 EchoPing07/Esurfing-go-webui 认证算法一致，但是有几个人和我反馈似乎认证算法更新了，我得回去才能修\u0026hellip;\n","permalink":"https://echoping.qzz.io/essays/2026-08-30/","summary":"\u003cp\u003e\u003ca href=\"https://github.com/EchoPing07/Better-Esurfing-For-Android\"\u003eEchoPing07/Better-Esurfing-For-Android\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e目前还是私有仓库，等我回学校测试没问题就开源。\u003c/p\u003e\n\u003cp\u003e我忍广东校园那个狗屎app很久了，难用死了，自己上手花了一个星期这样做了一个自己比较满意的。\u003c/p\u003e\n\u003cp\u003e目前就差登录算法得回学校后才能测试，目前是和 \u003ca href=\"https://github.com/EchoPing07/Esurfing-go-webui\"\u003eEchoPing07/Esurfing-go-webui\u003c/a\u003e 认证算法一致，但是有几个人和我反馈似乎认证算法更新了，我得回去才能修\u0026hellip;\u003c/p\u003e","title":"全新的大粪就要来了"},{"content":"感觉每次有高级模型的 tokens 时，自己没想法；有想法时，高级模型的 token 又不多\n周末 ZCode 给新用户送了一亿 GLM-5.3 的限时额度，结果我周三、周四、周五疯狂开发 Buddy-2API-Go，感觉把想法都花完了，周末一点想法都没有。这一亿几乎都浪费了\n结果周一我突然又有想法，需要很多 token，只能去用 GLM-5.2 了，呜呜呜\n","permalink":"https://echoping.qzz.io/essays/2026-08-25/","summary":"\u003cp\u003e感觉每次有高级模型的 tokens 时，自己没想法；有想法时，高级模型的 token 又不多\u003c/p\u003e\n\u003cp\u003e周末 ZCode 给新用户送了一亿 GLM-5.3 的限时额度，结果我周三、周四、周五疯狂开发 \u003ca href=\"https://github.com/EchoPing07/Buddy-2API-Go\"\u003eBuddy-2API-Go\u003c/a\u003e，感觉把想法都花完了，周末一点想法都没有。这一亿几乎都浪费了\u003c/p\u003e\n\u003cp\u003e结果周一我突然又有想法，需要很多 token，只能去用 GLM-5.2 了，呜呜呜\u003c/p\u003e","title":"有 Token 时没想法，有想法时没 Token"},{"content":"社区里已有多个把 CodeBuddy 的 AI 服务桥接成 OpenAI 兼容 API 的 Python 项目，Buddy-2API-Go 用 Go 把它们完整重写了一遍，并在单账号的使用场景下把体验打磨得更顺手：一份凭证、一个二进制、一个内置 Web 面板，开箱即用。\n核心思路：用 CodeBuddy / WorkBuddy 的在线 AI 服务作为后端（默认中国端点 copilot.tencent.com，可切换国际端点），对外暴露 OpenAI 兼容的 /v1/chat/completions 接口，任何支持 OpenAI API 的客户端都能直接接入。\n为什么重写成 Go 原版 Python 实现功能完整，但部署依赖 Python 运行时，多实例更吃力。Go 版本把这些痛点一次解决：\n单文件部署：go:embed 把前端面板打进同一个二进制，零外部依赖，复制到服务器就能跑 资源占用低：SQLite 用 modernc.org/sqlite（纯 Go、无 cgo），交叉编译随便出任意平台 依赖极简：仅 chi、modernc.org/sqlite、cron/v3 三个非标准库依赖 项目定位为个人单账号使用，明确不接受「号池」（多账号池 / 多凭证轮询）相关的功能，天然与「轻量、自用」的方向一致。\n核心特性 OpenAI API 兼容：/v1/chat/completions（流式透传 / 非流式聚合）与 /v1/models 端点，可无缝替换 OpenAI API。 模型动态加载：模型列表从上游 /v3/config 实时拉取并缓存，cn / global 两套端点自动适配，不用手动维护。 OAuth 设备流登录：管理后台扫码授权即可绑定账号，token 过期自动刷新，401 时刷新后重试一次。 多 API Key 管理：随机 / 自定义 Key，支持备注、启停、使用量统计。 官方余额查询：实时拉取额度包明细，本地缓存，标注到期 / 临期。 每日自动签到：独立开关，cron 定时或时间范围内随机二选一，失败重试 + 末班兜底（23:50 补签），也可手动领取。 请求仪表盘：请求量、Token、模型分布、Key 用量等聚合统计。 指纹头伪装：出站请求复刻官方 CLI 指纹头，且 chat 请求绝不携带 refresh_token。 工作流程 1 2 3 4 5 6 客户端 → /v1/chat/completions（Bearer sk-xxx） → API Key 校验（常量时间比较） → 转换请求格式，复刻官方 CLI 指纹头 → 请求 CodeBuddy 网关（cn / global 自动适配） → 返回 OpenAI 兼容响应 / SSE 流式透传 → 写入请求日志（仅元信息：模型、token 数、耗时、状态码） 项目不存储对话内容，数据库只保存元信息，日志也不记录请求 / 响应正文。\n技术栈 项目 说明 语言 Go 1.25+ 依赖 仅 chi、modernc.org/sqlite（纯 Go 无 cgo）、cron/v3 存储 SQLite（API Keys / 请求日志 / 缓存） 前端 go:embed 单 HTML，内嵌 Alpine.js + 手写 SVG 图表，无外部依赖 安全 bcrypt 密码哈希、常量时间 API Key 比对 部署 单二进制 / Docker / 预编译 Release 部署与使用 三种方式任选：下载 Releases 预编译二进制（Linux / Windows / macOS 全平台）、Docker 部署（ghcr.io/echoping07/buddy-2api-go），或 Go 1.25+ 源码构建。\n启动后访问管理面板（默认 http://127.0.0.1:10082），默认密码 password 登录后，在「账号」页扫码完成 OAuth 授权，「密钥」页创建 API Key，即可在任意 OpenAI 兼容客户端中使用：\n1 2 3 4 curl http://127.0.0.1:10082/v1/chat/completions \\ -H \u0026#34;Authorization: Bearer sk-...\u0026#34; \\ -H \u0026#34;Content-Type: application/json\u0026#34; \\ -d \u0026#39;{\u0026#34;model\u0026#34;:\u0026#34;auto\u0026#34;,\u0026#34;stream\u0026#34;:true,\u0026#34;messages\u0026#34;:[{\u0026#34;role\u0026#34;:\u0026#34;user\u0026#34;,\u0026#34;content\u0026#34;:\u0026#34;你好\u0026#34;}]}\u0026#39; 默认密码仅用于首次登录，请尽快在管理后台修改（或通过环境变量 BUDDY2API_ADMIN_PASSWORD 指定）。二进制直跑默认只监听 127.0.0.1，公网部署务必放到反代后面并加 TLS。\n安全设计 面向个人使用，内置了多项加固措施：管理密码 bcrypt 哈希存储、API Key 常量时间比对、日志只记元信息不记正文、chat 请求绝不携带 refresh_token、二进制默认仅监听本机回环地址。\n相关链接 项目地址：EchoPing07/Buddy-2API-Go 姊妹项目：Qoder-2API-Go：把 Qoder 的 AI 服务桥接成 OpenAI 兼容 API 本项目仅供学习交流使用。请勿用于绕付费、绕限制或任何可能损害服务提供方利益的行为。\n","permalink":"https://echoping.qzz.io/projects/buddy-2api-go/","summary":"\u003cp\u003e社区里已有多个把 CodeBuddy 的 AI 服务桥接成 OpenAI 兼容 API 的 Python 项目，Buddy-2API-Go 用 Go 把它们完整重写了一遍，并在单账号的使用场景下把体验打磨得更顺手：一份凭证、一个二进制、一个内置 Web 面板，开箱即用。\u003c/p\u003e","title":"Buddy-2API-Go：把 CodeBuddy 的 AI 服务桥接成 OpenAI 兼容 API"},{"content":"社区里现成的文生图 MCP 服务器大多是 stdio 传输方案——每个客户端都要单独配置一遍进程和密钥，如果客户端一多或者多设备环境下就成了配置地狱。\nimage-mcp-hub 换了个思路：它把任意兼容 OpenAI 的文生图接口（/v1/images/generations）封装成一个常驻的 MCP 服务，通过 streamable HTTP 暴露出来，所有 Agent 共用一份配置，改一处全局生效。\n核心思路：做一个 MCP 中间层。上游接口无论返回 URL 还是 base64，都由它统一下载、解码、保存为本地文件，Agent 拿到的永远是一个可以直接访问的本地图片链接。\n解决什么问题 多客户端共享：多个 MCP 客户端共用同一批模型，无需为每个客户端单独配置 stdio 进程与密钥；客户端仅支持 HTTP 传输的也能接入。 统一管理：Web 界面统一管理模型增删、API key 轮换与用量统计，修改后对所有 Agent 即时生效。 抹平上游差异：上游返回形态不一（部分返回 URL、部分返回 base64），中间层统一处理，Agent 无需关注差异。 核心特性 单端口多路径：/mcp（MCP 端点）、/admin（Web 管理端）、/images/（图片访问）复用同一 HTTP 服务。 模型即工具：每个已配置模型对应一个 MCP 工具，工具名使用自定义 alias，支持按需增删。 参数透传：prompt 必填，size / n / quality / style / background / output_format 可选，均原样转发至上游。 response_format 内部处理：上游返回 url 时由中间层下载，返回 b64_json 时由中间层解码，统一保存为本地文件；扩展名按图片实际字节判定，与 output_format 无关。 API key 轮询：每个模型的 key 列表 round-robin 轮询，游标在内存推进、定时与退出时惰性落盘。 配置热加载：token、密码、清理规则、模型列表修改后即时生效，无需中断连接。 Web 管理端：中英双语、深浅主题、仪表盘（请求统计 / 趋势图 / 最近调用）、模型增删改查、图片浏览与全局设置。 统计持久化：请求统计定期写入 data/stats.json，重启后数据不丢失。 架构 1 2 3 4 5 6 7 8 9 10 11 12 Agents (A / B / Claude Code / Cursor / ...) │ │ POST /mcp · Authorization: Bearer \u0026lt;mcp_token\u0026gt; ▼ image-mcp-hub (:12300 · Go · MCP) │ 端点：/mcp (MCP·Bearer) · /admin (Web·密码) · /images/ (公开) │ ├── POST /v1/images/generations ─────► OpenAI 兼容上游 │ 上游返回 url → 中间层下载 / b64_json → 中间层解码 │ ├── 保存图片 + sidecar .meta.json ──► ./data/images/ └── 写请求统计 ────────────────────► ./data/stats.json 图片按 20060102-150405_uuid.png 命名，sidecar 元数据记录模型名、prompt、参数、上游信息；清理支持按时间（max_age_days）和按数量（max_count）两条独立规则，均设为 0 时永久留存。\n技术栈 项目 说明 语言 Go 协议 MCP streamable HTTP 上游 OpenAI 兼容文生图接口 前端 管理端 SPA（go:embed 打包进二进制） 存储 本地文件 + JSON 统计持久化 部署 单二进制 / Docker（GHCR，linux/amd64 + arm64） 部署与使用 go build 后直接运行，或使用 Docker 镜像（配置、图片、统计统一存于卷 /app/data）。首次启动自动生成默认 config.json。\n在管理端「模型」页面添加模型（alias、model_id、base_url、api_keys），即可供 Agent 调用。客户端接入把端点指向 /mcp 并携带 Bearer token 即可，Claude Desktop 填 claude_desktop_config.json，Claude Code 用 claude mcp add --transport http。\n默认密码 password 与默认 token sk-123456 仅供本地体验，部署前务必修改。/images/ 无鉴权且默认开启目录列举，公网部署务必在反向代理层添加访问控制并启用 HTTPS。\n常见问题速览 修改端口 / 存储目录为何要重启？ 二者在进程启动时固定；token、密码、清理规则与模型列表走热加载，即时生效。 重命名工具名后历史统计还在吗？ 在。统计以模型创建时分配的 UUID 为键，与工具名、模型 id 解耦，升级旧版本时历史数据会自动迁移。 不同渠道同 model id 怎么统计？ 各自独立计数，仪表盘以 model_id · 工具名 分行展示。 上游无法识别的参数会如何处理？ 原样透传，由上游自行忽略；response_format 由中间层接管。 key 轮询遇到失效的 key 会怎样？ 错误原样上抛，不做失效标记，可在管理端手动替换。 统计与图片会随仓库推送吗？ 不会，data/ 与 config.json 均已在 .gitignore 中排除。 相关链接 项目地址：EchoPing07/image-mcp-hub 仅支持同步 generations 接口，上游返回 URL 或 base64 两种形态都会被下载/解码为本地文件。\n","permalink":"https://echoping.qzz.io/projects/image-mcp-hub/","summary":"\u003cp\u003e社区里现成的文生图 MCP 服务器大多是 stdio 传输方案——每个客户端都要单独配置一遍进程和密钥，如果客户端一多或者多设备环境下就成了配置地狱。\u003c/p\u003e\n\u003cp\u003eimage-mcp-hub 换了个思路：它把任意兼容 OpenAI 的文生图接口（\u003ccode\u003e/v1/images/generations\u003c/code\u003e）封装成一个常驻的 MCP 服务，通过 streamable HTTP 暴露出来，所有 Agent 共用一份配置，改一处全局生效。\u003c/p\u003e","title":"image-mcp-hub：一个服务，让所有 Agent 共用文生图能力"},{"content":"Qoder2API 是社区里一个把 Qoder 的 AI 服务桥接成 OpenAI 兼容 API 的 Python 项目。Qoder-2API-Go 把它完整重写成 Go 实现，保留了全部核心功能，同时换来了更简单的部署方式和更低的资源占用。\n核心思路：复用 Qoder 的在线 AI 服务作为后端，对外暴露 OpenAI 兼容的 /v1/chat/completions 接口，任何支持 OpenAI API 的客户端都能直接接入，无需为模型单独申请 Key。\n为什么重写成 Go 原版 Python 实现功能完整，但对使用者来说有三个痛点：需要 Python 运行时、依赖安装繁琐、多实例部署吃力。Go 版本一次性解决了这些：\n单文件部署：编译为单一二进制，零外部依赖，复制到服务器就能跑 资源占用低：常驻服务更省内存，适合跑在棒子、小主机这类低配设备上 交叉编译友好：一条命令即可产出任意平台的二进制 核心特性 OpenAI API 兼容：支持 /v1/chat/completions 和 /v1/models 端点，可无缝替换 OpenAI API。 流式响应：支持 SSE 流式输出，打字机式体验不丢失。 多模态支持：支持图片输入。 Tool Calls：支持函数调用。 模型动态加载：自动从网关获取可用模型列表，不用手动维护。 Web 管理面板：中文界面（支持深浅模式），密码登录，支持 API 密钥管理、PAT 配置、模型查看、请求统计（总量 / 成功失败 / 按模型 / 近 24 小时趋势）。 单文件部署：编译为单一二进制，零外部依赖。 支持的模型 显示名称 内部 Key 视觉 Qwen3.8-Max qmodel_preview 支持 Qwen3.7-Max qmodel_latest 不支持 Qwen3.7-Plus qmodel 支持 Qwen3.6-Flash q36fmodel 支持 DeepSeek-V4-Pro dmodel 不支持 DeepSeek-V4-Flash dfmodel 不支持 GLM-5.2 gm51model 不支持 Kimi-K2.7-Code kmodel 支持 MiniMax-M2.7 mmodel 不支持 以上为内置默认列表，实际可用模型以网关动态返回为准。\n工作流程 1 2 3 4 5 6 客户端 → /v1/chat/completions（Bearer sk-xxx） → 密钥校验 + 请求体校验（上限 10 MiB） → 转换请求格式（RSA + AES 混合加密、MD5 签名） → 请求 Qoder 网关（模型动态加载） → 返回 OpenAI 兼容响应 / SSE 流 → 写入请求统计（每 30 秒批量落盘） 收到 SIGINT/SIGTERM 会触发优雅关闭：停止接受新连接、等待在途请求（最长 15 秒）并完成统计最终落盘，避免数据丢失。\n技术栈 项目 说明 语言 Go 1.22+ 依赖 仅 github.com/google/uuid，其余全部标准库 加密 RSA + AES 混合加密、MD5 签名 HTTP 标准库 net/http，SSE 流式响应 存储 JSON 文件持久化，线程安全读写 部署 单二进制 / Docker / 预编译 Release 部署与使用 三种方式任选：直接 go build 编译运行、Docker 部署，或从 Releases 下载预编译二进制。\n启动后访问 http://localhost:10081/admin，用默认密码 password 登录，在「令牌」标签页填入 Qoder PAT，再创建 API 密钥即可调用：\n1 2 3 4 curl http://localhost:10081/v1/chat/completions \\ -H \u0026#34;Authorization: Bearer sk-xxxxxxxx\u0026#34; \\ -H \u0026#34;Content-Type: application/json\u0026#34; \\ -d \u0026#39;{\u0026#34;model\u0026#34;: \u0026#34;Qwen3.7-Max\u0026#34;, \u0026#34;messages\u0026#34;: [{\u0026#34;role\u0026#34;: \u0026#34;user\u0026#34;, \u0026#34;content\u0026#34;: \u0026#34;你好\u0026#34;}], \u0026#34;stream\u0026#34;: true}\u0026#39; 默认密码仅用于首次登录，请立即在「设置」标签页修改。登录失败会按客户端 IP 触发指数退避限流，部署到公网时务必启用 HTTPS 反代。\n安全设计 面向内网/个人使用，内置了多项加固措施：HTTP 超时抵御 slowloris、请求体上限防超大 payload 耗尽内存、登录指数退避限流、API Key 与管理密码恒定时间比较（crypto/subtle）、会话 Cookie HttpOnly + SameSite=Lax、XSS 防护、工具调用索引边界保护。\n相关链接 项目地址：EchoPing07/Qoder-2API-Go 原版项目：fengyinxia/qoder2api 本项目不隶属于 Qoder 或其关联公司，仅供学习交流使用。请勿用于绕付费、绕限制或任何可能损害服务提供方利益的行为。\n","permalink":"https://echoping.qzz.io/projects/qoder-2api-go/","summary":"\u003cp\u003e\u003ca href=\"https://github.com/fengyinxia/qoder2api\"\u003eQoder2API\u003c/a\u003e 是社区里一个把 Qoder 的 AI 服务桥接成 OpenAI 兼容 API 的 Python 项目。Qoder-2API-Go 把它完整重写成 Go 实现，保留了全部核心功能，同时换来了更简单的部署方式和更低的资源占用。\u003c/p\u003e","title":"Qoder-2API-Go：把 Qoder 的 AI 服务桥接成 OpenAI 兼容 API"},{"content":"本教程面向小白，大部分工作都借助如codex，opencode等 AI Agent 工具完成操作。\n利用现成的 Debian 刷机包，只替换 rootfs，得到更轻量的 Alpine 系统。应该适用于所有有可用 Debian 包的 骁龙410 随身 WiFi 设备。\n操作流程 1. Fork 仓库并克隆到本地 Fork kinsamanka/OpenStick-Builder 到自己的 GitHub 账号。 注意：Fork 时取消勾选「仅复制 main 分支」，我们需要 alpine 分支。\nFork 完成后把 alpine 分支克隆到本地（建议将 Fork 后的仓库地址告诉 Agent，由 Agent 完成克隆，避免分支选错等问题）。\n1 克隆 https://github.com/kinsamanka/OpenStick-Builder 的 alpine 分支到本地，先不要改代码，阅读这个项目结构，说明主要目录、使用方式 这里的项目地址需要替换为你 Fork 后的仓库地址\n2. 准备工作区 在工作区放两个文件夹：\n1 2 3 工作区/ ├── OpenStick-Builder/ ← 克隆的项目（alpine 分支） └── 刷机包/ ← 你的设备的完整 Debian 刷机包（含 boot.img、rootfs.img等） 刷机包就是你设备当前能用的那个 Debian 刷机包。\n3. 复制提示词，发送给 Agent 打开你的 AI Agent，把工作区两个文件夹都加进去，然后复制发送下面的提示词（系统配置按需修改）：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 先阅读 OpenStick-Builder 项目代码，理解项目结构。 背景： - 刷机包文件夹里是一个可用的 Debian 一键刷机包（MSM8916 平台） - 项目代码里已经有完整的构建脚本（alpine 分支） - 我需要你帮我把这套构建适配到我的设备 你要做的事： 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/\u0026lt;设备名\u0026gt;/ 对应目录。 2. 从刷机包复制底层固件（aboot.bin、gpt_both0.bin、hyp.mbn、rpm.mbn、sbl1.mbn、tz.mbn 等）到 prebuilt/\u0026lt;设备名\u0026gt;/，供 extract_fw.sh 使用。如果刷机包里没有这些文件，可以从工作流中去掉 extract_fw.sh 步骤。 3. 修改构建脚本（alpine_rootfs.sh、extract_fw.sh），把里面的路径改为 prebuilt/\u0026lt;设备名\u0026gt;/ 4. 内核模块的目标目录名必须和内核版本字符串完全一致（从 /lib/modules/ 下的目录名获取） 5. 修改主机名、root 密码为我指定的值 6. 修改 .github/workflows/build.yml 里的 artifact 名称为我的设备名 核心规则（违反会导致设备变砖）： - 绝对不要修改、重新打包、或重新生成 boot.img - boot.img 直接使用刷机包里的原始文件 - 我们只构建 rootfs.img，boot.img 由刷机包提供 系统配置： - 主机名：OpenStick - root 密码：password - SSH：PermitRootLogin yes，host keys 在宿主机用 ssh-keygen 预生成 - USB 网络：NCM gadget，VID=0x1D6B PID=0x0104，IP 192.168.5.1/24 shared - WiFi 热点：SSID Openstick，密码 12345678，IP 192.168.4.1/24 shared - WiFi 模块自动加载：/etc/modules-load.d/wcnss.conf 写入 qcom_wcnss_pil - 首次启动自动扩容：/etc/local.d/resize-rootfs.start， 用 awk \u0026#39;$2 == \u0026#34;/\u0026#34; {print $1}\u0026#39; /proc/mounts 获取根设备，resize2fs 扩容 - 不需要 ModemManager（不插 SIM 卡） - CPU 调频：使用 ondemand governor /etc/modules-load.d/cpufreq.conf 写入 cpufreq_ondemand /etc/local.d/cpufreq.start 写入： echo ondemand \u0026gt; /sys/devices/system/cpu/cpufreq/policy0/scaling_governor echo 75 \u0026gt; /sys/devices/system/cpu/cpufreq/ondemand/up_threshold echo 20000 \u0026gt; /sys/devices/system/cpu/cpufreq/ondemand/sampling_rate echo 4 \u0026gt; /sys/devices/system/cpu/cpufreq/ondemand/sampling_down_factor chmod +x /etc/local.d/cpufreq.start - 需要安装 e2fsprogs-extra（提供 resize2fs） - rc-update add local default（否则 local.d 脚本不执行） 构建环境：GitHub Actions ubuntu-latest，qemu-aarch64-static 交叉构建。 Alpine v3.24，postmarketos 仓库 v25.12（msm-firmware-loader、rmtfs）。 rootfs 镜像：512MB ext4，分区标签 rootfs，img2simg 转 sparse。 完成后请检查所有改动是否完整一致，给我总结完成情况。 4. Agent 完成后，推送到仓库 Agent 改完代码后，把改动提交并推送到你 Fork 仓库的 alpine 分支。 也可以直接让 Agent 完成提交和推送。\n1 提交代码至 Github 仓库的 alpine 分支，并根据当前 git diff，生成一条清晰的 commit message。 5. 触发 GitHub Actions 构建 打开你 Fork 的仓库页面 → Actions（操作） → 对应的工作流 → Run workflow（运行工作流程） → 选 alpine 分支 → 点绿色按钮。\n等构建完成（大约 2 分钟），刷新页面，底部会多出一个 Artifact（附件）。下载附件到本地，里面有构建出的 rootfs.img。 如果报错就带着日志发给 Agent ，让他修复后重新推送和触发构建。\n6. 处理产物 把下载的附件解压，将 rootfs 复制到刷机包文件夹里，替换原来的 rootfs 。\n注意与刷机包的 rootfs 后缀保持一致，如附件中的 rootfs 为 .bin 格式，但是实际刷机包中为 .img 格式，就需要将附件中的 rootfs 修改为 .img 格式。\n7. 刷机 运行刷机包原有的脚本刷入即可。\n刷入完毕后，Windows 设备管理器里出现「Linux Foundation NCM」网卡即说明启动成功。然后 ssh root@192.168.5.1 登录。\n验证是否成功 设备管理器出现 PID:0104 → 正常 设备管理器出现 PID:9006 → 内核未启动，检查 boot.img 是否为刷机包原始文件 能 ping 通 192.168.5.1 → USB 网络正常 出问题怎么办 设备变砖：进入 9008 模式擦除 boot 分区，设备即可自动进入 fastboot 模式 SSH 连不上但设备管理器有 NCM 网卡：等 30 秒再试，首次启动要生成熵和扩容 ","permalink":"https://echoping.qzz.io/tutorials/26-07-21-openstick-alpine/","summary":"\u003cp\u003e本教程面向小白，大部分工作都借助如codex，opencode等 AI Agent 工具完成操作。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e利用现成的 Debian 刷机包，只替换 rootfs，得到更轻量的 Alpine 系统。应该适用于所有有可用 Debian 包的 骁龙410 随身 WiFi 设备。\u003c/p\u003e","title":"为 骁龙410棒子换上 Alpine 系统"},{"content":"Tiku-cfw 是一个部署在 Cloudflare Workers 上的 AI 题库服务。它兼容 OCS 网课助手 的 AnswererWrapper 规范，接收来自 OCS 脚本的搜题请求，先查本地缓存（D1 数据库），命中则直接返回；未命中则调用 AI 模型获取答案，并自动将结果写入缓存。\n核心思路：用 AI 模型做题，用缓存省钱。同一道题只消耗一次 Token，之后所有请求都走缓存，响应速度极快。\n为什么做这个 OCS 网课助手需要对接题库才能自动答题，但公共题库覆盖率有限，自建题库又需要服务器和运维。Tiku-cfw 利用 Cloudflare Workers 的免费额度和 D1 数据库，实现了零成本、零运维的 AI 题库方案。\nAI 模型负责\u0026quot;做题\u0026quot;，D1 负责\u0026quot;记住答案\u0026quot;。第一次遇到新题时调用模型（稍慢），之后同一道题直接走缓存秒回。题目经过归一化处理后做精确哈希匹配，缓存永不过期。\n核心特性 OCS 兼容：完全遵循 AnswererWrapper 规范，在 OCS 脚本中填入配置即可使用，无需额外适配。 AI 多渠道调度：支持文本模型和视觉模型两类渠道，按权重调度、最少使用优先轮询，渠道故障自动禁用降级。 智能缓存：题目归一化后精确匹配，命中即返回，永不过期。 图片题目支持：包含图片的题目自动路由到视觉模型渠道处理。 Web 管理面板：仪表盘统计、题库管理、API Key 管理、AI 渠道配置、搜索日志，一应俱全。支持深色/浅色主题。 零成本部署：Cloudflare Workers 免费额度 + D1 免费额度 + GitHub Actions 自动部署，不花一分钱。 技术栈 层级 技术 运行时 Cloudflare Workers 数据库 D1（SQLite） AI 接口 OpenAI 兼容 API 后端语言 TypeScript 前端 Tailwind CSS + 原生 JS SPA 部署 GitHub Actions → Cloudflare Workers 工作流程 1 2 3 4 5 6 7 8 9 OCS 脚本发起搜题请求 → Worker 接收，归一化题目文本 → 计算哈希，查询 D1 缓存 → 命中 → 直接返回答案（毫秒级） → 未命中 → 选择 AI 渠道（按权重 + 最少使用） → 有图片？路由到视觉模型 → 调用模型获取答案 → 写入 D1 缓存 → 返回答案 渠道调度策略：多渠道按权重分配请求，同渠道内多 Key 轮询，优先使用调用次数最少的 Key。某渠道连续失败后自动禁用，避免浪费请求。\n部署与使用 项目推荐通过 GitHub Actions 自动部署，全程在浏览器中操作，无需安装任何命令行工具。大致流程：Fork 仓库 → 创建 D1 数据库 → 配置 GitHub Secrets → 运行迁移 → 推送触发部署。\n也支持命令行部署（wrangler）和本地开发调试。\n部署完成后，在管理面板中配置 AI 渠道和 API Key，复制 OCS 配置 JSON 粘贴到网课助手脚本中即可开始使用。\n详细的分步部署指南、API 文档、管理面板使用说明都在仓库 README 中。\n项目地址 GitHub：https://github.com/EchoPing07/Tiku-cfw\n","permalink":"https://echoping.qzz.io/projects/tiku-cfw/","summary":"\u003cp\u003eTiku-cfw 是一个部署在 Cloudflare Workers 上的 AI 题库服务。它兼容 \u003ca href=\"https://docs.ocsjs.com\"\u003eOCS 网课助手\u003c/a\u003e 的 AnswererWrapper 规范，接收来自 OCS 脚本的搜题请求，先查本地缓存（D1 数据库），命中则直接返回；未命中则调用 AI 模型获取答案，并自动将结果写入缓存。\u003c/p\u003e","title":"Tiku-cfw：基于 Cloudflare Worker 的 AI 题库服务"},{"content":"酷狗概念版每天可以免费领取 VIP，但需要手动打开 App 听歌、看广告才能完成签到。kgcheckin 把这套流程脚本化，挂到青龙面板上每天自动跑，从此不用再惦记这件事。\n为什么做这个 酷狗概念版的 VIP 领取需要每天手动操作：打开 App → 听歌 → 看广告。一天不操作就断签，多账号更是折磨。作为一个青龙面板用户，把这件事自动化是最自然的选择。\n核心特性 每日自动签到：自动完成听歌任务与广告任务，无需手动打开 App。 多账号支持：一份环境变量配置多个账号（@ 分隔），一次任务全部签到。 Token 自动续期（可选）：配置青龙 OpenAPI 凭证后，每周日自动刷新 token 并回写环境变量，长期免维护。未配置则跳过刷新，避免 token 提前失效。 日志脱敏：昵称、用户 ID 等敏感信息在日志中自动打码（如 张**三、204***16），token 显示为 [REDACTED]。 通知推送：复用青龙内置的 sendNotify，签到结果直达你已配置的通知渠道（Server 酱、Telegram、企业微信等）。 零 HTTP 服务：脚本以函数调用方式直接请求接口，不启动任何常驻服务，内存占用极低。 工作原理 1 2 3 4 5 6 7 8 青龙定时任务触发（每天凌晨 1:10） → 读取 KUGOU_CK 环境变量，解析出所有账号 → 逐账号验证 token 有效性 → 调用听歌接口领取 VIP → 调用广告接口领取 VIP（多次） → 查询 VIP 到期时间 → 汇总结果，发送通知 → （每周日）刷新 token → 通过 OpenAPI 写回环境变量 → 校验 API 签名和加密模块基于 MakcRe/KuGouMusicApi，包含 MD5、AES、RSA 等酷狗接口所需的加解密逻辑。\nToken 续期机制 酷狗的 token 会过期，过期后必须重新抓包。配置自动续期后，脚本每周日运行时会自动刷新 token 并通过青龙 OpenAPI 写回 KUGOU_CK 环境变量。\n写回后会再次读取进行校验。如果校验失败（权限不足、网络抖动等），脚本会通过通知渠道把新 token 推送给你，方便手动更新，避免账号断签。\n不配置 OpenAPI 凭证时，脚本不会刷新 token，当前 token 在有效期内可以一直正常使用。\n技术栈 项目 说明 运行时 Node.js（青龙面板内置） 依赖 仅 axios 加密 MD5 / AES / RSA（酷狗接口签名） 部署 青龙面板订阅管理 通知 青龙 sendNotify 部署与使用 整体流程：在青龙面板添加仓库订阅 → 安装 axios 依赖 → 抓包获取 userid 和 token → 配置 KUGOU_CK 环境变量 → 创建定时任务。\n抓包工具推荐：iOS 用 Stream 或 Shadowrocket，Android 用 HttpCanary 或 Packet Capture。过滤 gateway.kugou.com 域名，从请求的 Cookie 或 Header 中提取 userid 和 token。\n详细的分步部署指南、环境变量说明、常见问题排查都在仓库 README 中。\n常见问题速览 error_code 130012 / 20028 / 30002：这些是\u0026quot;今日已完成\u0026quot;的正常状态码，不是错误。 Cannot find module \u0026lsquo;axios\u0026rsquo;：依赖没装好，回青龙「依赖管理」重新安装。 多账号只有第一个成功：检查 KUGOU_CK 格式，账号内部用 #，账号之间用 @，不要有多余空格。 相关链接 项目仓库：EchoPing07/kgcheckin API 签名模块致谢：MakcRe/KuGouMusicApi 本项目仅用于个人学习与自动化自己的账号签到，请勿用于任何商业用途或批量薅羊毛。\n","permalink":"https://echoping.qzz.io/projects/kgcheckin/","summary":"\u003cp\u003e酷狗概念版每天可以免费领取 VIP，但需要手动打开 App 听歌、看广告才能完成签到。kgcheckin 把这套流程脚本化，挂到青龙面板上每天自动跑，从此不用再惦记这件事。\u003c/p\u003e","title":"kgcheckin：酷狗概念版 VIP 每日自动签到"},{"content":"很多学校的天翼校园网需要客户端认证才能上网，原版 Esurfing-go 已经能用命令行完成认证和心跳保活，但配置多张网卡、查看运行状态时仍然离不开手敲命令和编辑配置文件。\nEsurfing-go-webui 在它的基础上加了一层 Web 管理界面，把多网卡管理、实时日志、会话恢复这些常用功能做成了可视化操作。单二进制零依赖，下载即用。\n解决什么问题 一台设备（软路由、随身 WiFi、宿舍小主机）上往往有多张网卡，每张网卡可能对应不同的认证账号。原版只能靠命令行和配置文件管理，状态不直观，出问题要翻日志；进程崩溃或重启后认证状态丢失，需要重新登录。\nEsurfing-go-webui 针对这些痛点，提供了浏览器里就能完成所有操作的管理面板。\n相比原版的增强 Web 管理面板 响应式设计，手机、平板、电脑都能正常访问。卡片式展示每张网卡的状态，支持启用/禁用、登录/登出/强制登出等操作。系统网卡自动发现，新增网卡时不用手动猜接口名。\n会话持久化与恢复 认证状态、心跳信息会持久化保存。进程崩溃或重启后自动恢复会话、续上心跳，无需重新走一遍完整的认证流程。\n实时日志 通过 SSE（Server-Sent Events）实时推送日志到浏览器，支持按级别过滤。日志落盘持久化，自动清理过期条目，避免磁盘被写满。\n认证冷却机制 多接口认证间自动冷却，避免短时间内并发认证导致的冲突和异常。\nRESTful API 所有界面操作都有对应的 HTTP API，方便接入自动化脚本、Home Assistant 或其他自研工具。\n打包与系统集成 提供 Deb 包（systemd 服务）和 Opkg 包（OpenWrt init 脚本），开箱即用，开机自启。\n认证流程 了解认证流程有助于排查问题：\n1 2 3 4 5 6 7 8 9 10 HTTP 204 在线检测 → 302 重定向（未在线） → GetSchoolInfo（获取学校信息） → GetEConfig（获取加密配置） → GetUserAndAcIP（获取用户与 AC 设备 IP） → GetAlgoId（获取算法 ID） → NewCipher（构造加密器，支持 AES/3DES/SM4/ZUC/XTEA） → GetTicket（获取 ticket） → Login（登录认证） → 心跳保活 会话持久化保存的就是登录后的会话与心跳信息，进程重启后直接续上心跳，跳过前面整套认证流程。\n技术栈 项目 说明 语言 Go 1.25.3+ 前端 单文件 HTML（embed 嵌入） 加密 SM4 / ZUC 国密算法（gmsm 库） 部署 单二进制 / Deb / Opkg 平台 Linux / Windows / macOS / OpenWrt 支持平台 通过 Go 交叉编译覆盖主流架构：\nLinux：amd64、arm（v7）、arm64、mips、mipsle、mips64、mips64le、riscv64 Windows：amd64、arm64 macOS：amd64、arm64 Deb 包覆盖 amd64、armhf、arm64；Opkg 包覆盖 x86_64、arm_cortex-a9、aarch64、mips_24kc、mipsel_24kc。\n部署与使用 项目支持预编译二进制、源码构建、Deb 包、Opkg 包等多种部署方式。配置文件为 JSON 格式，支持多网卡独立配置和全局设置。详细的部署步骤、配置字段说明、API 文档都在仓库 README 中。\n最简部署：从 Releases 下载对应平台的二进制文件，chmod +x 后直接运行，浏览器访问 http://设备IP:8080 即可。\nDNS 注意事项 如果网络环境使用了 DoH（DNS over HTTPS），未认证状态下 DoH 无法工作，会导致认证所需域名解析失败。此时需要在接口配置中手动指定 dns_address（需带端口号，如 119.29.29.29:53），一般填写 DHCP 获取的 DNS 地址即可。\n相关链接 项目地址：EchoPing07/Esurfing-go-webui 原版项目：DreamwareN/Esurfing-go 如果在使用过程中遇到问题，建议先打开 Web 界面的实时日志面板观察认证流程卡在哪一步，再结合上面的认证流程逐步排查。\n","permalink":"https://echoping.qzz.io/projects/esurfing-go-webui/","summary":"\u003cp\u003e很多学校的天翼校园网需要客户端认证才能上网，原版 \u003ca href=\"https://github.com/DreamwareN/Esurfing-go\"\u003eEsurfing-go\u003c/a\u003e 已经能用命令行完成认证和心跳保活，但配置多张网卡、查看运行状态时仍然离不开手敲命令和编辑配置文件。\u003c/p\u003e","title":"Esurfing-go-webui：带 Web 管理界面的天翼校园网认证客户端"},{"content":"家里有 NAS 跑 PT 或者做上传服务的朋友，大概率遇到过这种情况：宽带突然被限速，或者接到运营商电话，说你涉嫌\u0026quot;商业 PCDN 经营\u0026quot;。原因很简单——你的上行流量远大于下行，触发了运营商的风控模型。\nDownOnly 就是为了解决这个问题而生的。它在设定的时间窗口内从公开源下载数据，然后直接丢弃，制造真实但无害的下行流量，把上下行比例拉回正常范围。\n核心思路：不伪造数据、不修改流量统计，而是产生真实的 HTTP 下载行为。运营商看到的就是正常用户的下载流量。\n为什么做这个 当前宽带运营环境下，NAS 用户、PT 玩家、自建服务用户由于上传流量与下载流量比例异常，容易被运营商的大数据算法误判为\u0026quot;商业 PCDN\u0026quot;行为，后果包括被限速甚至停网、强制签保证书、频繁接到\u0026quot;警告\u0026quot;电话。\nDownOnly 的立场很明确：不推荐浪费公共网络资源，但也不希望合法合规的行为被套上莫须有的罪名。\n设计原则 整个项目围绕一个目标：跑了跟没跑一样。\n零磁盘写入：所有下载数据直接写入 io.Discard，不产生任何磁盘 I/O。对闪存设备（棒子、电视盒子）完全友好，不损耗 eMMC 寿命。 极低资源占用：运行内存 6-15MB，进程优先级 nice 19（Linux 最低），GOGC=200 减少 GC 频率。512MB 内存的设备也能流畅运行，不会跟你的 PT 客户端抢资源。 不影响其他服务：低优先级运行，带宽可限速，时间窗口可配置。 核心能力 智能调度 自定义每日运行时间段（支持跨午夜），比如只在凌晨 2 点到 6 点跑 每日流量限额区间随机化，避免每天流量一模一样被识别 两次下载之间随机休息，也可禁用休息实现连续下载 程序重启后自动恢复上次运行状态 流量伪装 内置 4 种主流浏览器 User-Agent 自动轮换 多下载源随机切换，单源失败自动重试，全部失败进入休息 流量特征接近正常用户浏览行为 安全防护 默认仅允许局域网访问 WebUI，需手动开启公网访问 下载地址校验：禁止内网/私有地址，DNS 解析后二次校验防止 DNS Rebinding 优雅退出：捕获 SIGINT/SIGTERM，退出前自动保存所有数据 监控与审计 实时 Mbps 速率统计 + 30 秒折线图 按日记录流量并以柱状图展示，支持按月查看历史 日志按天归档，每日上限 1000 条，自动清理 7 天前过期日志 数据自动归档本年度，跨年自动清理 WebUI 深色/浅色模式，自动跟随系统主题 响应式设计，手机、平板、PC 均可操作 所有配置网页端实时修改，无需重启 下载地址管理：添加/删除/批量测试可达性 日志查看器：按日期切换，实时自动刷新 技术栈 项目 说明 语言 Go 1.22+ 前端 单文件 HTML（embed 嵌入二进制） 部署 systemd / Docker / 一键脚本 平台 Linux（x86_64 / ARM64 / ARMv7 / ARMv6） 镜像 GHCR + Docker Hub 已测试设备 设备 内存 系统 备注 骁龙410棒子 512MB Debian 11 内存占用约 6MB，完全无压力 网心云 OEC 2GB fnOS 1.1.19 Docker 部署，稳定运行 部署与使用 项目提供一键安装脚本、Docker 部署和手动编译三种方式，详细的部署步骤、配置参数说明、API 文档和故障排查指南都在仓库 README 中。\n一键安装：curl -fsSL https://raw.githubusercontent.com/EchoPing07/DownOnly/main/install.sh | bash\n安装完成后访问 http://设备IP:8080 即可进入 WebUI 管理。\n免责声明 DownOnly 仅用于个人学习和研究目的。它产生的是真实下载流量，不涉及任何数据伪造或网络攻击行为。请合理使用，因使用本工具产生的一切后果由使用者自行承担。\n项目地址：https://github.com/EchoPing07/DownOnly\n有问题欢迎提 Issue，也欢迎 Star 支持。\n","permalink":"https://echoping.qzz.io/projects/downonly/","summary":"\u003cp\u003e家里有 NAS 跑 PT 或者做上传服务的朋友，大概率遇到过这种情况：宽带突然被限速，或者接到运营商电话，说你涉嫌\u0026quot;商业 PCDN 经营\u0026quot;。原因很简单——你的上行流量远大于下行，触发了运营商的风控模型。\u003c/p\u003e","title":"DownOnly：用无害下载流量平衡你的宽带上下行"},{"content":"关于我 一个学园艺的农学生。涉猎的圈子比较广泛，兴趣很杂，例如植物、昆虫、AI、科技等等\n平时还喜欢捡点电子垃圾，玩玩刷机\n我的项目都是 vibe coding 写出来的，目前还没学会古法编程\n关于本站 建这个博客没什么理由——单纯觉得有一个属于自己的网站挺好玩的\n内容以三个栏目为主：\n教程：折腾各种东西的记录 随笔：想到什么写什么 项目：自己 vibe coding 的一些 大粪 小工具 需要说明的是：因为我比较懒，所以本博客大部分文章由 AI 代笔，AI 味可能比较重\n更新频率也比较随缘\n技术栈 Hugo 静态站点生成器 PaperMod 主题 部署在 Cloudflare Pages 访问 主域名 blog.echoping.fun 备用域名 echoping.qzz.io ","permalink":"https://echoping.qzz.io/about/","summary":"\u003ch2 id=\"关于我\"\u003e关于我\u003c/h2\u003e\n\u003cp\u003e一个学园艺的农学生。涉猎的圈子比较广泛，兴趣很杂，例如植物、昆虫、AI、科技等等\u003c/p\u003e\n\u003cp\u003e平时还喜欢捡点电子垃圾，玩玩刷机\u003c/p\u003e\n\u003cp\u003e我的项目都是 vibe coding 写出来的，目前还没学会古法编程\u003c/p\u003e","title":"关于"}]