Android 应用,监控 DeepSeek 平台账户余额与 Token 用量,支持桌面小组件。无需 API Key,WebView 登录即可获取全部数据。
| 模块 | 功能 |
|---|---|
| 概览 | 账户余额(含充值入口)、当月消费、近 7 天消费曲线图(日金额标注) |
| 用量 | 模型级用量拆分:请求数、Token、缓存命中率、消费金额 |
| 设置 | WebView 登录 DeepSeek 平台,自动捕获 Token 和余额,可配自动刷新间隔 |
| 桌面小组件 | 余额 + 当月消费 + 当月 Token,无需打开 App |
┌───────────────────────────────────────────────┐
│ UI Layer │
│ main.dart (MultiProvider → 底部导航) │
│ screens/ (Dashboard / UsageDetail / Settings)│
│ widgets/ (BalanceCard / ModelBreakdown) │
└──────────────────┬────────────────────────────┘
│ Consumer / Provider.of
┌──────────────────▼────────────────────────────┐
│ State Layer │
│ providers/ (ConfigProvider / BalanceProvider │
│ / UsageProvider) │
│ services/ (BalanceService / UsageService │
│ / AuthService / WidgetService) │
└──────────────────┬────────────────────────────┘
│ dio
┌──────────────────▼────────────────────────────┐
│ Data Layer │
│ models/ (Balance / Usage) │
│ utils/ (HttpClient / ApiConstants) │
└───────────────────────────────────────────────┘
┌───────────────────────────────────────────────┐
│ Storage & Bridge │
│ flutter_secure_storage → Token + 余额持久化 │
│ SharedPreferences → 小组件数据 │
│ MethodChannel → 小组件实时更新 │
│ WebView JSChannel → Token + 余额捕获 │
└───────────────────────────────────────────────┘
lib/
├── main.dart # 入口、MultiProvider、底部导航
├── models/
│ ├── balance.dart # BalanceResult / BalanceInfo
│ └── usage.dart # UsageResult / UsageDaySummary / UsageModelSummary
├── providers/
│ ├── config_provider.dart # Token + 余额安全存储
│ ├── balance_provider.dart # 余额状态 + 小组件推送
│ └── usage_provider.dart # 用量状态 + 小组件推送
├── screens/
│ ├── dashboard_screen.dart # 概览:余额 + 消费 + 7天曲线图
│ ├── usage_detail_screen.dart # 用量:模型级拆分明细
│ └── settings_screen.dart # 设置:WebView 登录 / 自动刷新
├── services/
│ ├── balance_service.dart # 余额 API(WebView JS 注入)
│ ├── usage_service.dart # 用量 API(Platform 接口)
│ ├── auth_service.dart # Token 验证
│ └── widget_service.dart # 小组件数据推送(MethodChannel)
├── widgets/
│ ├── balance_card.dart # 余额卡片(含充值按钮)
│ ├── model_breakdown.dart # 模型拆分明细卡片
│ ├── usage_chart.dart # 自定义图表 Painter
│ └── theme.dart # 主题配置
└── utils/
├── constants.dart # API 端点 / UA 常量
└── http_client.dart # Dio 封装
仅需一次 WebView 登录,自动从 DeepSeek 平台网页中捕获:
- Token — 拦截
window.fetch/XMLHttpRequest的Authorization: Bearer xxx请求头 - 余额 — 拦截平台页面自身 API 响应中的
total_balance字段 + DOM 正则提取
Token 与余额均持久化到 flutter_secure_storage,App 重启后自动恢复。
| 用途 | 方法 | URL |
|---|---|---|
| 账户余额 | WebView JS 注入 | 页面响应拦截 + DOM 提取 |
| Token 用量 | GET | platform.deepseek.com/api/v0/usage/amount?month=X&year=Y |
| 消费金额 | GET | platform.deepseek.com/api/v0/usage/cost?month=X&year=Y |
- Flutter ≥ 3.38
- JDK 21 / Android SDK 35
flutter pub get
flutter build apk --debug
# → build/app/outputs/flutter-apk/app-debug.apk# 首次:生成签名
keytool -genkey -v -keystore android/upload-keystore.jks \
-keyalg RSA -keysize 2048 -validity 36500 -alias upload \
-storepass <密码> -keypass <密码> -dname "CN=DeepSeek Watch"
# 配置签名
cat > android/key.properties << EOF
storePassword=<密码>
keyPassword=<密码>
keyAlias=upload
storeFile=upload-keystore.jks
EOF
# 构建(按架构分包 + 混淆 + 资源收缩)
flutter build apk --release \
--split-per-abi \
--obfuscate \
--split-debug-info=build/symbols
# 输出
# build/app/outputs/flutter-apk/app-arm64-v8a-release.apk (17.7MB)
# build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk (15.1MB)
# build/app/outputs/flutter-apk/app-x86_64-release.apk (19.2MB)| 手段 | 说明 |
|---|---|
--split-per-abi |
按 CPU 架构分包,用户仅下载所需 |
--obfuscate |
Dart 混淆 + 符号剥离 |
| R8 + ProGuard | Java/Kotlin 收缩 / 优化 / 混淆 |
shrinkResources |
移除未用资源 |
| Tree-shake icons | MaterialIcons 1645KB → 3.4KB |
| 依赖 | 用途 |
|---|---|
dio |
HTTP 客户端 |
provider |
状态管理 |
fl_chart |
图表(折线/柱状) |
flutter_secure_storage |
Token + 余额加密存储 |
webview_flutter |
登录页面 + Token 捕获 |
home_widget |
桌面小组件 |
url_launcher |
跳转充值页面 |
shared_preferences |
小组件数据缓存 |
intl |
日期格式化 |
Flutter (WidgetService)
│ MethodChannel('com.deepseekmonitor/widget')
│ invokeMethod('updateWidget', {balance, monthCost, totalTokens})
▼
MainActivity.kt
│ SharedPreferences("widget_data") 写入
│ AppWidgetManager.updateAppWidget() 立即刷新
▼
DeepSeekWidgetProvider.kt
│ onUpdate → SharedPreferences 读取 → RemoteViews
▼
桌面显示
非 DeepSeek 官方产品,仅用于学习研究。请遵守 DeepSeek 使用条款。Token 加密存储于设备安全区域。