Spaces:
Running
Running
File size: 4,799 Bytes
4f9b027 8c21cc3 4f9b027 15c4f72 34c130f 15c4f72 bf3fd73 8c21cc3 15c4f72 34c130f 15c4f72 34c130f 15c4f72 34c130f 15c4f72 34c130f 8c21cc3 4f9b027 28e2306 8c21cc3 34c130f 8c21cc3 34c130f 8c21cc3 a77a549 8c21cc3 d44c899 8c21cc3 d44c899 8c21cc3 d44c899 8c21cc3 d44c899 8c21cc3 d44c899 8c21cc3 566a7ae d44c899 8c21cc3 db4d10f 8c21cc3 db4d10f 8c21cc3 db4d10f 8c21cc3 db4d10f 8c21cc3 db4d10f 8c21cc3 db4d10f 8c21cc3 db4d10f 8c21cc3 15c4f72 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | 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
@app.get("/")
async def home():
return {"status": "Online"}
@app.post("/analyze")
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) |