Loading
Loading
عندما تفتح Workflow جديد في n8n، ترى Canvas — مساحة بيضاء تضع عليها الـ Nodes وتربط بينها بخطوط.
┌────────────────────────────────────────────┐
│ أنواع الـ Nodes في n8n │
├─────────────┬──────────────────────────────┤
│ Trigger │ يبدأ سير العمل │
│ (أخضر) │ Webhook, Schedule, Gmail... │
├─────────────┼──────────────────────────────┤
│ Regular │ يعالج البيانات │
│ (رمادي) │ HTTP Request, Set, IF... │
├─────────────┼──────────────────────────────┤
│ AI │ نماذج الذكاء الاصطناعي │
│ (بنفسجي) │ Anthropic, GPT, Chains... │
└─────────────┴──────────────────────────────┘
الخطوة 1: Schedule Trigger
الخطوة 2: HTTP Request Node
https://jsonplaceholder.typicode.com/posts/1الخطوة 3: Set Node (تحويل البيانات)
processed_title{{ $json.title.toUpperCase() }}الخطوة 4: IF Node (فلتر)
{{ $json.userId }} تساوي 1الخطوة 5: تشغيل واختبار
n8n يستخدم {{ }} للوصول إلى البيانات:
// الوصول لبيانات الـ Node السابق
{{ $json.fieldName }}
// تحويل نص
{{ $json.title.toUpperCase() }}
{{ $json.email.split("@")[0] }}
// تاريخ ووقت
{{ $now.toISO() }}
{{ $now.format("YYYY-MM-DD") }}
// منطق شرطي
{{ $json.amount > 100 ? "كبير" : "صغير" }}
// بيانات من Node محدد بالاسم
{{ $("HTTP Request").first().json.title }}
في إعدادات أي Node → Settings:
┌─────────────────────────────────┐
│ On Error: │
│ ○ Stop Workflow │
│ ● Continue (Skip the error) │
│ ○ Continue (Use Error Output) │
│ │
│ Retry on Fail: ✅ │
│ Max Tries: 3 │
│ Wait Between Tries: 5s │
└─────────────────────────────────┘
# محاكاة n8n Workflow Nodes بـ Python
# Simulating n8n Workflow Nodes in Python
import json
import time
import urllib.request
from dataclasses import dataclass
from typing import Any
# ─── Node Classes ─────────────────────────────────────────
class HTTPRequestNode:
"""محاكاة HTTP Request Node في n8n"""
def __init__(self, url: str, method: str = "GET"):
self.url = url
self.method = method
def execute(self, _: dict) -> dict:
req = urllib.request.Request(self.url, method=self.method)
try:
with urllib.request.urlopen(req, timeout=5) as resp:
data = json.loads(resp.read())
print(f" 🌐 HTTP {self.method} → {resp.status}")
return {"success": True, "data": data, "status": resp.status}
except Exception as e:
print(f" ⚠️ HTTP Error: {e}")
return {"success": False, "error": str(e), "data": {}}
class SetNode:
"""محاكاة Set Node — يضيف أو يعدّل حقولاً"""
def __init__(self, mappings: dict[str, Any]):
self.mappings = mappings
def execute(self, data: dict) -> dict:
result = data.copy()
for key, value in self.mappings.items():
result[key] = value(data) if callable(value) else value
print(f" 🔄 Set: أضاف {list(self.mappings.keys())}")
return result
class IFNode:
"""محاكاة IF Node — يشعّب سير العمل"""
def __init__(self, condition: callable, label: str = ""):
self.condition = condition
self.label = label
def execute(self, data: dict) -> tuple:
passed = self.condition(data)
marker = "✅ True" if passed else "❌ False"
print(f" 🔀 IF [{self.label}]: {marker}")
return (data, None) if passed else (None, data)
# ─── بناء Workflow ────────────────────────────────────────
print("🏗️ سير العمل: جلب بيانات → معالجة → تصفية → إشعار")
print("="*55)
# الـ Nodes
http_node = HTTPRequestNode("https://jsonplaceholder.typicode.com/users/1")
set_node = SetNode({
"processed_at": lambda _: time.strftime("%Y-%m-%d %H:%M"),
"name_upper": lambda d: d.get("data", {}).get("name", "").upper(),
"email_domain": lambda d: d.get("data", {}).get("email", "@").split("@")[-1],
"is_important": lambda d: d.get("data", {}).get("id", 0) <= 5,
})
filter_node = IFNode(
condition=lambda d: d.get("is_important", False),
label="المستخدم مهم؟",
)
# ─── تشغيل ────────────────────────────────────────────────
print("\n▶ تشغيل سير العمل...")
t0 = time.time()
step1 = http_node.execute({})
step2 = set_node.execute(step1)
passed, rejected = filter_node.execute(step2)
elapsed = round((time.time() - t0) * 1000)
if passed:
print(f"\n✅ اكتمل في {elapsed}ms")
print(f" الاسم: {passed.get('name_upper')}")
print(f" الدومين: {passed.get('email_domain')}")
print(f" الوقت: {passed.get('processed_at')}")
print(f" الحالة: مهم → سيُرسل إشعار Slack")
else:
print(f"\n⏭️ غير مهم — تخطّي الإشعار ({elapsed}ms)")
# ─── محاكاة Executions Log ───────────────────────────────
print("\n📋 Executions Log:")
for i, node_name in enumerate(["HTTP Request", "Set Fields", "IF Filter"], 1):
status = "✅" if not (i == 3 and rejected) else "⏭️"
print(f" {i}. {status} {node_name}")