Marrow Health
AR
تنزيل

أرسل بيانات Apple Health إلى webhook

ليس لدى Apple Health واجهة ويب، فلا تصل بياناتك إلى webhook إلا إذا أرسلها تطبيق على iPhone. يفعل Marrow Health ذلك مجانًا: يرسل تحكم تلقائي بطلب POST مقاييسك الصحية وتمارينك وجولات القوة ويوميات طعامك أو أعراضك ومزاجك إلى أي رابط، بصيغة JSON أو CSV، وفق الجدول الذي تختاره، والتطبيق مغلق. فيما يلي الإعداد والحمولة ومستقبِلات جاهزة لـ n8n وHome Assistant وخادم عادي. نحن نصنع Marrow.

إعداد التحكم التلقائي

  1. في Marrow Health، افتح علامة التبويب «تصدير»، ثم تلقائي، ثم تحكم تلقائي جديد.
  2. الصق رابط webhook (استخدم HTTPS). أضف أي ترويسات يتحقق منها المستقبِل، مثل رمز bearer في Authorization أو مفتاح header-auth في n8n.
  3. اختر نوع البيانات: المقاييس الصحية أو التمارين أو سجل تمارين القوة أو يوميات التغذية أو الأعراض والمزاج. كل تحكم تلقائي يرسل نوعًا واحدًا، ويمكنك امتلاك ما يصل إلى عشرة.
  4. اختر JSON أو CSV، ونطاق التواريخ (الافتراضي منذ آخر تشغيل)، وعدد مرات التشغيل بالدقائق أو الساعات أو الأيام.
  5. شغّله واضغط تشغيل الآن لإرسال أول حمولة وأنت تراقب المستقبِل.

كل طلب هو 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

  1. أضف عقدة Webhook. اضبط HTTP Method على POST وأعطها مسارًا، مثل apple-health.
  2. للحصول على سر، اضبط Authentication على Header Auth وأضف اسم الترويسة وقيمتها نفسيهما إلى التحكم التلقائي في Marrow.
  3. اضغط Listen for test event، ثم اضغط تشغيل الآن في Marrow خلال دقيقتين. تظهر الحمولة في المحرر.
  4. انشر سير العمل ووجّه 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 }}

(وثائق مشغّل 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 هي هذا المستقبِل مكتوبًا جاهزًا، ويمكن لوكلاء الذكاء الاصطناعي الاستعلام منها أيضًا.

ثلاث قواعد لمستقبِل لا يفقد البيانات أبدًا

متى يعمل؟

كلما سمح iOS لـ Marrow بالعمل: بعد مزامنته مع Apple Health، وعند فتحك له، وأثناء التحديث في الخلفية، بعد مرور الفاصل الذي اخترته. يقرر iOS متى يحدث التحديث في الخلفية، فالهاتف المقفل طوال اليوم يرسل عند فتحه التالي، ومنذ آخر تشغيل يغطي الفجوة.

طرق أخرى