Loading
Loading
n8n (تُنطق "n-eight-n") هو منصة أتمتة مفتوحة المصدر يمكنك استضافتها على سيرفرك الخاص. الاسم اختصار لـ "nodemation" — أتمتة قائمة على الـ Nodes.
# تشغيل n8n مع Docker
docker run -it --rm \
--name n8n \
-p 5678:5678 \
-v ~/.n8n:/home/node/.n8n \
docker.n8n.io/n8nio/n8n
# تشغيل في الخلفية
docker run -d \
--name n8n \
--restart unless-stopped \
-p 5678:5678 \
-v ~/.n8n:/home/node/.n8n \
docker.n8n.io/n8nio/n8n
# تثبيت n8n عالمياً
npm install n8n -g
# تشغيل n8n
n8n start
# تشغيل مع التونلينج (للاختبار مع Webhooks)
n8n start --tunnel
npx n8n
بعد التشغيل افتح: http://localhost:5678
┌─────────────────────────────────────────┐
│ n8n Interface │
├───────────────┬─────────────────────────┤
│ Workflows │ Canvas (مساحة العمل) │
│ ─────────── │ ┌──────┐ → ┌────────┐ │
│ My Workflow │ │Trigger│ │ Action │ │
│ Email Bot │ └──────┘ └────────┘ │
├───────────────┤─────────────────────────┤
│ Credentials │ Node Panel │
│ Executions │ Parameters & Settings │
└───────────────┴─────────────────────────┘
| القسم | الوظيفة | |-------|---------| | Workflows | قائمة كل سير العمل لديك | | Canvas | مساحة رسم سير العمل بصرياً | | Credentials | مفاتيح API المشفرة | | Executions | سجل كل عمليات التشغيل | | Node Panel | مكتبة الـ Nodes المتاحة |
الآن يمكن لأي Workflow استخدام هذا المفتاح بأمان!
# محاكاة n8n Webhook Server — Python Simulation
import json
import time
import threading
import urllib.request
from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import urlparse
from dataclasses import dataclass, field
from datetime import datetime
# ─── Webhook Event ────────────────────────────────────────
@dataclass
class WebhookEvent:
path: str
source: str
payload: dict
received_at: str = field(
default_factory=lambda: datetime.now().strftime("%H:%M:%S")
)
received_events: list[WebhookEvent] = []
# ─── Webhook Server (مثل n8n Webhook Trigger Node) ───────
class WebhookHandler(BaseHTTPRequestHandler):
"""يستقبل البيانات الواردة مثل n8n Webhook Trigger"""
def do_POST(self):
content_len = int(self.headers.get("Content-Length", 0))
body = self.rfile.read(content_len)
try:
payload = json.loads(body)
except Exception:
payload = {"raw": body.decode()}
event = WebhookEvent(
path=urlparse(self.path).path,
source=self.headers.get("X-Source", "unknown"),
payload=payload,
)
received_events.append(event)
print(f"\n📨 [{event.received_at}] Webhook: {event.path}")
print(f" المصدر: {event.source}")
print(f" البيانات: {json.dumps(event.payload, ensure_ascii=False)}")
# توجيه حسب المسار (مثل n8n Router)
if "email" in event.path:
subject = event.payload.get("subject", "")
is_urgent = any(w in subject for w in ["عاجل", "urgent"])
print(f" 📧 بريد {'🔴 عاجل' if is_urgent else '🟢 عادي'}: {subject}")
elif "payment" in event.path:
amount = event.payload.get("amount", 0)
print(f" 💳 دفعة: {amount} ريال")
self.send_response(200)
self.send_header("Content-Type", "application/json")
self.end_headers()
resp = {"status": "ok", "event_id": len(received_events)}
self.wfile.write(json.dumps(resp).encode())
def log_message(self, *args):
pass # إخفاء سجلات HTTP الافتراضية
# ─── تشغيل السيرفر ────────────────────────────────────────
server = HTTPServer(("localhost", 9100), WebhookHandler)
t = threading.Thread(target=server.serve_forever, daemon=True)
t.start()
print("🌐 n8n Webhook Simulator: http://localhost:9100")
print(" جاهز لاستقبال الأحداث...\n")
time.sleep(0.3)
# ─── محاكاة إرسال Webhooks من تطبيقات خارجية ─────────────
def fire_webhook(path: str, data: dict, source: str) -> dict:
body = json.dumps(data).encode()
req = urllib.request.Request(
f"http://localhost:9100{path}",
data=body,
headers={"Content-Type": "application/json", "X-Source": source},
method="POST",
)
with urllib.request.urlopen(req) as r:
return json.loads(r.read())
# أحداث تجريبية
events = [
("/webhook/email", {"from": "client@co.com", "subject": "مشكلة عاجلة في النظام"}, "Gmail"),
("/webhook/email", {"from": "news@daily.com", "subject": "النشرة الأسبوعية"}, "Gmail"),
("/webhook/payment", {"amount": 499, "status": "completed", "plan": "Pro"}, "Stripe"),
("/webhook/email", {"from": "boss@co.com", "subject": "تقرير urgent مطلوب الآن"}, "Outlook"),
]
for path, data, source in events:
result = fire_webhook(path, data, source)
print(f" ✅ رد: {result}")
time.sleep(0.3)
server.shutdown()
print(f"\n📊 إجمالي الأحداث المستلمة: {len(received_events)}")