用一台旧手机,把 AI 记账搬进微信

11/6/2026

# 用一台旧手机,把 AI 记账搬进微信

一句话总结:在微信里发「午饭 18」,账就记好了。 全程没写一行代码——每一步都是跟 AI 说一句话。


# 一、为什么做这个

记账 App 我换过很多个,最后都死在同一件事上:打开它的成本太高。

在地铁上买瓶水,要掏出手机、找图标、等启动、点加号、选分类、输金额、点保存。这套动作要七八秒、点二十几次,我坚持三天就放弃了。

但微信是一直开着的。如果记账能变成「发一条消息」,这件事就有救。

所以有了这套方案:一台旧手机当服务器,一个开源记账应用当数据库,微信当输入框,AI 当那个把话翻译成数据的人。

# 二、最终效果

在微信里发:

午饭 18
gg 打车 30 现金
昨天买书 45

AI 会把消息解析成结构化数据,写进账本:

你发的 记成
午饭 18 支出 18.00 · 食品饮料/食品 · 线上支付 · 姐姐
gg 打车 30 现金 支出 30.00 · 交通出行/打车租车 · 现金 · 张哥哥
昨天买书 45 支出 45.00 · 教育学习/书报杂志 · 线上支付 · 姐姐 · 记到昨天

它回你一句就完事:

已记账:18.00 元 | 分类 食品饮料/食品 | 账户 线上支付 | 记录人 姐姐 | 午饭

手机上点开网页,还能看到完整的分类占比、月度趋势、年度对比——因为底下跑的是一个正经的记账系统,不是一个玩具。

# 三、用了哪些开源项目

项目 在这里的角色 地址
dsh-go 把旧手机变成能跑 Linux 和 AI Agent 的环境 github.com/ccch1mneyyy/dsh-Go (opens new window)
dsh-bridge 把微信接进 Agent:消息进、回复出 github.com/wenbin-wb/dsh-bridge (opens new window)
ezBookkeeping 真正存账、算报表的记账系统 github.com/mayswind/ezbookkeeping (opens new window)
Cloudflare Tunnel 把手机里的服务映射到公网域名 github.com/cloudflare/cloudflared (opens new window)
1Panel 一开始想用它,失败告终(见第五节) github.com/1Panel-dev/1Panel (opens new window)

前四个凑齐了这套方案,第五个是踩坑记录。

# 四、整体架构

             微信(你发消息的地方)
                    │
                    ▼
        dsh-bridge 插件(微信 ↔ Agent 的桥)
                    │
                    ▼
   dsh-go —— 旧手机里的 Agent 运行时(Ubuntu proot)
                    │
      ┌─────────────┴──────────────┐
      │ 规则:AGENTS.md             │  ← 用「说话」定义它怎么理解你
      │ 工具:ezbk.py(它自己写)    │  ← 把话变成 API 调用
      └─────────────┬──────────────┘
                    ▼
     ezBookkeeping(单文件 + SQLite,127.0.0.1:8080)
                    ▲
                    │ Cloudflare Tunnel
             https://book.example.com

四个角色各司其职:手机提供算力,插件提供通道,记账应用提供数据,AI 负责中间那层「翻译」。

而中间的翻译层,你不需要写——你只需要告诉它规则。

# 五、准备

  • 一台吃灰的安卓手机(我用的是小米 23049RAD8C,Android 15,8 核 / 15GB 内存)
  • 手机装 dsh-go
  • 一个微信账号(用不常用的小号更合适)
  • 可选:一个托管在 Cloudflare 的域名(只在局域网用可以不准备)

为什么不用 Docker / 1Panel? 我一开始按常规思路装 1Panel,面板本体确实跑起来了,但「应用商店、容器」全废:手机上的 Linux 是 proot 环境,uid 0 是伪造的,没有任何内核权限,Docker 守护进程根本起不来。 这条路我试过、失败了,所以换了个不需要容器的记账应用。如果你也想在这类环境里装东西,记住一条:优先选单文件、自带 SQLite 的应用。

# 六、Step 1:让旧手机跑起来

装好 dsh-go,打开它,等它把 Ubuntu 环境初始化完。能在 App 里执行 Linux 命令就算成功。

补充一个事实:这个环境没有 systemd。所有「开机自启」都得靠手动脚本,手机重启后要拉一次。后面的 AI 会自己处理这件事。

# 七、Step 2:把微信接上

装 dsh-bridge 插件,然后在它的设置里扫码登录微信。发一句「你好」,能收到回复,通道就通了。

这一步有个很省事的做法:dshbase 提供了一个插件目录,装上它之后,你直接跟 AI 说「帮我装 dsh-bridge」,它会自己去目录里找、自己装。

# 八、Step 3:装记账应用(一句话)

对 AI 说:

「帮我在手机上装一个 ezBookkeeping,用 8080 端口。」

然后你就不用管了。它会自己完成这一串事:

  1. 判断手机是 arm64 架构,挑对版本
  2. 从 GitHub 下载对应的二进制包(网络慢它会自己换镜像、开多线程)
  3. 解压到 /opt,改好配置(端口、数据库路径、随机会话密钥)
  4. 把服务拉起来,验证端口能访问
  5. 顺手写一个启动脚本,应对手机重启后服务没了的情况

你要做的只有一件事:等它说「装好了,地址是 http://127.0.0.1:8080」。

这就是「不用关心代码层面」的意思——不是把代码藏起来,而是这件事本来就不该由你来干。

# 九、Step 4:注册账号(这一步交给人)

打开网页,点「创建新账号」,自己设用户名密码。

这一步我不会让 AI 代劳。 密码不该经过任何一个 AI,哪怕它是你自己家的。

注册完顺手做三件事:

  1. 确认本币是 CNY、语言是简体中文
  2. 建好账户。我只要两个:现金 和 线上支付(微信、支付宝、银行卡都算后者)
  3. 想清楚这个实例的密码,别和别处重复

# 十、Step 5:教它记账(一句话)

对 AI 说:

「以后我说花了多少钱,你就帮我记到 ezBookkeeping。默认记线上支付,默认记录人是我(姐姐);消息开头有 gg 就记成张哥哥。」

它会做两件事:

  1. 把这套规则写进 AGENTS.md——这是它每次启动都会读的说明书
  2. 自动把应用接口打通:申请访问令牌、写一个调用脚本、测通一笔再删掉

你不需要知道令牌怎么生成、接口怎么调。你只需要把规则说清楚。

规则说清楚的关键是三件事:

  • 给默认值。「默认线上支付」比「线上支付比较常用」有用一百倍;它只有在你明确说「现金」时才会改
  • 区分用户用标签,不用账户。账户回答「钱从哪出」,标签回答「谁花的」,这两件事别混
  • 允许它补记。「上个月 26 号」「昨天」这类时间,说清楚它就能记到那一天

几轮之后,你的规则大概长这样(是配置,不是代码):

- 默认账户:线上支付;说「现金」才记现金
- 默认记录人:姐姐;消息开头有 gg → 张哥哥
- 补记:说「昨天 / 上个月 26 号」就记到那天
- 分类:吃喝→食品饮料,打车→打车租车,话费→电话费……

然后你就可以开始这样用了:

你说 它记
午饭 18 18.00 · 食品 · 线上支付 · 姐姐
gg 加油 50 现金 50.00 · 私家车费用 · 现金 · 张哥哥
上个月26号买衣服 32.4 32.40 · 衣服 · 线上支付 · 姐姐 · 记到 10-26

# 十一、Step 6:把旧账本导进来(一句话)

对 AI 说:

「我有一份以前记账 App 导出的账本,帮我导进 ezBookkeeping。」

然后把文件发过去,剩下的它处理:

  • 文件后缀是 .xls,但其实是网页表格——它会自己识别,不用你转格式
  • 各家 App 的字段名五花八门——它会读懂哪列是日期、哪列是金额、哪列是分类
  • 分类和标签对不上——它会先按你的规则建好,再导
  • 备注里有换行、金额有正负号——它会在导入前清洗

我这批数据是 7 个文件、6286 笔、跨 42 个月、合计 38.7 万,一次导完。它还顺手把当时混在「其他」里的 183 笔大额支出(房租、水电、数码、母婴)按备注重新归了类。

唯一需要你做的一件事:导之前让它先备份。数据一旦进去,回滚靠的就是那个备份。

# 十二、Step 7:让它能在外网访问

只在家里用,http://192.168.x.x:8080 就够了。想在公司、在外面也能打开,就得上隧道。

Cloudflare Tunnel 的好处:不用公网 IP、不用路由器端口映射、免费、自带 HTTPS。

两条路,任选:

  • 省事版:dsh-bridge 插件面板里就带 Cloudflare 隧道,点一下就有公网地址(临时域名免费,固定域名要绑自己的域名)
  • 正式版:给记账应用单独开一条隧道,绑自己的域名,地址永久不变

如果你自己也用 AI 来做,直接说:「帮我把 8080 端口通过 Cloudflare Tunnel 暴露到 book.example.com。」它会帮你装好、建隧道、绑域名、拉起进程。

安全提醒(这段别跳):

  • 公网开着的时候,把「允许注册」关掉,别让陌生人也注册一个账号
  • 能用 Cloudflare Access 加一层邮箱验证就加
  • 手机上的服务不会自启,重启后要跑一次启动脚本——可以让 AI 把这条也写进规则里
  • 记账接口的令牌等于你账本的钥匙,文件权限别给太宽

# 十三、AI 帮你踩掉的坑

这些都是真实发生过的,但我一次都没动手——它自己发现、自己绕过去:

坑 现象 它怎么处理
1Panel 起不了 Docker 面板能开,容器全废 判断出 proot 没有内核权限,直接换方案
启动脚本报语法错 Syntax error: "(" unexpected 发现 Ubuntu 的 sh 是 dash,换 bash
导入报「分类需手动创建」 导入直接失败 先按原表分类建好,再导
导入报 fewer fields in data row 某条备注里有换行 清洗数据后重导
备注尾巴带怪字符 网页上显示多一个符号 统一做一次文本修复
令牌一直 401 自己造的 token 无效 改用应用自带的命令生成

这张表是整篇文章最值钱的部分。 换个人来做,这些坑每一个都要查半小时。

# 十四、成本与收益

成本:0 元。旧手机本来就要吃灰,Cloudflare Tunnel 免费,电费忽略不计。

收益:

  • 记账成本从「七八秒 + 二十次点击」降到「一句话」
  • 账本不交给任何商业公司,数据在自己手里——SQLite 一个文件,随时备份
  • 想加功能就改规则和脚本,不用等产品经理排期
  • 两个人共用一个实例、用标签区分,比开两个账号省事

# 十五、还能往哪走

这套架构真正的价值不是记账,是 「微信 + 旧手机 + 开源服务 + AI」 这个组合本身。

  • 换成待办应用 → 「明天三点提醒我交材料」
  • 换成家庭库存 → 「冰箱里还有两盒牛奶」
  • 换成 RSS / 稍后读 → 转发一篇文章就自动归档
  • 换成智能家居网关 → 「把客厅灯调暗」

同一个模式:找一个单文件的开源后端,接上 API,用 AGENTS.md 定义说话方式。 换一个后端就能复用。

手机吃灰,可惜了。


本文记录的是真实搭建过程。文中数字(6286 笔 / 38.7 万 / 42 个月)来自实际导入的数据。