File size: 6,746 Bytes
e2c35e2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7fd37ac
e2c35e2
7fd37ac
e2c35e2
7fd37ac
 
 
 
 
e2c35e2
 
 
7fd37ac
e2c35e2
 
 
7fd37ac
 
e2c35e2
7fd37ac
e2c35e2
 
 
 
 
 
 
 
 
 
 
7fd37ac
e2c35e2
 
 
 
7fd37ac
e2c35e2
 
 
 
7fd37ac
 
e2c35e2
 
 
7fd37ac
e2c35e2
 
 
 
 
 
 
 
 
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
#!/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
    )