secure / app.py
nareauow's picture
Update app.py
7fd37ac verified
#!/usr/bin/env python3
"""
SecureX - Version Gradio
Détection de fraude téléphonique avec interface web
"""
import re
from datetime import datetime
import gradio as gr
class FraudDetector:
def __init__(self):
self.patterns = [
{
"name": "fake_advisor",
"keywords": ["conseiller", "banque", "urgent", "code", "confirmer"],
"weight": 0.9,
"description": "Imitation de conseiller bancaire"
},
{
"name": "fake_refund",
"keywords": ["remboursement", "argent", "erreur", "virement"],
"weight": 0.8,
"description": "Promesse de remboursement suspecte"
},
{
"name": "credential_theft",
"keywords": ["mot de passe", "identifiant", "code secret", "pin"],
"weight": 0.95,
"description": "Demande d'informations sensibles"
}
]
def analyze(self, text):
"""Analyse le texte et retourne les résultats"""
if not text.strip():
return 0.0, [], "Erreur: Veuillez entrer un texte à analyser"
text_lower = text.lower()
total_score = 0.0
detected_patterns = []
# Analyse des motifs
for pattern in self.patterns:
matches = [word for word in pattern["keywords"] if word in text_lower]
if matches:
score = (len(matches) / len(pattern["keywords"])) * pattern["weight"]
total_score += score
detected_patterns.append({
"pattern": pattern["name"],
"description": pattern["description"],
"keywords": matches,
"score": f"+{score:.2f}"
})
# Détection d'urgence
urgency_words = ["urgent", "immédiat", "vite", "maintenant"]
urgency_count = sum(1 for word in urgency_words if word in text_lower)
if urgency_count >= 2:
urgency_score = min(0.3, urgency_count * 0.1)
total_score += urgency_score
detected_patterns.append({
"pattern": "high_urgency",
"description": f"Langage urgent ({urgency_count} mots)",
"keywords": [],
"score": f"+{urgency_score:.2f}"
})
total_score = min(total_score, 1.0)
# Génération du rapport
report = self.generate_report(total_score, detected_patterns)
return total_score, detected_patterns, report
def generate_report(self, score, patterns):
"""Génère un rapport détaillé"""
report = f"# 📊 Rapport d'analyse - Score: {score:.0%}\n\n"
if score > 0.75:
report += "## 🚨 ALERTE FRAUDE ÉLEVÉE\n"
report += "**Action recommandée:**\n"
report += "- Terminez immédiatement l'appel\n"
report += "- Contactez votre banque au numéro officiel\n"
report += "- Ne donnez aucune information\n"
elif score > 0.5:
report += "## ⚠️ RISQUE MODÉRÉ\n"
report += "**Soyez vigilant:**\n"
report += "- Vérifiez l'identité de l'interlocuteur\n"
report += "- Ne confirmez pas d'informations sensibles\n"
else:
report += "## ✅ RISQUE FAIBLE\n"
report += "Aucun indicateur de fraude majeur détecté\n"
if patterns:
report += "\n## 🔍 Détections spécifiques:\n"
for p in patterns:
report += f"\n- **{p['description']}** {p['score']}\n"
if p['keywords']:
report += f" - Mots-clés: {', '.join(p['keywords'])}\n"
report += f"\n_Analyse effectuée le {datetime.now().strftime('%d/%m/%Y à %H:%M')}_"
return report
# Création de l'instance
detector = FraudDetector()
# Exemples prédéfinis
examples = [
["Bonjour je suis votre conseiller bancaire. Confirmez votre code secret URGENT pour éviter le blocage!"],
["Félicitations! Vous avez droit à un remboursement. Donnez votre numéro de carte pour le traitement."],
["Rappel: votre rendez-vous en agence est confirmé pour demain 14h."]
]
# Interface Gradio
with gr.Blocks(title="SecureX - Détection de Fraude", theme=gr.themes.Soft()) as app:
gr.Markdown("# 🛡️ SecureX - Détection de Fraude Téléphonique")
with gr.Row():
with gr.Column():
input_text = gr.Textbox(
label="Transcript de l'appel",
placeholder="Collez le contenu de l'appel ici...",
lines=7,
max_lines=15
)
with gr.Row():
analyze_btn = gr.Button("Analyser", variant="primary")
clear_btn = gr.Button("Effacer")
gr.Examples(
examples=examples,
inputs=[input_text],
label="Exemples rapides"
)
with gr.Column():
risk_score = gr.Label(
label="Score de risque",
value=0
)
risk_level = gr.Textbox(
label="Niveau de risque",
value="Non analysé",
interactive=False
)
risk_gauge = gr.Slider(
label="Niveau de risque (Jauge)",
minimum=0,
maximum=1,
value=0,
step=0.01,
interactive=False
)
report = gr.Markdown(
value="## Résultats s'afficheront ici"
)
# Fonction de mise à jour des résultats
def update_results(text):
score, patterns, report_text = detector.analyze(text)
# Mise à jour du score
if score > 0.75:
level = "Élevé"
elif score > 0.5:
level = "Modéré"
else:
level = "Faible"
return score, level, score, report_text
analyze_btn.click(
fn=update_results,
inputs=input_text,
outputs=[risk_score, risk_level, risk_gauge, report]
)
clear_btn.click(
fn=lambda: [
0,
"Non analysé",
0,
"## Résultats s'afficheront ici"
],
outputs=[risk_score, risk_level, risk_gauge, report]
)
# Lancement de l'application
if __name__ == "__main__":
app.launch(
server_name="0.0.0.0",
server_port=7860,
share=False
)