Spaces:
Running
Running
| import torch | |
| import uvicorn | |
| import re | |
| from fastapi import FastAPI | |
| from pydantic import BaseModel | |
| from transformers import AutoTokenizer, AutoModelForSequenceClassification | |
| # --- الإضافة الجديدة هنا --- | |
| from fastapi.middleware.cors import CORSMiddleware | |
| # ------------------------- | |
| app = FastAPI() | |
| # --- إعدادات الـ CORS لفك الحظر --- | |
| app.add_middleware( | |
| CORSMiddleware, | |
| allow_origins=["*"], # يسمح لجميع المواقع بالوصول | |
| allow_credentials=True, | |
| allow_methods=["*"], # يسمح بجميع أنواع الطلبات (POST, GET, الخ) | |
| allow_headers=["*"], # يسمح بجميع الترويسات | |
| ) | |
| # -------------------------------- | |
| # اسم النموذج المستخدم | |
| MODEL_NAME = "vat75/PhishGuard-AI" | |
| # تحميل الـ Tokenizer والنموذج | |
| tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) | |
| model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME) | |
| model.eval() | |
| class MessageInput(BaseModel): | |
| text: str | |
| # كلمات مفتاحية ترفع احتمالية الاحتيال | |
| SCAM_KEYWORDS = [ | |
| "حدث بياناتك", "تحديث بياناتك", "حسابك البنكي", "بطاقتك الصراف", | |
| "ربحت", "جائزة", "مبروك", "فزت", "تجنب إيقاف", "حظر حسابك", | |
| "سارع", "اضغط الرابط", "اضغط هنا", "لديك طلب متوقف", | |
| "شحنتك متوقفة بسبب رسوم", "ادفع الان", "تم قبولك في وظيفة براتب عالي", | |
| "لديك هدية" | |
| ] | |
| # قائمة ببعض نطاقات الروابط المشبوهة | |
| SUSPICIOUS_DOMAINS = [ | |
| "bit.ly", "tinyurl.com", "t.co", "cutt.ly", "shorturl.at", | |
| "is.gd", "buff.ly", "ow.ly", "rebrand.ly" | |
| ] | |
| def contains_scam_indicators(text: str) -> bool: | |
| url_pattern = r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\(\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+' | |
| urls = re.findall(url_pattern, text) | |
| # فحص الروابط إن وجدت | |
| if urls: | |
| for url in urls: | |
| # 1. فحص إذا كان الرابط يستخدم خدمة اختصار روابط مشبوهة | |
| for domain in SUSPICIOUS_DOMAINS: | |
| if domain in url.lower(): | |
| return True | |
| # 2. فحص إذا كان النص المصاحب للرابط يحتوي على كلمات خطر | |
| for word in SCAM_KEYWORDS: | |
| if word in text: | |
| return True | |
| # 3. فحص الكلمات المفتاحية حتى لو لم يوجد رابط (رسائل احتيال نصية) | |
| for word in SCAM_KEYWORDS: | |
| if word in text: | |
| return True | |
| return False | |
| async def home(): | |
| return {"status": "Online"} | |
| async def analyze_text(input_data: MessageInput): | |
| try: | |
| text = input_data.text | |
| # 1. تحليل النص/الرابط باستخدام نموذج الذكاء الاصطناعي | |
| inputs = tokenizer(text, return_tensors="pt", truncation=True, padding=True, max_length=128) | |
| with torch.no_grad(): | |
| outputs = model(**inputs) | |
| probs = torch.nn.functional.softmax(outputs.logits, dim=-1) | |
| # 2. الحصول على الفئة المتوقعة ونسبة الثقة | |
| predicted_class = torch.argmax(probs, dim=-1).item() | |
| confidence = probs[0][predicted_class].item() * 100 | |
| # 3. منطق القرار (الاعتماد الكلي على الذكاء) | |
| if predicted_class == 1: | |
| # النموذج اكتشف أنه احتيال بناءً على تحليل عميق للرابط والنص | |
| verdict = "🚨 محاولة احتيال" | |
| final_confidence = confidence | |
| else: | |
| # النموذج يراه آمناً، هنا فقط نلقي نظرة سريعة على الكلمات الخطيرة جداً للتأكيد | |
| if contains_scam_indicators(text): | |
| # إذا النموذج قال آمن ولكن النص فيه "حدث بياناتك البنكية" (كلمات صريحة جداً) | |
| verdict = "🚨 محاولة احتيال" | |
| final_confidence = 90.0 # نعطي ثقة عالية لأن الكلمات صريحة | |
| else: | |
| verdict = "✅ نص آمن" | |
| final_confidence = confidence | |
| return { | |
| "verdict": verdict, | |
| "confidence": round(final_confidence, 2), | |
| "method": "AI Analysis" # لإظهار أن التحليل تم عبر الذكاء | |
| } | |
| except Exception as e: | |
| return {"error": str(e)} | |
| if __name__ == "__main__": | |
| uvicorn.run(app, host="0.0.0.0", port=7860) |