Tuesday, October 20, 2026
دفع الأخبار إلى Slack أو Discord عبر webhooks الخاصة بـ finlight
دفع الأخبار إلى Slack أو Discord عبر webhooks الخاصة بـ finlight
أسرع طريقة لوضع الأخبار أمام فريقك هي دفعها إلى المحادثة التي يتابعها بالفعل. مع webhooks الخاصة بـ finlight لا تحتاج إلى الاستطلاع المتكرر: يستدعي finlight نقطة النهاية الخاصة بك في اللحظة التي يطابق فيها مقال ما عوامل التصفية لديك. يُعِدّ هذا الدرس نقطة نهاية صغيرة بلغة Python تتحقق من الـ webhook وتعيد توجيهه إلى Slack أو Discord.
كيف تعمل webhooks الخاصة بـ finlight
تنشئ webhook في لوحة التحكم، وتضبط عوامل تصفيته (رموز الأسهم، الفئات، وما إلى ذلك)، وتمنح finlight عنوان نقطة النهاية الخاصة بك. عندما يطابق مقال ما، يرسل finlight المقال بطلب POST إلى نقطة نهايتك ويوقّع الطلب، حتى يمكنك التأكد من أنه جاء فعلًا من finlight. يحمل كل طلب ترويستين (headers):
X-Webhook-Signature— توقيع HMAC-SHA256 لجسم الطلب.X-Webhook-Timestamp— يُستخدم لرفض إعادة التشغيل (نافذة تسامح مدتها 5 دقائق).
تتحقق الـ SDK الرسمية من كليهما نيابة عنك.
نقطة النهاية
import os
import requests
from flask import Flask, request
from finlight_client import WebhookService, WebhookVerificationError
app = Flask(__name__)
WEBHOOK_SECRET = os.environ["FINLIGHT_WEBHOOK_SECRET"]
CHAT_WEBHOOK_URL = os.environ["CHAT_WEBHOOK_URL"]
@app.route("/finlight-webhook", methods=["POST"])
def finlight_webhook():
raw_body = request.get_data(as_text=True)
signature = request.headers.get("X-Webhook-Signature")
timestamp = request.headers.get("X-Webhook-Timestamp")
try:
article = WebhookService.construct_event(
raw_body, signature, WEBHOOK_SECRET, timestamp
)
except WebhookVerificationError:
return "", 400
text = (
f"*{article.title}*\n"
f"{article.sentiment} · {article.source}\n"
f"{article.link}"
)
# Slack incoming webhook expects {"text": ...}
requests.post(CHAT_WEBHOOK_URL, json={"text": text})
return "", 200
تتحقق WebhookService.construct_event(...) من التوقيع، وتُثبِت صحة الطابع الزمني، وتعيد Article
مُحلَّلًا. إذا فشل أي شيء فإنها تطلق WebhookVerificationError، وعندئذٍ تُرجِع 400.
الإرسال إلى Discord بدلًا من ذلك
تستخدم webhooks الواردة في Discord الحقل content بدلًا من text. بدّل سطر الإرسال:
requests.post(CHAT_WEBHOOK_URL, json={"content": text})
كل شيء آخر يبقى كما هو.
تحقّق دائمًا
التحقق مهم: بدونه يمكن لأي شخص يعثر على عنوانك أن ينشر مقالات مزيفة في قناتك. مرّر دائمًا جسم الطلب
الخام غير المُحلَّل إلى construct_event (لا تُعِد تسلسله أولًا)، واحتفظ بسر نقطة النهاية في متغير
بيئة، وأعد الاستجابة بسرعة حتى لا تُبقي finlight في الانتظار.
النسخة المُثرّاة مقابل النسخة الخام
يقدّم finlight webhooks مُثرّاة (مع المشاعر والكيانات) و webhooks خام (خفيفة وأسرع). استخدم المُثرّاة عندما يجب أن يُظهر تنبيهك المشاعر أو الشركات المعنية، والخام عندما تحتاج فقط إلى العنوان بأسرع ما يمكن.
إلى أين تذهب بعد ذلك
- REST مقابل WebSocket مقابل Webhooks مقابل MCP لمعرفة متى تتفوق webhooks على البث المتدفق.
- التوثيق الكامل لإعداد الـ webhook والحمولات والاختبار.
