关联主题:: Ob插件列表
同级:: 2025-11-22_星期六
下一级::

开发工具:Claude Code
开发日志【插件】Obsidian插件:Atracker sync开发日志
开发文件夹Atracker

迁移要求:
1、将Atracker-sync迁移到制定仓库插件文件夹下;
2、将get_atracker_for_obsidian.py 迁移至新仓库更目录;
3、在插件里完成相关设置即可。
4、如果遇到Bug,直接在新仓库使用claude code进行修改即可。

1. 背景与需求

  • 长期使用的工具: ATracker
  • 账号状态变更:
    • 之前持有 Advanced(高级版) 会员:支持多设备同步、网页端访问。
    • 目前持有 Pro(专业版) 会员:仅限本地使用,无官方云端同步功能。
  • 核心痛点:
    • 数据封闭在 App 内部,无法自动化导出。
    • 希望将时间记录数据整合进 Obsidian 的“日记”系统中,实现“时间记录”与“知识/反思”的统一。
  • 数据基础: ATracker 支持将记录同步写入 Apple Calendar(本地日历),这成为了后续方案的突破口。

2. 探索过程与迭代

1.0 方案:Python 脚本抓包(已弃用)

  • 思路: 利用 Advanced 会员期的权限,通过 iOS 抓包工具获取 Cookie/API,结合 AI 编写 Python 脚本。
  • 产出: 能够获取数据并导出为 Excel 表格。
  • 缺陷:
    • 无法自动化运行(需要手动触发)。
    • 数据格式单一(Excel),无法与笔记系统打通。
    • 随着会员降级和方案繁琐,最终停滞。

2.0 方案:尝试直连 API(失败)

  • 工具: Claude Code(CLI 编程助手)。
  • 尝试: 希望通过代码自动从 ATracker 服务器拉取数据直传 Obsidian。
  • 阻碍: API 访问权限受限。Pro 版会员无法访问高级版的高阶数据接口,服务器端获取数据的路径走不通。

3.0 方案:本地日历中转(成功)

  • 核心逻辑: 既然 ATracker 将数据写入了 Apple Calendar,那么直接读取 本地日历数据 即可绕过服务器权限限制。
  • 目标: 开发一个 Obsidian 插件,读取日历,转化为 Markdown 格式写入日记。
  • 开发辅助: 全程使用 Claude Code 与 AI 交互完成代码编写。

3. 插件功能实现细节

最终开发出的 Obsidian 插件具备以下特性:

⚙️ 基础设置 (Settings)

  1. 日记文件夹路径: 指定读取/写入的目标目录。
  2. 文件名格式: 匹配日记的命名规则(如 YYYY-MM-DD)。
  3. 插入锚点 (Target Header): 指定数据写入在哪个标题之下(例如一级标题 # 时间记录)。
  4. 自动同步: 开关选项。
  5. 同步间隔: 设置为 1 分钟。

🚀 核心命令 (Commands)

  1. 同步今日数据 (Sync Today):
    • 无论手动或自动触发,将当天的 ATracker 数据从日历抓取,更新至当日日记的指定标题下。
  2. 同步历史数据 (Sync Historical):
    • 打开任意往期日记文件,执行该命令,插件会读取该文件日期对应的时间记录并回填。

4. Bug 修复记录

Bug #1: 时区转换导致数据不全 (2025-11-25)

问题描述:

  • 同步的时间记录数据不完整,只显示中午 12:34 之后的数据
  • 缺少早上 00:00-12:34 的时间记录

问题原因:
get_atracker_for_obsidian.py 脚本在查询 macOS Calendar 数据库时,时区转换逻辑错误:

  1. macOS Calendar 数据库存储的是 UTC 时间
  2. 原代码直接用本地时间(如 2025-11-24 00:00)转时间戳去查 UTC 数据库
  3. 实际查询范围变成了:
    • UTC 2025-11-24 00:00 到 2025-11-25 00:00
    • 对应本地时间 2025-11-24 08:00 到 2025-11-25 08:00 (UTC+8)
  4. 导致只能查到早上 8 点之后的数据,00:00-08:00 的数据被遗漏

修复方案:
在查询前将本地时间转换为 UTC:

# 修复前(错误):
day_start = datetime(2025, 11, 24, 0, 0)  # 本地时间
start_timestamp = (day_start - mac_epoch).total_seconds()  # 直接转时间戳
 
# 修复后(正确):
day_start_local = datetime(2025, 11, 24, 0, 0)  # 本地时间
day_start_utc = day_start_local - LOCAL_TIMEZONE_OFFSET  # 转 UTC: 2025-11-23 16:00
start_timestamp = (day_start_utc - mac_epoch).total_seconds()  # UTC 时间戳

修复位置: get_atracker_for_obsidian.py 第 37-49 行

修复结果:

  • 现在查询 11-24 的数据时,能够正确查到本地全天 24 小时的所有数据
  • 查询范围: UTC 2025-11-23 16:00 到 2025-11-24 16:00 (对应本地 00:00-24:00)

修复工具: Claude Code
修复日期: 2025-11-25


5. 总结与成果

  • 成功绕过了 ATracker Pro 版的 API 限制。
  • 实现了从”数据孤岛”到”知识库(Obsidian)“的自动化闭环。
  • 验证了使用 Claude Code 辅助开发 Obsidian 插件的高效性。
  • 通过持续的 Bug 修复,确保数据同步的准确性和完整性。