إذا كنت تعمل مع عدد كبير من البروكسيات - للتداول، أو الزحف، أو إدارة حسابات متعددة - فإن التحكم اليدوي في استهلاك حركة المرور يصبح كابوسًا. يسمح 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:
- قم بتسجيل الدخول إلى لوحة التحكم الخاصة بمزود البروكسي
- ابحث عن قسم "API" أو "الإعدادات" → "الوصول إلى API"
- اضغط على زر "إنشاء مفتاح API" أو "توليد رمز"
- انسخ المفتاح واحفظه في مكان آمن (يظهر مرة واحدة فقط)
- قم بإعداد قائمة بيضاء لعناوين IP، إذا كان المزود يتطلب ربطًا بعناوين IP
- تحقق من المفتاح من خلال طلب تجريبي باستخدام 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>