متتبع أسعار وأسهم منافسي التجارة الإلكترونية عالية السرعة -> تنبيهات Telegram (Apify + n8n)

# :rocket: متتبع أسعار المنافسين في التجارة الإلكترونية عالي السرعة والمخزون → تنبيهات Telegram (Apify + n8n)

مرحباً بالجميع! :waving_hand:

لقد قمت بإنشاء إعداد **سير عمل n8n + ممثل Apify** جاهز للإنتاج مصمم لتتبع انخفاضات أسعار المنافسين وأحداث نفاد المخزون عبر **Shopify و WooCommerce و Salesforce Commerce Cloud و Magento و متاجر العلامات التجارية D2C**، مع إرسال تنبيهات بصيغة Markdown منسقة فوراً إلى Telegram (أو Discord/Slack).

أدوات SaaS التقليدية مثل Prisync تكلف 200 دولار أو أكثر شهرياً، وأدوات الكشط الثقيلة Puppeteer تستهلك ذاكرة RAM ضخمة. يستخدم هذا الإعداد **محرك HTTP/JSON-LD خفيف الوزن (يستهلك فقط ~90 MB RAM)**, مما يجعله سريع جداً وفعالاً من حيث التكلفة.

-–

## :high_voltage: ما يفعله سير العمل هذا

1. **مراقبة عناوين URL للتجارة الإلكترونية:** تتبع انخفاضات الأسعار وزيادات الأسعار وتغييرات حالة المخزون (في المخزون ↔ نفاد المخزون).

2. **المقارنة الحالة:** يؤدي إلى تنبيهات فقط عند حدوث تغيير فعلي في السعر أو المخزون (يتجاهل الأشغال الزائدة).

3. **تنبيهات Telegram الفورية:** يرسل رسائل Markdown جميلة مكتملة برموز تعبيرية وفروقات السعر القديم مقابل الجديد وروابط المنتج المباشرة.

-–

## :package: نموذج سير عمل n8n جاهز للنسخ واللصق

انسخ رمز JSON أدناه والصقه مباشرة في لوحة سير العمل n8n (`Ctrl+V` أو `Cmd+V`):

```json

{

“name”: “E-Commerce Price & Stock Monitor to Telegram”,

“nodes”: [

{

  "parameters": {

    "httpMethod": "POST",

    "path": "ecommerce-price-alert",

    "options": {}

  },

  "name": "Apify Webhook Trigger",

  "type": "n8n-nodes-base.webhook",

  "typeVersion": 1,

  "position": \[250, 300\]

},

{

  "parameters": {

    "conditions": {

      "boolean": \[

        {

          "value1": "={{ $json.body.totalAlerts > 0 }}",

          "value2": true

        }

      \]

    }

  },

  "name": "Has Price/Stock Alerts?",

  "type": "n8n-nodes-base.if",

  "typeVersion": 1,

  "position": \[470, 300\]

},

{

  "parameters": {

    "chatId": "YOUR_TELEGRAM_CHAT_ID",

    "text": "={{ $json.body.formattedText }}",

    "additionalFields": {

      "parse_mode": "Markdown"

    }

  },

  "name": "Send Telegram Alert",

  "type": "n8n-nodes-base.telegram",

  "typeVersion": 1,

  "position": \[690, 200\]

}

],

“connections”: {

"Apify Webhook Trigger": {

  "main": \[

    \[

      {

        "node": "Has Price/Stock Alerts?",

        "type": "main",

        "index": 0

      }

    \]

  \]

},

"Has Price/Stock Alerts?": {

  "main": \[

    \[

      {

        "node": "Send Telegram Alert",

        "type": "main",

        "index": 0

      }

    \]

  \]

}

}

}

```

-–

## :gear: دليل الإعداد في 3 خطوات

### الخطوة 1: استيراد سير العمل إلى n8n

1. إنشاء سير عمل جديد في n8n.

2. انسخ مقطع JSON أعلاه والصقه (`Ctrl+V`) في محرر n8n الخاص بك.

3. احفظ سير العمل و****قلّب مفتاح Active إلى ON**** (حاسم: تأكد من استخدام عنوان URL Webhook الخاص بالإنتاج، وليس عنوان الاختبار!).

### الخطوة 2: تكوين ممثل Apify

1. افتح [ممثل Smart E-Commerce Price & Stock Monitor على Apify]( Smart E-Commerce Price & Stock Monitor · Apify ).

2. الصق عناوين URL منتجات التجارة الإلكترونية التي تريد تتبعها في **Product URLs to Monitor**.

3. انسخ عنوان URL Webhook الخاص بالإنتاج من n8n والصقه في **Webhook Target URL**.

### الخطوة 3: ربط Telegram

1. استبدل `YOUR_TELEGRAM_CHAT_ID` في عقدة n8n Telegram برقم معرّف دردشة Telegram أو معرّف القناة الفعلي.

2. اضغط على **Start** في Apify أو جدّول تشغيله كل 6-12 ساعة!

-–

## :hammer_and_wrench: مكدس التكنولوجيا والميزات

- **المحرك:** `got-scraping` + `CheerioCrawler` (لا توجد نفقات Chrome/Puppeteer الثقيلة).

- **الكشف التلقائي:** معالجة بيانات JSON-LD الدقيقة من Schema.org + 25+ محددات احتياطية بـ CSS.

- **الأمان:** حماية SSRF من عنوان IP الخاص المدمجة وتوقيعات طلب HMAC-SHA256 اختيارية.

آمل أن يساعدك سير العمل هذا في أتمتة تتبع المنافسين! أخبرني إذا كان لديك أي أسئلة أو ملاحظات.

كتابة جميلة. مقارنة الذاكرة العشوائية مقابل إعدادات Puppeteer هي الجزء الذي يقلل معظم الناس من تقديره.

هناك ثلاثة أشياء تميل إلى الإزعاج عند تشغيل هذا النمط لعدة أسابيع، في حالة كونها مفيدة:

تتغير المواقع JSON-LD الخاصة بها بدون تحذير. يقوم المتجر بتبديل المظهر أو نقل السعر إلى مصفوفة عروض متداخلة، يعيد المحلل قيمة null، وتستمر سير العمل في “النجاح” مع عدم وجود شيء فيه. يستحق الأمر إضافة فحص يفشل بصوت عالٍ عندما تعيد عملية الكشط منتجات صفرية بدلاً من السماح بمرورها بصمت.

تنبيهات مكررة. إذا كان المنتج يحوم حول حد معين، يمكنك الحصول على نفس انخفاض السعر يرسل ping إلى Telegram عدة مرات في الساعة. يؤدي تخزين بصمة المنتج والسعر وتخطي أي شيء أرسلته بالفعل في ذلك اليوم إلى إصلاح معظمها.

تحديد السرعة لكل نطاق بدلاً من العالم بأسره. يمكن لمتجر واحد بطيء أن يوقف التشغيل بالكامل إذا كان كل شيء يشترك في قائمة انتظار واحدة.

كيف تتعامل مع المتاجر التي تعرض السعر من جانب العميل فقط؟ هذا عادة حيث يتوقف نهج HTTP خفيف الوزن عن العمل ويعود الناس إلى متصفح، مما يقتل ميزة الذاكرة العشوائية.

أقدّر الشرح التفصيلي @Cloudrocket! أنت محق تماماً — تلك الحالات الاستثنائية الأربع هي عادة ما يحطّم أدوات الكشط في الإنتاج بعد بضعة أسابيع.

لقد حسّنت فعلاً الممثّل (Actor) للتعامل مع تلك النقاط بالذات:

  1. تغييرات المخطط: إذا انقطع JSON-LD، فإنه يعود إلى ~25 محدّد CSS. أضفت أيضاً فحص “فشل بصراحة” بحيث إذا لم يتم استخراج أي منتجات صحيحة، فإنه يطلق تنبيهاً واضحاً عبر webhook بدلاً من المرور بصمت.
  2. رسائل التنبيه المزعجة: أضفت إلغاء التكرار عبر MD5 hash لمدة 24 ساعة (url + price + stock) فوق حد النسبة المئوية، لذا تذبذبات الأسعار لن تغمر Telegram برسائل.
  3. توقف الطابور: تدير Crawlee التأخيرات لكل نطاق (1.5 ثانية) بشكل طبيعي، لذا الموقع البطيء لن يعرقل بقية الطابور.
  4. التطبيقات أحادية الصفحة (SPAs): يضع علامة jsRenderingRequired: true في المخرجات عندما يفتقد التحليل الثابت البيانات، مما يجعل الأمر واضحاً جداً متى يكون إعداد المتصفح مطلوباً.

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

إصلاحات جيدة. يغطي هذا معظم ما رأيته يحدث بشكل خاطئ مع هذه الإعدادات في الإنتاج.

شيء صغير واحد بخصوص إزالة التكرار: تجزئة العنوان + السعر + المخزون يعني أن حدث التكرار الحقيقي داخل نافذة 24 ساعة يتم حذفه. لنقل أن السعر ينخفض، ثم يعود لعدة ساعات، ثم ينخفض إلى نفس الرقم مرة أخرى. الانخفاض الثاني هو أخبار حقيقية لمن يراقبها، لكنه يتجزأ بشكل متطابق مع الأول ويتم تخطيه. إضافة علم اتجاه أو دلو زمني خشن إلى التجزئة يحافظ على حماية البريد العشوائي دون إخفاء هذه الحالة.

علم jsRenderingRequired هو لمسة لطيفة. معظم المكشطات تعيد فقط قيم null وتتركك تخمن ما إذا كان المحلل قد انقطع أم أن الصفحة تحتاج فعلاً إلى متصفح.

سأقوم بتشغيل العامل مقابل بضعة متاجر أراقبها بالفعل عندما يتوفر لدي بعض الوقت وسأعود بالنشر إذا ظهر أي شيء مثير للاهتمام.

آه يا إلهي، نقطة رائعة بشأن ارتداد السعر. فاتني تماماً أن سيناريو الانخفاض → الاستعادة → الانخفاض خلال 24 ساعة سيتم امتصاصه بواسطة التجزئة.

تحديث منطق التجزئة لتتبع الانتقال (prevPrice->currentPrice) بدلاً من مجرد تتبع الحالة المستهدفة بحيث تمر التنبيهات الشرعية عبر النظام.

شكراً على التنبيه! أخبرني كيف ستسير الاختبارات عندما تتمكن من إجراؤها.

تحديث سريع، لقد قمت بتنظيف كود قالب سير العمل n8n JSON بحيث يمكن الآن نسخه ولصقه مباشرة (Ctrl+V) في لوحة سير عمل n8n الخاصة بك بدون أي أخطاء تنسيق:

قمت أيضاً بتحديث محرك Apify Actor الأساسي للتعامل مع انتقالات ارتداد الأسعار بشكل نظيف.