PhishGuard-AI / app.py
vat75's picture
Update app.py
db4d10f verified
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)