Pricing

مراقبة الأسعار عبر المناطق للسفر وSaaS

5 min read Published Updated 896 words

غرفة فندق في باريس مُدرجة بسعر 200 يورو على Booking.com عند الوصول من عنوان IP فرنسي، بينما ترتفع إلى 260 يورو عندما يصل نفس المتصفح إلى نفس الرابط من عنوان IP أمريكي. هذا ليس أثرًا لتحويل العملة — بل هو تسعير ديناميكي متعمّد يعتمد على الموقع الجغرافي. بالنسبة للبرمجيات كخدمة (SaaS)، يمكن أن يختلف سعر نفس المقعد في Slack أو Jira بنسبة 40% بين الولايات المتحدة والهند. تتطلب مراقبة هذه الفروقات السعرية على نطاق واسع بنية تحتية للبروكسي تصمد أمام أنظمة مكافحة الاحتيال نفسها التي تنشرها شركات الطيران ومزودو الخدمات السحابية ضد أدوات الكشط.

لماذا يختلف سعر نفس المنتج (SKU) عبر الحدود

ثلاث آليات تُحرّك التسعير القائم على المراجحة الجغرافية. أولاً، تحويل العملة مع هوامش خفية — محرك حجز الفندق يطبق فارق سعر صرف (FX spread) بنسبة 3-5% يختلف حسب البلد. ثانيًا، الأنظمة الضريبية المحلية: ضريبة القيمة المضافة (VAT) في الاتحاد الأوروبي، وضريبة السلع والخدمات (GST) في الهند، وضريبة المبيعات في الولايات المتحدة. ثالثًا، والأكثر عدوانية، التسعير الديناميكي القائم على الطلب. رحلة طيران من لندن إلى نيويورك على الخطوط الجوية البريطانية تظهر سعرًا أعلى عندما يأتي الطلب من عنوان IP بريطاني مقارنة بعنوان IP ألماني، لأن الخوارزمية تفترض أن المسافرين البريطانيين لديهم استعداد أعلى للدفع. مزودو SaaS مثل Atlassian و Salesforce يحتفظون بقوائم أسعار منفصلة لكل منطقة، غالبًا بخصومات تتراوح بين 30-50% للأسواق الناشئة. الطريقة الوحيدة لالتقاط هذه الأسعار برمجيًا هي جعل الطلب يبدو وكأنه قادم من كل سوق مستهدف.

بنية البروكسي لالتقاط الأسعار عبر مناطق متعددة

مجموعة بروكسي سكني واحد لا تكفي. أنت بحاجة إلى مجموعة من عُقد الخروج (exit nodes) تتطابق مع البلد والمدينة، وأحيانًا حتى مع مزود الخدمة (مثل مزود إنترنت محمول فرنسي مقابل خط DSL سكني فرنسي). النهج القياسي يستخدم وسيط بروكسي (proxy broker) يحتفظ بقائمة دوارة من البروكسيات الموثقة. فيما يلي أمر curl بسيط يجلب سعر فندق من بروكسي فرنسي، مع تعيين رأس Accept-Language إلى fr-FR وإرسال User-Agent واقعي من إصدار Chrome حديث:

curl -s -x "http://user:pass@fr-proxy.example.com:3128" \
  -H "Accept-Language: fr-FR,fr;q=0.9" \
  -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" \
  "https://www.booking.com/hotel/fr/paris-ritz.html" | grep -oP '"price":"[^"]+"'

هذا الأمر الواحد سيفشل بنسبة 60-80% من الوقت إذا كان البروكسي معروفًا لخدمة كشف البوتات مثل DataDome أو Akamai. ينخفض معدل الفشل فقط عندما تجمع بين تدوير البروكسي مع استمرارية الجلسة (session persistence) وبصمة الرؤوس (header fingerprinting) التي تتطابق مع مزود الإنترنت الحقيقي للبروكسي.

كشف الاحتيال بواسطة البوتات: عنق الزجاجة الحقيقي

منصات السفر و SaaS تستثمر بكثافة في كشف البوتات. إنها لا تتحقق فقط من سمعة عنوان IP، بل أيضًا من بصمة مصافحة TLS (JA3)، وإعدادات HTTP/2، والتفاوت الزمني (timing jitter)، وترتيب رؤوس HTTP. بروكسي يجتاز فحصًا واحدًا قد يفشل في آخر. على سبيل المثال، بروكسي مركز بيانات (datacenter proxy) بعنوان IP نظيف ولكن بصمة JA3 تطابق أداة كشط معروفة سيتم حظره فورًا. البروكسيات السكنية ليست محصنة — فالعديد منها مصدره أجهزة مصابة ويظهر في القوائم السوداء. الإستراتيجية الأكثر فعالية هي استخدام مجموعة بروكسي مخصصة اختبرتها ضد نظام الكشف الخاص بالموقع المستهدف. توقع معدل نجاح يتراوح بين 10-20% لكل بروكسي حتى في الظروف المثالية. هذا يعني أنك تحتاج إلى 5-10 بروكسيات على الأقل لكل منطقة مستهدفة للحفاظ على معدل كشط مستقر يبلغ طلبًا واحدًا كل 5-10 ثوانٍ.

هنا تكمن المقايضة: جودة البروكسي الأعلى (سكني، عناوين IP ثابتة، سمعة عالية) تكلف 10 أضعاف بروكسيات مراكز البيانات، لكن معدل النجاح قد يتضاعف فقط. بالنسبة لعملية مراقبة أسعار تتعامل مع 100 منتج (SKU) في الساعة عبر 10 مناطق، يمكن أن تتجاوز فاتورة البروكسي الشهرية 2,000 دولار. البديل — استخدام البروكسيات العامة المجانية — غير قابل للتطبيق لأن عناوين IP الخاصة بها مُعلَمة بالفعل من قبل كل خدمة رئيسية لمكافحة البوتات. طلب واحد من بروكسي مجاني سيؤدي إلى ظهور اختبار CAPTCHA أو استجابة 403.

سير العمل العملي: تحديد المعدل، فترات التهدئة للـ IP، ومعالجة الأخطاء

يجب على أداة الكشط الخاصة بك تنفيذ آلة حالة (state machine) لكل عنوان IP بروكسي. بعد طلب ناجح، يدخل البروكسي في فترة تهدئة (cooldown) — 30 ثانية لمواقع الفنادق، 60 ثانية للوحات تحكم SaaS. بعد فشل (HTTP 403، 429، أو صفحة CAPTCHA)، تمتد فترة التهدئة إلى 5 دقائق ويتم وضع علامة على البروكسي لإعادة التقييم. استخدم محدِّد معدل من نوع token bucket يفرض حدًا أقصى عالميًا، على سبيل المثال، طلبين في الثانية عبر جميع البروكسيات. المقتطف التالي بلغة Python (باستخدام asyncio و aiohttp) يوضح الحلقة الأساسية:

import asyncio, aiohttp, random

PROXY_POOL = [{"url": "http://user:pass@fr1:3128", "cooldown_until": 0}]

async def fetch_price(session, proxy, url):
    now = asyncio.get_event_loop().time()
    if now < proxy["cooldown_until"]:
        await asyncio.sleep(proxy["cooldown_until"] - now)
    try:
        async with session.get(url, proxy=proxy["url"],
                               headers={"Accept-Language": "fr-FR"}) as resp:
            if resp.status == 200:
                proxy["cooldown_until"] = now + 30
                return await resp.text()
            else:
                proxy["cooldown_until"] = now + 300
                return None
    except Exception:
        proxy["cooldown_until"] = now + 300
        return None

أضف تأخيرًا أسيًا (exponential backoff) للفشل المتتالي من نفس البروكسي — بعد ثلاثة أخطاء، تقاعد عنوان IP هذا لمدة 24 ساعة. راقب نسبة الاستجابات الناجحة إلى إجمالي المحاولات؛ إذا انخفضت عن 20% لمنطقة ما، قم بتدوير مجموعة البروكسي بأكملها لذلك البلد. أخيرًا، سجّل كل رأس استجابة، خاصة Set-Cookie و X-Frame-Options، لأنها تكشف ما إذا كان الموقع يشغل سكريبت كشف بوتات يتطلب تنفيذ JavaScript. بالنسبة للمواقع التي تعتمد على العرض من جانب العميل (client-side rendering)، يجب عليك التبديل إلى متصفح بدون واجهة رسومية (headless browser) مثل Playwright أو Puppeteer، مما يضيف مرتبة أخرى من حيث زمن الاستجابة وتكلفة البروكسي. مراقبة الأسعار عبر المناطق ليست مشروع عطلة نهاية أسبوع — إنها استثمار هندسي مستمر يتطلب ضبطًا مستمرًا ضد هدف متحرك.