تنبيه سعر الصرف على تيليجرام
راقب سعر الدولار كل ساعة، وتصلك رسالة على تيليجرام إذا تحرك أكثر من 1%.
كيف تعمل
المشغّل: جدول زمني — كل ساعة
- اجلب أحدث أسعار الدولار من واجهة أسعار صرف مجانية.
- قارن عملاتك بآخر سعر رآه الـworkflow.
- إذا تحركت أي عملة أكثر من 1%، أرسل السعر القديم والجديد ونسبة التغيير على تيليجرام.
المخطط
مشغّل تطبيق منطق كود
الكود
كود JavaScript المستخدم في خطوات Code، وهو مضمَّن بالفعل في القالب بالأسفل.
// Compares today's USD rates with the last rates this workflow saw.
// The last rates are kept in workflow static data, which only saves on active (production) runs.
const CURRENCIES = ["EGP", "SAR", "AED"];
const THRESHOLD = 1; // percent
const rates = $input.first().json.rates || {};
const memory = $getWorkflowStaticData("global");
const last = memory.rates || {};
const moves = CURRENCIES
.filter((c) => rates[c] && last[c])
.map((c) => ({ currency: c, from: last[c], to: rates[c], change: ((rates[c] - last[c]) / last[c]) * 100 }))
.filter((m) => Math.abs(m.change) >= THRESHOLD);
// Only move the baseline when we alert, so slow drifts still add up to an alert.
if (!memory.rates || moves.length) memory.rates = Object.fromEntries(CURRENCIES.map((c) => [c, rates[c]]));
return [{
json: {
alert: moves.length > 0,
message: moves
.map((m) => `USD/${m.currency}: ${m.from.toFixed(2)} → ${m.to.toFixed(2)} (${m.change > 0 ? "+" : ""}${m.change.toFixed(1)}%)`)
.join("\n"),
},
}];ابنِها بأداتك
اختر أداتك — نفس الأتمتة، خطوة بخطوة.
انسخه والصقه مباشرة في مساحة عمل n8n (Ctrl+V)، أو حمّله واستخدم Import from File. بعد ذلك اربط حساباتك واستبدل كل قيمة تبدأ بـ YOUR_.
عرض الكود (171 سطر)
{
"name": "تنبيه سعر الصرف على تيليجرام (Flowngn)",
"nodes": [
{
"parameters": {
"content": "## تنبيه سعر الصرف على تيليجرام\nراقب سعر الدولار كل ساعة، وتصلك رسالة على تيليجرام إذا تحرك أكثر من 1%.\n\n**Setup**\n1. Open each node and connect your own credentials.\n2. Replace every YOUR_… placeholder.\n3. Test once, then activate.\n\nFree template from Flowngn",
"height": 260,
"width": 340
},
"id": "22e076db-ed1a-48e3-aaf2-6913115a1802",
"name": "Setup notes",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-420,
-60
]
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 1
}
]
}
},
"id": "22e076db-ed1a-48e3-aaf2-6913115a1802",
"name": "Every hour",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
0,
0
]
},
{
"parameters": {
"url": "https://open.er-api.com/v6/latest/USD",
"options": {}
},
"id": "22e076db-ed1a-48e3-aaf2-6913115a1802",
"name": "Get USD rates",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
300,
0
]
},
{
"parameters": {
"jsCode": "// Compares today's USD rates with the last rates this workflow saw.\n// The last rates are kept in workflow static data, which only saves on active (production) runs.\nconst CURRENCIES = [\"EGP\", \"SAR\", \"AED\"];\nconst THRESHOLD = 1; // percent\n\nconst rates = $input.first().json.rates || {};\nconst memory = $getWorkflowStaticData(\"global\");\nconst last = memory.rates || {};\n\nconst moves = CURRENCIES\n .filter((c) => rates[c] && last[c])\n .map((c) => ({ currency: c, from: last[c], to: rates[c], change: ((rates[c] - last[c]) / last[c]) * 100 }))\n .filter((m) => Math.abs(m.change) >= THRESHOLD);\n\n// Only move the baseline when we alert, so slow drifts still add up to an alert.\nif (!memory.rates || moves.length) memory.rates = Object.fromEntries(CURRENCIES.map((c) => [c, rates[c]]));\n\nreturn [{\n json: {\n alert: moves.length > 0,\n message: moves\n .map((m) => `USD/${m.currency}: ${m.from.toFixed(2)} → ${m.to.toFixed(2)} (${m.change > 0 ? \"+\" : \"\"}${m.change.toFixed(1)}%)`)\n .join(\"\\n\"),\n },\n}];"
},
"id": "22e076db-ed1a-48e3-aaf2-6913115a1802",
"name": "Compare with last rate",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
600,
0
]
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose"
},
"conditions": [
{
"id": "c1",
"leftValue": "={{ $json.alert }}",
"rightValue": "",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"id": "22e076db-ed1a-48e3-aaf2-6913115a1802",
"name": "Moved 1% or more?",
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
900,
0
]
},
{
"parameters": {
"chatId": "YOUR_CHAT_ID",
"text": "=Exchange rate moved:\n{{ $json.message }}",
"additionalFields": {
"appendAttribution": false
}
},
"id": "22e076db-ed1a-48e3-aaf2-6913115a1802",
"name": "Alert on Telegram",
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
1200,
0
]
}
],
"connections": {
"Every hour": {
"main": [
[
{
"node": "Get USD rates",
"type": "main",
"index": 0
}
]
]
},
"Get USD rates": {
"main": [
[
{
"node": "Compare with last rate",
"type": "main",
"index": 0
}
]
]
},
"Compare with last rate": {
"main": [
[
{
"node": "Moved 1% or more?",
"type": "main",
"index": 0
}
]
]
},
"Moved 1% or more?": {
"main": [
[
{
"node": "Alert on Telegram",
"type": "main",
"index": 0
}
]
]
}
},
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"meta": {
"templateCredsSetupCompleted": false
},
"tags": []
}في Make، أنشئ سيناريو جديدًا وأضف هذه الوحدات بالترتيب:
- Schedule the scenario: Every hour
- HTTP › Make a request
- Tools › Set variable / Iterator + Array aggregator (same logic as the Code step)
- Filter on the next route: “Moved 1% or more?”
- إذا نعمTelegram Bot › Send a Text Message or a Reply
- كل تشغيل لوحدة يستهلك عمليات (operations) في Make — والباقة المجانية تتضمن حصة شهرية.
- دوال Make المدمجة (map و sum و formatDate…) تغني عن معظم خطوات Code؛ وللمنطق المعقد استخدم وحدة كود.
- قد تختلف أسماء الوحدات والخطوات قليلًا مع تحديث Make و Zapier لتطبيقاتهما.
في Zapier، أنشئ Zap جديدًا وأضف هذه الخطوات بالترتيب:
- Schedule by Zapier — Every hour
- Webhooks by Zapier — GET
- Code by Zapier — Run JavaScript (paste the code from the Code section)
- Filter by Zapier: “Moved 1% or more?”
- إذا نعمTelegram — Send Message
- الـ Zaps التي فيها أكثر من خطوتين تحتاج باقة Zapier مدفوعة.
- الـ Webhooks والفلاتر/المسارات و Code by Zapier ميزات مدفوعة في بعض باقات Zapier.
- Code by Zapier يشغّل JavaScript: أعد استخدام الكود بالأعلى، مع قراءة المدخلات من inputData بدلًا من $json.
- قد تختلف أسماء الوحدات والخطوات قليلًا مع تحديث Make و Zapier لتطبيقاتهما.
نصائح
- آخر سعر يُحفظ داخل الـworkflow نفسه، لذلك يعمل فقط بعد تفعيله (وليس في التشغيل التجريبي اليدوي).
- الواجهات المجانية تتحدث بضع مرات في اليوم؛ اعتمد على سعر البنك عند التسعير الفعلي.
أتمتات مشابهة
المالية والإدارةمتوسط
سجّل مصروفاتك برسالة لبوت تيليجرام
أرسل "12.50 غداء" إلى البوت فتُحفظ فورًا في Google Sheet.
Telegram → Google Sheets3 س/شهر
المالية والإدارةسهل
تذكير تجديد الاشتراك على واتساب
قبل انتهاء اشتراك العميل بسبعة أيام، ذكّره على واتساب وأخبر فريقك.
Google Sheets → WhatsApp → Telegram5 س/شهر
المالية والإدارةسهل
ملخص التدفق النقدي الأسبوعي على تيليجرام
كل أحد، اعرف الداخل والخارج والصافي وأكبر مصروفات الأسبوع على تيليجرام.
Google Sheets → Telegram2 س/شهر