Shalom-Karr/groupme-windows
GitHub: Shalom-Karr/groupme-windows
基于 Tauri 2 和 Rust 构建的 GroupMe Windows 原生桌面客户端,通过本地 SQLite 归档实现离线历史阅读和全文搜索等官方平台缺失的功能。
Stars: 0 | Forks: 0
# 适用于 Windows 的 GroupMe
这是一款使用 Tauri 2 和 Rust 构建的 Windows 原生桌面应用。它将 `https://web.groupme.com` 封装在 WebView2 窗口中,同时后台的 Rust worker 会将群组、私信、消息和媒体存档到本地 SQLite 数据库中。当网络不可用时,窗口会切换到由该存档提供支持的内嵌离线阅读器。
关于这三个部分如何协同工作的完整说明,请参阅 [docs/architecture.md](docs/architecture.md);关于离线状态下哪些功能可用、哪些不可用,请参阅 [docs/offline-behaviour.md](docs/offline-behaviour.md)。
## 要求
### 运行要求
- Windows 10 或 Windows 11
- WebView2 runtime(安装程序内嵌了 bootstrapper,会自动进行安装)
### 构建要求
- Rust 1.77 或更高版本(通过 `Cargo.toml` 中的 `rust-version` 指定)
- Node.js 20 或更高版本
- MSVC Build Tools(C++ 工作负载 —— `rusqlite` 内嵌的 SQLite 必需)
- `@tauri-apps/cli`(通过 `npm install` 自动安装)
## 构建和运行
```
npm install
npm run tauri dev # development build with live reload
npm run tauri build # release build + NSIS installer
```
发布的安装程序位于:
```
src-tauri\target\release\bundle\nsis\GroupMe_0.1.0_x64-setup.exe
```
发布版本的可执行文件本身位于 `src-tauri\target\release\groupme-desktop.exe`。NSIS 安装程序是可分发的制品;原始的可执行文件不包含 runtime WebView2 bootstrapper。
与此同时,还会在 `src-tauri\target\release\bundle\msi\` 目录下构建一个 `.msi` 安装包。
### 请安装 `-setup.exe`,而不是 `.msi`
两者都能用,但并不等同:
| | `-setup.exe` (NSIS) | `.msi` |
|---|---|---|
| 自动更新 | **是** | **否** |
| 需要管理员权限 | 否 | 是 |
| 安装位置 | `%LOCALAPPDATA%` | `Program Files` |
Tauri 仅通过 NSIS 目标生成 updater 制品,因此通过 MSI 安装的版本
永远无法自动更新 —— 必须手动替换。MSI 还是按计算机进行
安装的,这意味着每次都会出现 UAC 提示;updater 是在无人值守下
运行的,无法响应此类提示,因此提权和静默更新是
互斥的。NSIS 构建版本精确地按用户进行安装,正是为了让更新完全
不需要管理员权限。MSI 的存在是为了满足由策略管理的脚本化部署,在这些场景中,本来就有
中央系统负责处理版本控制。
## 工作原理
三个部分共享同一个 SQLite 文件:
1. **在线** — webview 原封不动地加载 `https://web.groupme.com`。GroupMe 的服务器拥有 UI 的控制权,因此发送、上传、回应和表情符号都可以直接使用,无需我们额外开发,且在它们重新部署时也不会出现任何故障。
2. **存档** — 后台的 Rust worker 使用 reqwest 直接调用 `api.groupme.com/v3` 并写入 SQLite。它读取的是 API 而不是 DOM:API 是一个版本化的契约,而标签结构则不是。该 archiver 对 API 的操作是纯只读的;绝对不会发出 `POST`、`PUT` 或 `DELETE` 请求。
3. **离线** — 当连接丢失时,窗口会切换到内嵌的本地阅读器,该阅读器直接从 SQLite 渲染数据,没有任何网络依赖。
完整设计:[docs/architecture.md](docs/architecture.md)。API 参考:[docs/groupme-api.md](docs/groupme-api.md)。
## 离线行为
当网络连接断开时,窗口会切换到本地存档。你可以浏览所有已同步的对话、阅读完整的历史记录、搜索消息文本以及查看已缓存的图片。发送、回应、编辑和删除功能在离线状态下不可用,并且没有发件箱 —— 相关原理说明请参阅 [docs/offline-behaviour.md](docs/offline-behaviour.md)。
## 数据存储位置
所有应用程序数据都位于:
```
%LOCALAPPDATA%\dev.shalomkarr.groupme\
```
| 路径 | 内容 |
|---|---|
| `archive.db` | SQLite 存档:对话、消息、用户、媒体索引 |
| `archive.db-wal` | SQLite WAL 文件(正常现象;应用运行期间请勿删除) |
| `media\` | 下载的媒体数据(图片、视频预览、头像) |
本地存储,非漫游。`%APPDATA%` 是漫游配置文件,加入域的
计算机在登录时会将其同步到服务器 —— 而这个存档的体积可能会达到数个
GB。
要移动或备份存档,请在应用关闭的情况下复制整个目录。
如果仅在应用运行期间复制 `archive.db`,你得到的数据库将会丢失
依然存在于 WAL 中的那些数据。
## 隐私和安全
**Access token。** GroupMe 的 `x-access-token`(一个约 40 个字符的 bearer credential,权限等同于账户密码)存储在 Windows 凭据管理器中,服务名称为 `dev.shalomkarr.groupme`。它绝不会以明文形式写入 SQLite 存档或任何配置文件中。存档中仅存储了 SHA-256 指纹,以便应用能够检测到何时有其他账户登录。
**存档未加密。** `archive.db` 和 `blobs\` 目录是 Windows 用户配置文件下的普通文件。任何拥有你的用户账户或磁盘访问权限的人都可以阅读每一条存档的消息并查看每一张缓存的图片。如果你对此有顾虑,请使用 Windows BitLocker 或同等的全盘加密工具。
**Archiver 是只读的。** 绝不会向 GroupMe API 发出任何写入操作(`POST`、`PUT`、`DELETE`)。该应用无法代你发送消息、删除内容或修改你的账户。离线状态下的只读是结构性的,而不是 UI 的约定 —— 离线界面上根本没有注册任何发送命令。
## 项目结构
```
GroupMe Windows\
├── src-tauri\
│ ├── src\
│ │ ├── lib.rs # Tauri builder, app-level constants
│ │ ├── main.rs # Binary entry point (hides console in release)
│ │ ├── model.rs # Serde types for the GroupMe v3 API wire format
│ │ ├── store.rs # SQLite schema, migrations, all read/write paths
│ │ └── token.rs # Windows Credential Manager wrapper, fingerprinting
│ ├── frontend\
│ │ ├── index.html # Connectivity router (online → web.groupme.com)
│ │ ├── inject.js # Init script: intercepts x-access-token from fetch/XHR
│ │ └── offline.html # Bundled offline reader (in progress)
│ ├── icons\ # App icons for the installer and taskbar
│ ├── Cargo.toml
│ └── tauri.conf.json
├── docs\
│ ├── architecture.md
│ ├── groupme-api.md # API reference from live capture
│ ├── offline-behaviour.md
│ └── schema.md
├── tools\
│ ├── capture_api.py # Selenium-Wire proxy capture tool
│ └── digest_capture.py # Reduces traffic.jsonl to a readable digest
├── package.json
├── LICENSE
└── README.md
```
## 许可证
Copyright (c) 2026 Shalom Karr。**AGPL-3.0-only WITH the Commons Clause。** 源代码可见,但并非开源。
**对于个人、教育、研究及其他非商业用途免费**,但需受 AGPL copyleft 约束:基于此代码的任何副本、修改或衍生作品都必须在相同的条款下发布,包括网络部署的修改。
**商业和企业用途需向作者获取单独的付费许可证。** 无论本软件本身是否被出售,以下每种情况均需获取许可证:
- 盈利性公司或从事商业活动的任何组织的内部使用,或代表其进行的使用
- 部署给员工、承包商、客户或顾客
- 与任何付费产品、服务或支持产品捆绑或一起发布,或在其旁边发布
- 作为托管或托管服务提供
- 在向第三方提供的咨询、代理、承包或托管服务工作中使用
如需申请商业许可证,请在 提交 issue。
**非官方客户端。** GroupMe 是 Microsoft Corporation 的商标。本应用程序为独立开发,未受到 GroupMe 或 Microsoft 的认可、赞助或关联。用户仍受 GroupMe 服务条款的约束。
完整的许可证文本请见 [LICENSE](LICENSE)。
标签:MITM代理, Rust, SQLite, Tauri, 全文搜索, 可视化界面, 桌面客户端, 离线存储, 网络流量审计, 通知系统