Spaces:
Sleeping
Sleeping
| from fastapi import FastAPI, Header, HTTPException, Request | |
| from pydantic import BaseModel | |
| from ai_threat_analyzer import ThreatAnalyzer | |
| import os | |
| import time | |
| import logging | |
| # محاولة استيراد Rate Limiter بشكل اختياري | |
| try: | |
| from fastapi_advanced_rate_limiter import SlidingWindowRateLimiter | |
| RATE_LIMITER_AVAILABLE = True | |
| except ImportError: | |
| RATE_LIMITER_AVAILABLE = False | |
| class SlidingWindowRateLimiter: | |
| def __init__(self, *args, **kwargs): pass | |
| def allow_request(self, client_id): return True | |
| def get_wait_time(self, client_id): return 0 | |
| # إعداد التسجيل | |
| logging.basicConfig( | |
| level=logging.INFO, | |
| format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', | |
| handlers=[logging.FileHandler('api.log'), logging.StreamHandler()] | |
| ) | |
| logger = logging.getLogger("guardianx") | |
| app = FastAPI() | |
| # قراءة مفتاح API من المتغيرات البيئية | |
| API_KEY = os.getenv("API_KEY", "guardian123") | |
| # إعداد Rate Limiter | |
| limiter = SlidingWindowRateLimiter(capacity=10, fill_rate=10/60, scope="user", backend="memory") | |
| analyzer = ThreatAnalyzer() | |
| class TextRequest(BaseModel): | |
| text: str | |
| def home(): | |
| return {"message": "GuardianX API is running"} | |
| async def predict(request: Request, data: TextRequest, x_api_key: str = Header(None)): | |
| if not x_api_key: | |
| logger.warning("طلب بدون مفتاح API") | |
| raise HTTPException(status_code=401, detail="API Key مفقود") | |
| if x_api_key != API_KEY: | |
| logger.warning(f"محاولة بمفتاح غير صالح: {x_api_key[:5]}...") | |
| raise HTTPException(status_code=403, detail="مفتاح غير صالح") | |
| if RATE_LIMITER_AVAILABLE: | |
| client_id = x_api_key | |
| if not limiter.allow_request(client_id): | |
| wait_time = limiter.get_wait_time(client_id) | |
| logger.warning(f"كثرة طلبات من المستخدم: {x_api_key[:5]}...") | |
| raise HTTPException(status_code=429, detail=f"عدد الطلبات كبير جداً. حاول بعد {wait_time:.0f} ثانية") | |
| start_time = time.time() | |
| try: | |
| result = analyzer.predict(data.text) | |
| processing_time = time.time() - start_time | |
| logger.info(f"مستخدم: {x_api_key[:5]}... | نص: {data.text[:30]}... | نتيجة: {result} | وقت: {processing_time:.2f}ث") | |
| return {"result": result} | |
| except Exception as e: | |
| logger.error(f"خطأ في التحليل: {str(e)}") | |
| raise HTTPException(status_code=500, detail="خطأ داخلي في السيرفر") |