自動化操作:依排程推送你的資料
Marrow 可以依你選的頻率,由手機直接把一份健康資料檔 POST 到你指定的任何網址。這個頁面是參考資料:如何設定、每種資料內容長什麼樣子,以及如何寫一個接收它的程式。
n8n、Zapier、Make、Home Assistant、Google Sheets 和 InfluxDB 的現成設定,在連線底下.
所有 Marrow 指南: MCP · 自架鏡像 · 自動化操作 · 檔案 · 支援
什麼是自動化操作
匯出、自動化裡的一項已儲存工作:一種資料、一種格式、一個日期範圍、一個網址、一種頻率。Marrow 從它驗證過的資料庫建立檔案,在 App 關閉時 POST 到該網址,時機是每次同步提交之後,以及每次背景更新時,只要頻率設定的時間已過。沒有任何東西經過我們:手機直接對你的端點傳送。
設定方式
- 「匯出」分頁,自動化:開啟它,再點新增自動化操作。如果是從某個工具的頁面建立的(連線底下的 n8n、Zapier、Home Assistant 等),這個自動化操作會帶有該工具的名稱,並在每個欄位旁說明該工具要填什麼。
- 網址:要 POST 到的 https 網址。標頭:接收端需要的任何標頭(
Authorizationbearer token、X-Gitlab-Token,什麼都可以)。如果工具不需要任何標頭,「新增標題」在「更多選項」底下。 - 資料:健康指標、體能訓練、重訓記錄、營養日記,或症狀與心情,格式為 JSON 或 CSV。一個自動化操作只送一種資料,所以想要幾種就各建一個。每個開啟中的自動化操作都算一個連線:免費方案同一時間可開 1 個連線,Marrow Pro 最多 10 個,AI 和伺服器也包含在內。
- 頻率:每隔幾分鐘、幾小時或幾天。日期範圍、彙總方式和逾時設定都在更多選項底下.
- 立即執行會送出第一筆資料,讓你在等排程之前,先確認接收端沒問題。
日期範圍
- 自上次跑步以來(預設):從上一次成功的執行之後的所有資料,再加上兩天的重疊。HealthKit 在一天結束後還會繼續補資料,所以重疊的部分會重新傳送最近完成的日子。請在你這邊保留每個指標、每一天的最新值,重複的資料就不會有影響。如果接收端停機了一陣子,第一次成功的執行就會補上所有漏掉的日子。
- 今天、過去 7 / 30 / 90 天、去年:固定的滾動區間,每次執行都完整重送。如果你想要能自我修復的快照,而不是增量資料,就選這些。
資料內容的格式
健康指標(每日總計,JSON)
結構和 Health Auto Export 的指標相同(一個 metrics 清單,內含 name、units 和帶有 qty 的 data),所以為那個 App 寫的接收端只需要小幅修改:這裡的日期是單純的日子,不是時間戳記,而且下面的體能訓練和重訓資料內容是 Marrow 自己的格式。數值採用 units 中寫明的儲存單位(kg、m、mL、degC、kcal、count)。心率以每天的 Avg、Min 和 Max 表示,單位是 bpm,睡眠則是每個夜晚及其各階段,以小時計。如果你要英制單位,請在你那邊自行轉換。
{"data": {"metrics": [
{"name": "body_mass", "units": "kg",
"data": [{"date": "2026-09-11", "qty": 81.3}]},
{"name": "step_count", "units": "count",
"data": [{"date": "2026-09-11", "qty": 8746}]},
{"name": "heart_rate", "units": "bpm",
"data": [{"date": "2026-09-11", "Avg": 71, "Min": 52, "Max": 148}]},
{"name": "sleep_analysis", "units": "h",
"data": [{"date": "2026-09-11", "totalSleep": 7.2, "asleep": 7.2, "deep": 1.1, "rem": 1.6, "core": 4.3, "awake": 0.2,
"sleepStart": "2026-09-10 23:36:00 -0400", "sleepEnd": "2026-09-11 07:02:00 -0400"}]}
]}}
原始樣本(原始樣本分組)會送出每一筆樣本及其開始和結束時間,而不是每日總計。CSV 指標是檔案頁面中說明的寬表格.
體能訓練
{"data": {"workouts": [
{"activity": "Running", "start": "2026-09-11T18:43:41Z", "end": "2026-09-11T19:13:53Z",
"duration_min": 30.2, "kcal": 512, "distance_mi": 3.06, "avg_hr": 174, "source": "Apple Watch"}
]}}
重訓記錄
每一組正式組(不含熱身組),再加上各動作的進步情況和各肌群的訓練量。重量採用你在設定、單位中選的單位,unit 欄位會寫明是哪一種。每組的 set_type 是 work、failure 或 drop,如果你記錄了保留次數,該組也會帶有 rir。set_credits 計算記入某個肌群的組數,如果一個動作練到多個肌群,就會以分數計算。
{"data": {"unit": "lb",
"sets": [{"time": "2026-09-11T17:02:00Z", "session": "Push day", "exercise": "Bench Press",
"set": 1, "weight": 185, "reps": 8, "est_1rm": 229.6, "set_type": "work"}],
"exercises": [{"exercise": "Bench Press", "best_est_1rm": 229.6,
"sessions": [{"date": "2026-09-11T17:02:00Z", "sets": 3, "top_weight": 185, "top_reps": 8, "est_1rm": 229.6, "volume": 3885}]}],
"muscle_groups": [{"group": "Chest", "volume": 3108.0, "set_credits": 2.4}]
}}
營養日記
{"data": {"days": [
{"day": "2026-09-11", "entries": [
{"meal": "breakfast", "name": "Oatmeal", "grams": 250, "kcal": 300,
"protein_g": 10, "carbs_g": 54, "fat_g": 5, "logged_at": "2026-09-11T12:10:00Z",
"nutrients": {"dietary_fiber": 8.0, "dietary_sugar": 1.2}}
]}
]}}
寫一個接收端
任何接受 HTTPS POST 並回應 2xx 的東西都行:webhook 服務、無伺服器函式,或家用伺服器上的腳本。三個原則可以讓它穩固耐用:
- 以最新為準。以(指標,日期)或該筆記錄本身的識別碼作為鍵來儲存,重複時就覆寫。區間重疊是刻意設計的。
- 先存下原始內容。再解析。剖析器的錯誤絕不該讓你損失資料。
- 快速回應。Marrow 最多會等你設定的逾時時間(預設 60 秒),超過就把這次執行標為失敗。失敗的執行會在下一個頻率週期,從上一次成功的區間重試。
一個十二行的 Python 接收端,會把每次 POST 存檔:
from http.server import BaseHTTPRequestHandler, HTTPServer
import time
class H(BaseHTTPRequestHandler):
def do_POST(self):
body = self.rfile.read(int(self.headers.get("Content-Length", 0)))
with open(f"marrow-{int(time.time())}.json", "wb") as f:
f.write(body)
self.send_response(200)
self.end_headers()
HTTPServer(("0.0.0.0", 8798), H).serve_forever()
讓它走 HTTPS(Cloudflare Tunnel、Tailscale Funnel 或任何反向代理),再把自動化操作指向它。如果你想要的是可以查詢的副本,而不是一個放滿檔案的資料夾,自架鏡像就是寫好的接收端。
值得知道的事
- 自動化操作只會在 iOS 允許 App 執行時運作:同步提交之後、前景重新整理時,以及背景更新期間。整天鎖著的手機會在下次解鎖時送出。「自上次跑步以來」的區間會補上中間的空檔。
- 每次執行都會記錄在該自動化操作的活動記錄(更多選項)中,並附上結果,所以網址設定錯誤的話,在 App 裡就看得到,不必只靠你伺服器那邊。
- 複製一個自動化操作,就能把它的標頭沿用到另一種資料。
疑難排解
用立即執行測試。下方那一行會說明發生了什麼,而更多選項、活動記錄會保留最近 30 次執行的同樣說明。開啟執行時通知(更多選項),在你檢查期間,每次執行都會收到通知。
| Marrow 顯示的訊息 | 該怎麼做 |
|---|---|
已送出內容的摘要,例如 12 diary entries | 已送達:接收端回應了 2xx。如果接收端那邊什麼都沒出現,請看下面最後幾列。 |
Server answered 401 或 403 | 接收端需要標頭,或你加的標頭不對。請檢查它的名稱和值,包括 Bearer 以及後面的空格。 |
Server answered 404 | 位址錯誤,或接收端沒有在監聽。在 n8n 請使用 Production URL 並啟用工作流程。也檢查結尾是否漏了路徑。 |
Server answered 405 | 這個位址不接受 POST。請改指向專門接收資料的端點。 |
Server answered 413 | 資料內容對接收端來說太大了。請選較短的日期範圍、較少的指標,或用每日總計取代原始樣本。 |
Server answered 500 或其他 5xx | 接收端在處理時失敗了。請看它自己的記錄檔。先存下原始內容,再解析。 |
| 要求逾時 | 接收端花的時間超過逾時設定。請先回應再處理,或到「更多選項」把逾時調高(最多 300 秒)。 |
| App Transport Security 政策要求使用安全連線。 | 這個位址是網際網路上的一般 http。請改用 https。iOS 只允許 Marrow 在你自己的網路上使用一般 http。 |
| 找不到使用指定主機名稱的伺服器。 | 位址打錯了,或是只有你家中網路才認得的名稱。請用手機上的 Safari 檢查。 |
No valid URL - set an https endpoint first | 位址是空的,或不是以 https:// 開頭(在你自己的網路上則可以是 http://)。 |
Nothing to export in this range | 這個日期範圍內沒有該種資料。請在「更多選項」選較長的範圍,或先記錄一些東西。 |
- 已送達,但什麼都沒收到。有些接收端即使丟掉資料,也還是回應 200。Home Assistant 在 webhook id 錯誤時會這樣,Apps Script 的做法在
?key=錯誤時也會。Zapier 和 Make 要等你在它們的編輯器載入範例,才會顯示東西。請查看接收端自己的記錄。 - 執行延遲或根本沒執行。背景執行的時間由 iOS 決定:同步之後、你打開 Marrow 時,以及背景更新期間。請讓 Marrow 保持開啟背景 App 重新整理(設定、一般、背景 App 重新整理)。低耗電模式會延後背景執行,整天鎖著的手機會在下次解鎖時送出。「自上次跑步以來」會在下一次成功的執行補上進度。
- 家中網路上的接收端。Marrow 需要「本機網路」存取權限才連得到它:設定、隱私權與安全性、本機網路。請在 Marrow 開著的時候點一次「立即執行」,iOS 才能詢問你。在背景時,iOS 在你回答之前會直接拒絕,不會詢問。
- 被滑掉了。你在 App 切換器中把 Marrow 滑掉後,iOS 可能不會在背景喚醒它,直到你再次打開。
- 相同的日子送了兩次。這是刻意的:「自上次跑步以來」會重送最近兩天,因為 Apple Health 會持續補資料。請保留每個指標、每一天的最新值。
- 開不起來。每個開啟中的自動化操作都算一個連線。免費方案同一時間可開 1 個連線,Marrow Pro 最多 10 個:AI、伺服器和自動化操作合計。請先關掉另一個。
- 單位看起來不對。指標採用
units中寫明的儲存單位(kg、m、mL、degC、kcal)。重訓組數則依「設定、單位」,unit欄位會寫明是哪一種。
各工具個別的解法在它們自己的頁面:n8n、Zapier、Make、Home Assistant、Google Sheets、InfluxDB、任何網址.