العودة إلى المدونة

كيفية الحصول على إحصائيات استخدام البروكسي من خلال واجهة برمجة التطبيقات: أتمتة تتبع حركة المرور

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

📅٢٨ شعبان ١٤٤٧ هـ
```html

إذا كنت تعمل مع عدد كبير من البروكسيات - للتداول، أو الزحف، أو إدارة حسابات متعددة - فإن التحكم اليدوي في استهلاك حركة المرور يصبح كابوسًا. يسمح API لمزودي البروكسي بأتمتة الحصول على الإحصائيات: رصيد الحركة، الجلسات النشطة، الاستهلاك حسب عناوين IP وتاريخ الاستخدام. في هذا الدليل، سنستعرض كيفية دمج API لتتبع الإحصائيات من خلال أمثلة على التعليمات البرمجية بلغة Python وNode.js وcURL.

لماذا تحتاج إلى أتمتة إحصائيات البروكسي

عندما تدير 10-50 بروكسي لمشاريع مختلفة، فإن التحقق اليدوي من الرصيد واستهلاك الحركة عبر لوحة التحكم الخاصة بالمزود يصبح غير فعال. يحل API العديد من المهام الحرجة:

المهام الرئيسية لإحصائيات API:

  • مراقبة رصيد الحركة - إشعارات تلقائية عند الوصول إلى الحد الأقصى
  • التحكم في الاستهلاك حسب المشاريع - توزيع التكاليف بين العملاء أو المهام
  • تحليل الكفاءة - أي بروكسي تستهلك المزيد من الحركة ولماذا
  • منع التوقفات - إعادة شحن الرصيد قبل نفاد الحركة
  • التكامل في CRM/الفوترة - تتبع التكاليف على البروكسي بشكل تلقائي في العمليات التجارية

بالنسبة للمتداولين الذين يطلقون إعلانات عبر العديد من الحسابات، من الضروري معرفة أي البروكسيات نشطة وكم تبقى من الحركة - الحظر المفاجئ بسبب نفاد الحد قد يكلف آلاف الدولارات من الأرباح الضائعة. بالنسبة لوكالات SMM التي تدير حسابات العملاء على Instagram أو TikTok، فإن الأتمتة تسمح بإصدار فواتير دقيقة لاستخدام البروكسي.

يمكن لزواحف الأسواق (Wildberries، Ozon، Avito) التبديل تلقائيًا إلى بروكسي احتياطية عند نفاد الحد على البروكسيات الرئيسية. يوفر API القدرة على بناء أنظمة مقاومة للعطل تعمل على مدار الساعة دون تدخل يدوي.

أساسيات العمل مع API لمزودي البروكسي

تقدم معظم مزودي البروكسي الحديثين API RESTful لإدارة الخدمة. يعمل API وفقًا لنموذج قياسي: ترسل طلب HTTP إلى نقطة نهاية معينة مع معلمات المصادقة، ويعيد الخادم JSON مع البيانات.

مكون API الوصف مثال
Base URL العنوان الأساسي لمزود API https://api.provider.com/v1
المصادقة مفتاح API أو Bearer Token Authorization: Bearer YOUR_API_KEY
النقاط النهائية طرق محددة لعمليات مختلفة /statistics, /balance
تنسيق الاستجابة هيكل البيانات JSON مع الحقول status، data، error
حدود المعدل حدود الطلبات في الدقيقة 60-300 طلب/الدقيقة

الهيكل النموذجي لاستجابة JSON من مزود API للبروكسي يبدو كالتالي:

{
  "status": "success",
  "data": {
    "balance": 1250.50,
    "traffic_used_gb": 45.2,
    "traffic_remaining_gb": 54.8,
    "active_proxies": 15,
    "last_updated": "2024-01-15T10:30:00Z"
  },
  "error": null
}

عند العمل مع API، من المهم مراعاة حدود المعدل (القيود على عدد الطلبات). يسمح معظم المزودين بـ 60-300 طلب في الدقيقة. لمراقبة الإحصائيات، هذا أكثر من كافٍ - عادةً ما يتم إجراء الطلبات مرة كل 5-15 دقيقة.

المصادقة والحصول على مفتاح API

الخطوة الأولى للعمل مع API هي الحصول على مفتاح المصادقة. تختلف العملية بين المزودين، لكن المنطق العام هو نفسه:

خطوات الحصول على مفتاح API:

  1. قم بتسجيل الدخول إلى لوحة التحكم الخاصة بمزود البروكسي
  2. ابحث عن قسم "API" أو "الإعدادات" → "الوصول إلى API"
  3. اضغط على زر "إنشاء مفتاح API" أو "توليد رمز"
  4. انسخ المفتاح واحفظه في مكان آمن (يظهر مرة واحدة فقط)
  5. قم بإعداد قائمة بيضاء لعناوين IP، إذا كان المزود يتطلب ربطًا بعناوين IP
  6. تحقق من المفتاح من خلال طلب تجريبي باستخدام cURL أو Postman

هناك طريقتان رئيسيتان للمصادقة في API لمزودي البروكسي:

الطريقة كيف تعمل مثال على الرأس
Bearer Token يتم تمرير الرمز في رأس Authorization Authorization: Bearer abc123...
مفتاح API في المعلمات يتم تمرير المفتاح كمعلمة GET/POST ?api_key=abc123...

مهم: لا تخزن مفاتيح API في التعليمات البرمجية التي تصل إلى مستودع Git. استخدم متغيرات البيئة (ملفات .env) أو مديري الأسرار (AWS Secrets Manager، HashiCorp Vault). إذا تم تسريب المفتاح - قم بإلغائه على الفور في لوحة التحكم وولّد مفتاحًا جديدًا.

النقاط النهائية الرئيسية للحصول على الإحصائيات

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

النقطة النهائية الطريقة ما الذي يعيده
/balance GET الرصيد الحالي ورصيد الحركة
/statistics GET الإحصائيات العامة للاستخدام خلال الفترة
/statistics/proxy/{id} GET إحصائيات لبروكسي معين
/sessions/active GET قائمة الجلسات النشطة للبروكسي
/traffic/history GET تاريخ استهلاك الحركة حسب الأيام
/proxies/list GET قائمة بجميع البروكسيات مع حالاتهم

عادةً ما تشمل معلمات الطلبات النطاقات الزمنية والفلاتر:

GET /statistics?from=2024-01-01&to=2024-01-15&proxy_type=residential
GET /traffic/history?period=7d&group_by=day
GET /sessions/active?status=online&country=US

للعمل مع البروكسيات السكنية، تعتبر النقطة النهائية للحصول على إحصائيات الجلسات مهمة بشكل خاص، حيث تستخدم عادةً تدوير IP. يسمح API بتتبع عدد عناوين IP الفريدة التي تم استخدامها خلال فترة معينة وكمية الحركة التي مرت عبر كل جلسة.

أمثلة على التعليمات البرمجية بلغة Python للحصول على الإحصائيات

Python هي اللغة الأكثر شعبية لأتمتة العمل مع البروكسي بفضل مكتبة requests. دعونا نستعرض أمثلة عملية للحصول على الإحصائيات من خلال API.

طلب أساسي للحصول على الرصيد والحركة

import requests
import os
from datetime import datetime

# بيانات اعتماد API من متغيرات البيئة
API_KEY = os.getenv('PROXY_API_KEY')
BASE_URL = 'https://api.proxyprovider.com/v1'

def get_balance_statistics():
    """الحصول على الرصيد والإحصائيات العامة"""
    headers = {
        'Authorization': f'Bearer {API_KEY}',
        'Content-Type': 'application/json'
    }
    
    try:
        response = requests.get(
            f'{BASE_URL}/balance',
            headers=headers,
            timeout=10
        )
        response.raise_for_status()
        
        data = response.json()
        
        print(f"=== إحصائيات البروكسي في {datetime.now().strftime('%Y-%m-%d %H:%M')} ===")
        print(f"الرصيد: ${data['balance']:.2f}")
        print(f"استهلاك الحركة: {data['traffic_used_gb']:.2f} GB")
        print(f"رصيد الحركة: {data['traffic_remaining_gb']:.2f} GB")
        print(f"عدد البروكسيات النشطة: {data['active_proxies']}")
        
        return data
        
    except requests.exceptions.RequestException as e:
        print(f"خطأ في الطلب: {e}")
        return None

# استدعاء الدالة
stats = get_balance_statistics()

الحصول على إحصائيات مفصلة حسب الفترة

from datetime import datetime, timedelta
import requests

def get_traffic_history(days=7):
    """الحصول على تاريخ استهلاك الحركة خلال N يومًا"""
    headers = {'Authorization': f'Bearer {API_KEY}'}
    
    # حساب النطاق الزمني
    end_date = datetime.now()
    start_date = end_date - timedelta(days=days)
    
    params = {
        'from': start_date.strftime('%Y-%m-%d'),
        'to': end_date.strftime('%Y-%m-%d'),
        'group_by': 'day'
    }
    
    response = requests.get(
        f'{BASE_URL}/traffic/history',
        headers=headers,
        params=params,
        timeout=10
    )
    
    if response.status_code == 200:
        data = response.json()
        
        print(f"\n=== استهلاك الحركة خلال آخر {days} يومًا ===")
        for day in data['daily_stats']:
            print(f"{day['date']}: {day['traffic_gb']:.2f} GB "
                  f"({day['requests']} طلبات)")
        
        total = sum(day['traffic_gb'] for day in data['daily_stats'])
        print(f"\nالإجمالي خلال الفترة: {total:.2f} GB")
        
        return data
    else:
        print(f"خطأ {response.status_code}: {response.text}")
        return None

# الحصول على إحصائيات لمدة أسبوع
history = get_traffic_history(7)

مراقبة الإحصائيات لبروكسي معين

def get_proxy_statistics(proxy_id):
    """الحصول على إحصائيات لبروكسي معين"""
    headers = {'Authorization': f'Bearer {API_KEY}'}
    
    response = requests.get(
        f'{BASE_URL}/statistics/proxy/{proxy_id}',
        headers=headers,
        timeout=10
    )
    
    if response.status_code == 200:
        data = response.json()
        
        print(f"\n=== إحصائيات البروكسي {proxy_id} ===")
        print(f"عنوان IP: {data['ip_address']}")
        print(f"البلد: {data['country']}")
        print(f"النوع: {data['proxy_type']}")
        print(f"الحالة: {data['status']}")
        print(f"استهلاك الحركة: {data['traffic_used_mb']:.2f} MB")
        print(f"عدد الطلبات: {data['total_requests']}")
        print(f"آخر نشاط: {data['last_activity']}")
        
        return data
    else:
        print(f"البروكسي {proxy_id} غير موجود")
        return None

def get_all_proxies_stats():
    """الحصول على إحصائيات لجميع البروكسيات"""
    headers = {'Authorization': f'Bearer {API_KEY}'}
    
    # أولاً، نحصل على قائمة بجميع البروكسيات
    response = requests.get(
        f'{BASE_URL}/proxies/list',
        headers=headers,
        timeout=10
    )
    
    if response.status_code == 200:
        proxies = response.json()['proxies']
        
        print(f"\n=== إحصائيات لـ {len(proxies)} بروكسي ===\n")
        
        total_traffic = 0
        for proxy in proxies:
            stats = get_proxy_statistics(proxy['id'])
            if stats:
                total_traffic += stats['traffic_used_mb']
        
        print(f"\n=== إجمالي استهلاك الحركة: {total_traffic/1024:.2f} GB ===")
        
        return proxies
    else:
        print("خطأ في الحصول على قائمة البروكسيات")
        return None

# الحصول على إحصائيات لجميع البروكسيات
all_stats = get_all_proxies_stats()

توضح هذه الأمثلة العمل الأساسي مع API. بالنسبة للأنظمة الإنتاجية، أضف معالجة الأخطاء، ومنطق إعادة المحاولة عند فشل الشبكة، وتخزين النتائج مؤقتًا لتجنب تجاوز حدود المعدل للمزود.

أمثلة على التعليمات البرمجية بلغة Node.js لمراقبة الحركة

Node.js مثالي لإنشاء خدمات ميكروسيرفيس لمراقبة الحركة تعمل في الخلفية وترسل إشعارات عند حدوث أحداث حرجة. سنستخدم مكتبة axios للطلبات HTTP.

فئة أساسية للعمل مع API للبروكسي

const axios = require('axios');
require('dotenv').config();

class ProxyAPIClient {
  constructor() {
    this.baseURL = 'https://api.proxyprovider.com/v1';
    this.apiKey = process.env.PROXY_API_KEY;
    
    this.client = axios.create({
      baseURL: this.baseURL,
      timeout: 10000,
      headers: {
        'Authorization': `Bearer ${this.apiKey}`,
        'Content-Type': 'application/json'
      }
    });
  }

  async getBalance() {
    try {
      const response = await this.client.get('/balance');
      return response.data;
    } catch (error) {
      console.error('خطأ في الحصول على الرصيد:', error.message);
      throw error;
    }
  }

  async getStatistics(params = {}) {
    try {
      const response = await this.client.get('/statistics', { params });
      return response.data;
    } catch (error) {
      console.error('خطأ في الحصول على الإحصائيات:', error.message);
      throw error;
    }
  }

  async getTrafficHistory(days = 7) {
    const endDate = new Date();
    const startDate = new Date();
    startDate.setDate(startDate.getDate() - days);

    const params = {
      from: startDate.toISOString().split('T')[0],
      to: endDate.toISOString().split('T')[0],
      group_by: 'day'
    };

    try {
      const response = await this.client.get('/traffic/history', { params });
      return response.data;
    } catch (error) {
      console.error('خطأ في الحصول على تاريخ الحركة:', error.message);
      throw error;
    }
  }

  async getProxyStats(proxyId) {
    try {
      const response = await this.client.get(`/statistics/proxy/${proxyId}`);
      return response.data;
    } catch (error) {
      console.error(`خطأ في الحصول على إحصائيات البروكسي ${proxyId}:`, error.message);
      throw error;
    }
  }
}

module.exports = ProxyAPIClient;

المراقبة التلقائية مع الإشعارات

const ProxyAPIClient = require('./ProxyAPIClient');
const nodemailer = require('nodemailer');

class ProxyMonitor {
  constructor(checkIntervalMinutes = 15) {
    this.api = new ProxyAPIClient();
    this.checkInterval = checkIntervalMinutes * 60 * 1000;
    this.thresholds = {
      trafficWarning: 10, // GB - تحذير
      trafficCritical: 5,  // GB - مستوى حرج
      balanceWarning: 50   // USD - تحذير عن الرصيد
    };
  }

  async checkAndNotify() {
    try {
      const balance = await this.api.getBalance();
      
      console.log(`[${new Date().toISOString()}] التحقق من الإحصائيات...`);
      console.log(`الرصيد: $${balance.balance.toFixed(2)}`);
      console.log(`رصيد الحركة: ${balance.traffic_remaining_gb.toFixed(2)} GB`);

      // التحقق من الحدود الحرجة
      const alerts = [];

      if (balance.traffic_remaining_gb <= this.thresholds.trafficCritical) {
        alerts.push({
          level: 'critical',
          message: `مستوى حركة حرج: تبقى ${balance.traffic_remaining_gb.toFixed(2)} GB!`
        });
      } else if (balance.traffic_remaining_gb <= this.thresholds.trafficWarning) {
        alerts.push({
          level: 'warning',
          message: `حركة منخفضة: تبقى ${balance.traffic_remaining_gb.toFixed(2)} GB`
        });
      }

      if (balance.balance <= this.thresholds.balanceWarning) {
        alerts.push({
          level: 'warning',
          message: `رصيد منخفض: $${balance.balance.toFixed(2)}`
        });
      }

      // إرسال الإشعارات
      if (alerts.length > 0) {
        await this.sendAlerts(alerts, balance);
      }

      return { balance, alerts };
    } catch (error) {
      console.error('خطأ في المراقبة:', error);
      await this.sendErrorNotification(error);
    }
  }

  async sendAlerts(alerts, balance) {
    console.log('\n⚠️  انتباه! تم اكتشاف مشاكل:');
    alerts.forEach(alert => {
      console.log(`[${alert.level.toUpperCase()}] ${alert.message}`);
    });

    // إرسال البريد الإلكتروني (قم بإعداد SMTP)
    const transporter = nodemailer.createTransport({
      host: process.env.SMTP_HOST,
      port: process.env.SMTP_PORT,
      auth: {
        user: process.env.SMTP_USER,
        pass: process.env.SMTP_PASS
      }
    });

    const emailBody = `
      تم اكتشاف مشاكل مع البروكسي:
      
      ${alerts.map(a => `- ${a.message}`).join('\n')}
      
      الإحصائيات الحالية:
      - الرصيد: $${balance.balance.toFixed(2)}
      - رصيد الحركة: ${balance.traffic_remaining_gb.toFixed(2)} GB
      - استهلك: ${balance.traffic_used_gb.toFixed(2)} GB
      - بروكسيات نشطة: ${balance.active_proxies}
      
      يُوصى بإعادة شحن الرصيد أو تقليل الحمل.
    `;

    await transporter.sendMail({
      from: process.env.ALERT_FROM_EMAIL,
      to: process.env.ALERT_TO_EMAIL,
      subject: '⚠️ تحذير عن البروكسي',
      text: emailBody
    });
  }

  start() {
    console.log(`بدء مراقبة البروكسي (التحقق كل ${this.checkInterval / 60000} دقيقة)`);
    
    // أول تحقق على الفور
    this.checkAndNotify();
    
    // تحقق دوري
    setInterval(() => {
      this.checkAndNotify();
    }, this.checkInterval);
  }
}

// بدء المراقبة
const monitor = new ProxyMonitor(15); // تحقق كل 15 دقيقة
monitor.start();

يقوم هذا الكود بإنشاء خدمة خلفية تتحقق من الإحصائيات كل 15 دقيقة وترسل إشعارات عبر البريد الإلكتروني عند الوصول إلى الحدود الحرجة. بالنسبة لـ البروكسيات المحمولة، التي تكون عادةً أغلى من السكنية، فإن هذه المراقبة مهمة بشكل خاص للتحكم في النفقات.

أمثلة على الطلبات من خلال cURL

cURL هي أداة شاملة لاختبار API من سطر الأوامر. مفيدة للتحقق السريع من النقاط النهائية وتصحيح الأخطاء في التكاملات.

الحصول على الرصيد

# الطلب الأساسي للحصول على الرصيد
curl -X GET "https://api.proxyprovider.com/v1/balance" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json"

# مع تنسيق JSON جميل (من خلال jq)
curl -X GET "https://api.proxyprovider.com/v1/balance" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  | jq '.'

# استخراج حقل معين
curl -s "https://api.proxyprovider.com/v1/balance" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  | jq '.traffic_remaining_gb'

الحصول على إحصائيات لفترة معينة

# إحصائيات آخر 7 أيام
curl -X GET "https://api.proxyprovider.com/v1/traffic/history?from=2024-01-08&to=2024-01-15&group_by=day" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  | jq '.daily_stats'

# إحصائيات لنوع بروكسي معين
curl -X GET "https://api.proxyprovider.com/v1/statistics?proxy_type=residential&country=US" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  | jq '.'

الحصول على قائمة بالبروكسيات النشطة

# قائمة بجميع البروكسيات النشطة
curl -X GET "https://api.proxyprovider.com/v1/proxies/list?status=active" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  | jq '.proxies[] | {id, ip_address, country, proxy_type}'

# حساب عدد البروكسيات النشطة
curl -s "https://api.proxyprovider.com/v1/proxies/list?status=active" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  | jq '.proxies | length'

سكريبت Bash للتحقق التلقائي

#!/bin/bash

# الإعدادات
API_KEY="YOUR_API_KEY"
BASE_URL="https://api.proxyprovider.com/v1"
TRAFFIC_THRESHOLD=10  # GB - حد التحذير

# الحصول على الإحصائيات
response=$(curl -s "${BASE_URL}/balance" \
  -H "Authorization: Bearer ${API_KEY}")

# تحليل JSON
traffic_remaining=$(echo "$response" | jq -r '.traffic_remaining_gb')
balance=$(echo "$response" | jq -r '.balance')
active_proxies=$(echo "$response" | jq -r '.active_proxies')

# طباعة الإحصائيات
echo "=== إحصائيات البروكسي $(date '+%Y-%m-%d %H:%M:%S') ==="
echo "رصيد الحركة: ${traffic_remaining} GB"
echo "الرصيد: \$${balance}"
echo "عدد البروكسيات النشطة: ${active_proxies}"

# التحقق من الحدود
if (( $(echo "$traffic_remaining < $TRAFFIC_THRESHOLD" | bc -l) )); then
  echo "⚠️  انتباه: حركة منخفضة! تبقى ${traffic_remaining} GB"
  
  # إرسال إشعار (على سبيل المثال، عبر Telegram)
  # curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
  #   -d chat_id="${TELEGRAM_CHAT_ID}" \
  #   -d text="⚠️ حركة منخفضة للبروكسي: ${traffic_remaining} GB"
fi

احفظ هذا السكريبت كـ check_proxy_stats.sh، امنح أذونات التنفيذ (chmod +x check_proxy_stats.sh) وأضفه إلى cron للتشغيل التلقائي كل ساعة:

0 * * * * /path/to/check_proxy_stats.sh >> /var/log/proxy_monitor.log 2>&1

أتمتة المراقبة والإشعارات

إن التحقق اليدوي من الإحصائيات غير فعال - تحتاج إلى أتمتة مع إشعارات ذكية. دعونا نستعرض نظام مراقبة كامل مع تكاملات.

التكامل مع Telegram للإشعارات

import requests
import os
from datetime import datetime

class TelegramNotifier:
    def __init__(self):
        self.bot_token = os.getenv('TELEGRAM_BOT_TOKEN')
        self.chat_id = os.getenv('TELEGRAM_CHAT_ID')
        self.base_url = f'https://api.telegram.org/bot{self.bot_token}'
    
    def send_message(self, text, parse_mode='Markdown'):
        """إرسال رسالة إلى Telegram"""
        url = f'{self.base_url}/sendMessage'
        payload = {
            'chat_id': self.chat_id,
            'text': text,
            'parse_mode': parse_mode
        }
        
        try:
            response = requests.post(url, json=payload, timeout=10)
            return response.status_code == 200
        except Exception as e:
            print(f"خطأ في الإرسال إلى Telegram: {e}")
            return False

def monitor_proxy_with_telegram():
    """المراقبة مع الإشعارات في Telegram"""
    api = ProxyAPIClient()
    notifier = TelegramNotifier()
    
    try:
        balance = api.get_balance()
        
        # تشكيل الرسالة
        message = f"""
📊 *إحصائيات البروكسي* ({datetime.now().strftime('%H:%M %d.%m.%Y')})

💰 الرصيد: ${balance['balance']:.2f}
📈 استهلك: {balance['traffic_used_gb']:.2f} GB
📉 تبقى: {balance['traffic_remaining_gb']:.2f} GB
🔌 عدد البروكسيات النشطة: {balance['active_proxies']}
        """
        
        # التحقق من الحدود الحرجة
        if balance['traffic_remaining_gb'] < 5:
            message += "\n⚠️ *حركة منخفضة بشكل حرج!*"
            notifier.send_message(message)
        elif balance['traffic_remaining_gb'] < 10:
            message += "\n⚡ يُوصى بإعادة شحن الحركة"
            notifier.send_message(message)
        
        return balance
        
    except Exception as e:
        error_msg = f"❌ *خطأ في مراقبة البروكسي*\n\n{str(e)}"
        notifier.send_message(error_msg)
        raise

# بدء المراقبة
monitor_proxy_with_telegram()

التكامل مع Slack

import requests
import json

class SlackNotifier:
    def __init__(self, webhook_url):
        self.webhook_url = webhook_url
    
    def send_alert(self, title, message, level='warning'):
        """إرسال إشعار إلى Slack"""
        color = {
            'info': '#36a64f',
            'warning': '#ff9900',
            'critical': '#ff0000'
        }.get(level, '#cccccc')
        
        payload = {
            'attachments': [{
                'color': color,
                'title': title,
                'text': message,
                'footer': 'مراقبة البروكسي',
                'ts': int(datetime.now().timestamp())
            }]
        }
        
        try:
            response = requests.post(
                self.webhook_url,
                data=json.dumps(payload),
                headers={'Content-Type': 'application/json'},
                timeout=10
            )
            return response.status_code == 200
        except Exception as e:
            print(f"خطأ في الإرسال إلى Slack: {e}")
            return False

def check_proxy_health():
    """التحقق من صحة البروكسي مع الإشعارات"""
    api = ProxyAPIClient()
    slack = SlackNotifier(os.getenv('SLACK_WEBHOOK_URL'))
    
    balance = api.get_balance()
    proxies = api.get_all_proxies()
    
    # تحليل الحالة
    offline_proxies = [p for p in proxies if p['status'] != 'active']
    
    if len(offline_proxies) > 0:
        message = f"تم اكتشاف {len(offline_proxies)} بروكسيات غير نشطة:\n"
        for proxy in offline_proxies[:5]:  # أول 5
            message += f"- {proxy['ip_address']} ({proxy['country']})\n"
        
        slack.send_alert(
            'بروكسيات غير نشطة',
            message,
            level='warning'
        )
    
    if balance['traffic_remaining_gb'] < 5:
        slack.send_alert(
            'حركة منخفضة بشكل حرج!',
            f"تبقى {balance['traffic_remaining_gb']:.2f} GB. "
            f"الرصيد: ${balance['balance']:.2f}",
            level='critical'
        )

check_proxy_health()

إعداد إعادة الشحن التلقائي

يسمح بعض المزودين من خلال API ليس فقط بالحصول على الإحصائيات، ولكن أيضًا بإعادة شحن الرصيد تلقائيًا عند الوصول إلى الحد:

def auto_topup_if_needed(threshold_gb=10, topup_amount_usd=100):
    """إعادة الشحن التلقائي عند انخفاض الرصيد"""
    api = ProxyAPIClient()
    
    balance = api.get_balance()
    
    if balance['traffic_remaining_gb'] < threshold_gb:
        print(f"الحركة أقل من الحد ({threshold_gb} GB)، بدء عملية إعادة الشحن...")
        
        # طلب إعادة الشحن من خلال API
        topup_response = requests.post(
            f'{api.base_url}/billing/topup',
            headers={'Authorization': f'Bearer {api.api_key}'},
            json={
                'amount': topup_amount_usd,
                'payment_method': 'card',
                'auto_topup': True
            },
            timeout=10
        )
        
        if topup_response.status_code == 200:
            print(f"✅ تم إعادة شحن الرصيد بمقدار ${topup_amount_usd}")
            
            # إرسال إشعار
            notifier = TelegramNotifier()
            notifier.send_message(
                f"💳 إعادة شحن تلقائية\n\n"
                f"المبلغ: ${topup_amount_usd}\n"
                f"كان هناك حركة: {balance['traffic_remaining_gb']:.2f} GB\n"
                f"السبب: تم الوصول إلى الحد {threshold_gb} GB"
            )
        else:
            print(f"❌ خطأ في إعادة الشحن: {topup_response.text}")
    else:
        print(f"الحركة كافية: {balance['traffic_remaining_gb']:.2f} GB")

# بدء التحقق (يمكن إضافته إلى cron)
auto_topup_if_needed()

إنشاء لوحة تحكم خاصة بالإحصائيات

لتصور البيانات من API، يمكنك إنشاء لوحة تحكم ويب مع الرسوم البيانية لاستهلاك الحركة، والتوزيع حسب البلدان وأنواع البروكسي. دعونا نستعرض مثالًا بسيطًا باستخدام Flask + Chart.js.

الجهة الخلفية على Flask

from flask import Flask, jsonify, render_template
from datetime import datetime, timedelta
import requests

app = Flask(__name__)

class ProxyDashboard:
    def __init__(self):
        self.api_key = os.getenv('PROXY_API_KEY')
        self.base_url = 'https://api.proxyprovider.com/v1'
    
    def get_dashboard_data(self):
        """الحصول على جميع البيانات للوحة التحكم"""
        headers = {'Authorization': f'Bearer {self.api_key}'}
        
        # الرصيد والإحصائيات العامة
        balance = requests.get(
            f'{self.base_url}/balance',
            headers=headers
        ).json()
        
        # التاريخ خلال آخر 30 يومًا
        end_date = datetime.now()
        start_date = end_date - timedelta(days=30)
        
        history = requests.get(
            f'{self.base_url}/traffic/history',
            headers=headers,
            params={
                'from': start_date.strftime('%Y-%m-%d'),
                'to': end_date.strftime('%Y-%m-%d'),
                'group_by': 'day'
            }
        ).json()
        
        # قائمة البروكسيات
        proxies = requests.get(
            f'{self.base_url}/proxies/list',
            headers=headers
        ).json()
        
        # تجميع البيانات
        traffic_by_country = {}
        traffic_by_type = {}
        
        for proxy in proxies.get('proxies', []):
            country = proxy.get('country', 'غير معروف')
            proxy_type = proxy.get('proxy_type', 'غير معروف')
            traffic = proxy.get('traffic_used_mb', 0) / 1024  # بالـ GB
            
            traffic_by_country[country] = traffic_by_country.get(country, 0) + traffic
            traffic_by_type[proxy_type] = traffic_by_type.get(proxy_type, 0) + traffic
        
        return {
            'balance': balance,
            'history': history.get('daily_stats', []),
            'traffic_by_country': traffic_by_country,
            'traffic_by_type': traffic_by_type,
            'total_proxies': len(proxies.get('proxies', []))
        }

dashboard = ProxyDashboard()

@app.route('/')
def index():
    """الصفحة الرئيسية للوحة التحكم"""
    return render_template('dashboard.html')

@app.route('/api/stats')
def get_stats():
    """نقطة نهاية API للحصول على الإحصائيات"""
    try:
        data = dashboard.get_dashboard_data()
        return jsonify(data)
    except Exception as e:
        return jsonify({'error': str(e)}), 500

if __name__ == '__main__':
    app.run(debug=True, port=5000)

الواجهة الأمامية مع الرسوم البيانية (dashboard.html)

<!DOCTYPE html>
<html>
<head>
  <title>لوحة تحكم إحصائيات البروكسي</title>
  <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
  <style>
    body { font-family: Arial, sans-serif; padding: 20px; background: #f5f5f5; }
    .stats-card { background: white; padding: 20px; margin: 10px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }
    .stat-value { font-size: 2rem; font-weight: bold; color: #2563eb; }
    .chart-container { height: 300px; margin: 20px 0; }
  </style>
</head>
<body>
  <h1>📊 لوحة تحكم إحصائيات البروكسي</h1>
  
  <div style="display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px;">
    <div class="stats-card">
      <div>الرصيد</div>
      <div class="stat-value" id="balance">-</div>
    </div>
    <div class="stats-card">
      <div>رصيد الحركة</div>
      <div class="stat-value" id="traffic-remaining">-</div>
    </div>
    <div class="stats-card">
      <div>استهلك</div>
      <div class="stat-value" id="traffic-used">-</div>
    </div>
    <div class="stats-card">
      <div>عدد البروكسيات النشطة</div>
      <div class="stat-value" id="active-proxies">-</div>
    </div>
  </div>

  <div class="chart-container">
    <canvas id="trafficChart"></canvas>
  </div>

  <script>
    async function fetchStats() {
      const response = await fetch('/api/stats');
      const data = await response.json();
      
      document.getElementById('balance').innerText = data.balance.balance;
      document.getElementById('traffic-remaining').innerText = data.balance.traffic_remaining_gb;
      document.getElementById('traffic-used').innerText = data.balance.traffic_used_gb;
      document.getElementById('active-proxies').innerText = data.balance.active_proxies;

      const ctx = document.getElementById('trafficChart').getContext('2d');
      const chart = new Chart(ctx, {
        type: 'line',
        data: {
          labels: data.history.map(stat => stat.date),
          datasets: [{
            label: 'استهلاك الحركة (GB)',
            data: data.history.map(stat => stat.traffic_gb),
            borderColor: 'rgba(75, 192, 192, 1)',
            borderWidth: 2,
            fill: false
          }]
        },
        options: {
          responsive: true,
          scales: {
            y: {
              beginAtZero: true
            }
          }
        }
      });
    }

    fetchStats();
  </script>
</body>
</html>
```