أرسل بيانات Apple Health إلى webhook
ليس لدى Apple Health واجهة ويب، فلا تصل بياناتك إلى webhook إلا إذا أرسلها تطبيق على iPhone. يفعل Marrow Health ذلك مجانًا: يرسل تحكم تلقائي بطلب POST مقاييسك الصحية وتمارينك وجولات القوة ويوميات طعامك أو أعراضك ومزاجك إلى أي رابط، بصيغة JSON أو CSV، وفق الجدول الذي تختاره، والتطبيق مغلق. فيما يلي الإعداد والحمولة ومستقبِلات جاهزة لـ n8n وHome Assistant وخادم عادي. نحن نصنع Marrow.
إعداد التحكم التلقائي
- في Marrow Health، افتح علامة التبويب «تصدير»، ثم تلقائي، ثم تحكم تلقائي جديد.
- الصق رابط webhook (استخدم HTTPS). أضف أي ترويسات يتحقق منها المستقبِل، مثل رمز bearer في
Authorizationأو مفتاح header-auth في n8n. - اختر نوع البيانات: المقاييس الصحية أو التمارين أو سجل تمارين القوة أو يوميات التغذية أو الأعراض والمزاج. كل تحكم تلقائي يرسل نوعًا واحدًا، ويمكنك امتلاك ما يصل إلى عشرة.
- اختر JSON أو CSV، ونطاق التواريخ (الافتراضي منذ آخر تشغيل)، وعدد مرات التشغيل بالدقائق أو الساعات أو الأيام.
- شغّله واضغط تشغيل الآن لإرسال أول حمولة وأنت تراقب المستقبِل.
كل طلب هو POST مع Content-Type: application/json (أو text/csv) وترويساتك. كل تشغيل، مع رمز الاستجابة، مدرج في سجل التحكم التلقائي داخل التطبيق.
ما الذي يصل
تصل المقاييس الصحية كمجاميع يومية، بالوحدة المذكورة في units. يأتي معدل نبضات القلب كمتوسط كل يوم وحدّه الأدنى والأقصى، ويأتي النوم كل ليلة مع مراحلها، بالساعات:
{"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، كلها في مرجع التحكم التلقائي.
الاستقبال في n8n
- أضف عقدة Webhook. اضبط HTTP Method على
POSTوأعطها مسارًا، مثلapple-health. - للحصول على سر، اضبط Authentication على Header Auth وأضف اسم الترويسة وقيمتها نفسيهما إلى التحكم التلقائي في Marrow.
- اضغط Listen for test event، ثم اضغط تشغيل الآن في Marrow خلال دقيقتين. تظهر الحمولة في المحرر.
- انشر سير العمل ووجّه Marrow إلى Production URL (الذي يحتوي على
/webhook/، وليس/webhook-test/). يتوقف رابط الاختبار عن الاستماع بعد اختبار واحد.
الحمولة تحت body، فتكون خطوات اليوم هي {{ $json.body.data.metrics.find(m => m.name === 'step_count').data.at(-1).qty }} في تعبير. أضف عقدة Split Out على body.data.metrics لمعالجة كل مقياس كعنصر مستقل. يقبل n8n حمولات حتى 16 ميغابايت افتراضيًا، وهذا يكفي لسنوات من المجاميع اليومية. تظهر عمليات التشغيل الفعلية تحت Executions، وليس في المحرر. (وثائق n8n Webhook)
الاستقبال في Home Assistant
يستقبل مشغّل webhook طلب POST على /api/webhook/<webhook_id>. يخزّن هذا التحكم التلقائي آخر عدد للخطوات في مساعد رقمي اسمه input_number.steps_today (أنشئه أولًا، بحد أقصى أعلى من أفضل أيامك):
automation:
- alias: "Apple Health from Marrow"
triggers:
- trigger: webhook
webhook_id: "pick-a-long-random-id"
allowed_methods:
- POST
local_only: false
actions:
- action: input_number.set_value
target:
entity_id: input_number.steps_today
data:
value: >-
{{ ((trigger.json.data.metrics
| selectattr('name', 'eq', 'step_count') | first).data
| last).qty }}
- نص JSON موجود في
trigger.jsonلأن Marrow يرسلContent-Type: application/json. - الخيار
local_onlyمفعّل افتراضيًا، فيقبل الطلبات من شبكة منزلك أو من رابط webhook السحابي في Nabu Casa فقط. اضبطه علىfalseعندما يرسل الهاتف عبر الإنترنت إلى عنوان HTTPS الخاص بك. - معرّف webhook هو السر الوحيد، فاجعله طويلًا وعشوائيًا.
(وثائق مشغّل webhook في Home Assistant)
الاستقبال على خادمك الخاص
أي نقطة نهاية تقبل POST عبر HTTPS وترد برمز 2xx تصلح. هذه تحفظ كل حمولة في ملف:
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 أو وكيل عكسي. وإذا فضّلت قاعدة بيانات قابلة للاستعلام على مجلد من الملفات، فإن النسخة المطابقة المستضافة ذاتيًا من Marrow هي هذا المستقبِل مكتوبًا جاهزًا، ويمكن لوكلاء الذكاء الاصطناعي الاستعلام منها أيضًا.
ثلاث قواعد لمستقبِل لا يفقد البيانات أبدًا
- الأحدث يفوز. خزّن كل قيمة بمفتاح المقياس واليوم واكتب فوقها عند التكرار. يعيد منذ آخر تشغيل إرسال آخر يومين عمدًا، لأن Apple Health يواصل ملء اليوم بعد انتهائه.
- احفظ النص الخام أولًا، ثم حلّله. ينبغي ألا يكلّفك خطأ في التحليل أي بيانات.
- أجب بسرعة. ينتظر Marrow حتى المهلة التي حددتها (60 ثانية افتراضيًا) ويعيد المحاولة بعد تشغيل فاشل من آخر نافذة ناجحة في دوره التالي.
متى يعمل؟
كلما سمح iOS لـ Marrow بالعمل: بعد مزامنته مع Apple Health، وعند فتحك له، وأثناء التحديث في الخلفية، بعد مرور الفاصل الذي اخترته. يقرر iOS متى يحدث التحديث في الخلفية، فالهاتف المقفل طوال اليوم يرسل عند فتحه التالي، ومنذ آخر تشغيل يغطي الفجوة.
طرق أخرى
- Health Auto Export يرسل أيضًا بيانات Apple Health إلى webhooks، وبنية JSON للمقاييس فيه هي نفسها في Marrow. ويحتاج التحكم التلقائي فيه إلى الفئة Premium.
- اختصارات Apple تستطيع قراءة العينات الصحية وإرسالها عبر Get Contents of URL، ضمن أتمتة شخصية في وقت محدد. هي مجانية، ولا تستطيع قراءة بيانات Health إلا والهاتف مفتوح القفل، وعليك أن تبني كل مقياس وتصونه بنفسك.
- ملف export.zip من Apple نسخة احتياطية كاملة لمرة واحدة، وليس تدفقًا. ولتحويل واحد منها إلى CSV، استخدم المحوّل داخل المتصفح لدينا.