الانتقال إلى المحتوى
Hearl
Esc
↑↓تنقل↵فتح⌘Jمعاينة
في هذه الصفحة

الإشعارات

ملخصات البريد الإلكتروني وwebhooks للمحادثات التي تحتاج إلى انتباه، بما في ذلك التحقق من التوقيع.

يستطيع Hearl إبلاغ فريقك فور احتياج محادثة إلى انتباه. اضبط ذلك في صفحة الإشعارات. لا يستطيع تغيير هذه الإعدادات سوى المالكين والمشرفين.

متى تُرسل الإشعارات

يفحص Hearl كل 15 دقيقة. تُدرج المحادثة عندما:

  • تكون حالة المنصة لديها لا ردّ بعد أو تابع المستخدم
  • يكون تقدمها لا يزال لم يبدأ
  • يحكم الذكاء الاصطناعي في Hearl بأنها تتعلق بمنتجك، دون أي إجابة غير مؤكدة
  • تكون أولويتها عند الحد الأدنى الذي حددته أو أعلى منه: كل شيء، أو متوسطة فأعلى، أو عالية فقط

يُرسل إشعار واحد عن كل محادثة لكل حالة. فإذا أُرسل إشعارها بحالة لا ردّ بعد ثم تابع المستخدم لاحقًا، يُرسل إشعار جديد بحالة تابع المستخدم.

البريد الإلكتروني

فعّل إرسال البريد وأضف المستلمين. اترك القائمة فارغة لإرسال البريد إلى كل أعضاء مساحة العمل. يصلح أي عنوان، مثل صندوق دعم مشترك، بحد أقصى 20 مستلمًا.

ترسل كل جولة فحص ملخصًا واحدًا يسرد حتى 10 محادثات، مع رابط إلى الباقي في صندوق الوارد. اختر الإنجليزية أو الصينية ضمن اللغة.

Webhook

أدخل نقطة النهاية. يجب أن تكون عنوان https عامًا. يتعرف Hearl على روبوتات الدردشة الشائعة من عنوانها ويرسل صيغة الرسالة التي تتوقعها:

العنوان يُرسل على هيئة
hooks.slack.com رسالة Slack
feishu.cn, larksuite.com رسالة نصية في Feishu
qyapi.weixin.qq.com رسالة Markdown في WeCom
oapi.dingtalk.com رسالة Markdown في DingTalk
discord.com, discordapp.com رسالة Discord
أي عنوان آخر JSON عام (أدناه)

تعرض الصفحة النوع الذي اكتشفته. يرسل إرسال اختبار عينة، وتعرض الصفحة نتيجة آخر إرسال. الطلب الذي يستغرق أكثر من 8 ثوانٍ يُعدّ انتهاءً للمهلة.

JSON عام

{
  "event": "conversations.needs_attention",
  "workspace": { "id": "org_123", "name": "Acme" },
  "text": "*2 conversations need attention* · Acme\n• [reddit] Sync stopped working after 2.3 — No reply yet <https://…>",
  "conversations": [
    {
      "id": "c_8f2a",
      "platform": "reddit",
      "product": "Acme",
      "title": "Sync stopped working after 2.3",
      "author": "some_user",
      "url": "https://www.reddit.com/r/…",
      "status": "待回复",
      "priority": "高",
      "category": "故障",
      "inbox_url": "https://hearl.org/app?c=c_8f2a"
    }
  ],
  "sent_at": "2026-11-08T09:15:00.000Z"
}
الحقل الوصف
event conversations.needs_attention، أو test عند إرسال اختبار.
workspace id مساحة العمل وname الخاص بها.
text ملخص جاهز للنشر. يقرأ Slack هذا الحقل وحده.
conversations كل المحادثات في هذا الإرسال.
sent_at وقت إرسال الدفعة، بصيغة ISO 8601.

قيم platform هي x أو reddit أو hn. أما status وpriority وcategory فهي رموز ثابتة بالصينية، ليتمكن كودك من المطابقة عليها أيًّا كانت لغة مساحة عملك:

الحقل الرمز المعنى
status 待回复 لا ردّ بعد
status 用户有新回复 تابع المستخدم
priority 高 / 中 / 低 عالية / متوسطة / منخفضة
category 故障 عطل
category 求助 سؤال
category 功能建议 طلب ميزة
category 价格 التسعير
category 负面反馈 انتقاد
category 正面反馈 إشادة
category 购买咨询 شراء
category 其他 أخرى

التحقق من التوقيع

عند حفظ نقطة نهاية webhook ينشئ Hearl سر التوقيع لها. يمكنك إظهاره أو تدويره في صفحة الإشعارات. يحمل الطلب هذا الترويسة:

X-Hearloop-Signature: sha256=<hex>

<hex> هو HMAC-SHA256 لجسم الطلب الخام، مفتاحه سر التوقيع الخاص بك، بصيغة hex بأحرف صغيرة. احسبه على البايتات نفسها التي تلقيتها، قبل تحليل JSON، وقارن في زمن ثابت.

import { createHmac, timingSafeEqual } from "node:crypto";
import express from "express";

const app = express();
const secret = process.env.HEARL_WEBHOOK_SECRET;

app.post("/hearl", express.raw({ type: "application/json" }), (req, res) => {
  const expected = "sha256=" + createHmac("sha256", secret).update(req.body).digest("hex");
  const received = req.get("x-hearloop-signature") ?? "";
  const ok =
    received.length === expected.length &&
    timingSafeEqual(Buffer.from(received), Buffer.from(expected));
  if (!ok) return res.status(401).end();

  const payload = JSON.parse(req.body.toString("utf8"));
  console.log(payload.event, payload.conversations.length);
  res.status(200).end();
});

app.listen(3000);
import hashlib
import hmac
import json
import os

from flask import Flask, abort, request

app = Flask(__name__)
SECRET = os.environ["HEARL_WEBHOOK_SECRET"].encode()


@app.post("/hearl")
def hearl():
    body = request.get_data()
    expected = "sha256=" + hmac.new(SECRET, body, hashlib.sha256).hexdigest()
    received = request.headers.get("X-Hearloop-Signature", "")
    if not hmac.compare_digest(received, expected):
        abort(401)

    payload = json.loads(body)
    print(payload["event"], len(payload["conversations"]))
    return "", 200

أعد أي رمز حالة 2xx لتأكيد استلام الإرسال.

هل كانت هذه الصفحة مفيدة؟