File size: 11,824 Bytes
d5e86a3
362c11a
eb2dfe7
 
 
 
 
2c43e4c
 
 
362c11a
80583a7
 
bbf69c9
d5e86a3
80583a7
ecdab25
 
 
 
eb2dfe7
 
ecdab25
eb2dfe7
 
ecdab25
 
d754187
eb2dfe7
 
 
 
 
 
 
 
 
 
ecdab25
 
 
eb2dfe7
 
 
 
 
 
 
d754187
eb2dfe7
ecdab25
eb2dfe7
ecdab25
eb2dfe7
 
 
ecdab25
eb2dfe7
 
ecdab25
 
 
eb2dfe7
 
bbf69c9
eb2dfe7
 
 
 
d754187
eb2dfe7
ecdab25
eb2dfe7
ecdab25
eb2dfe7
 
 
ecdab25
eb2dfe7
 
ecdab25
 
93e3b9c
eb2dfe7
 
 
2c43e4c
 
 
eb2dfe7
 
bbf69c9
eb2dfe7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2c43e4c
eb2dfe7
2c43e4c
eb2dfe7
 
 
 
2c43e4c
 
 
80583a7
2c43e4c
93e3b9c
eb2dfe7
 
2c43e4c
eb2dfe7
2c43e4c
93e3b9c
eb2dfe7
28cd69a
eb2dfe7
 
80583a7
eb2dfe7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2c43e4c
eb2dfe7
2c43e4c
bbf69c9
2c43e4c
eb2dfe7
2c43e4c
eb2dfe7
2c43e4c
eb2dfe7
 
 
 
 
2c43e4c
 
eb2dfe7
 
93e3b9c
eb2dfe7
 
93e3b9c
2c43e4c
93e3b9c
eb2dfe7
 
2c43e4c
eb2dfe7
 
2c43e4c
eb2dfe7
2c43e4c
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
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
import streamlit as st
from utils.functions import (
    get_phone_info, 
    simple_checks, 
    analyze_message, 
    update_stats, 
    add_to_history, 
    is_fake_number,
    add_fake_number,  # Importujemy funkcję dodającą numer do bazy oszustw
    init_fake_numbers_file  # Inicjalizujemy plik fake_numbers.json
)
import os
import re  # Dodany import do obsługi wyrażeń regularnych
import json

def show_analysis(language):
    # Definiowanie tłumaczeń dla tej podstrony
    page_translations = {
        'Polish': {
            'header': "📊 Analiza SMS",
            'content': """Tutaj znajduje się interfejs do analizy wiadomości SMS. Wprowadź treść wiadomości poniżej, aby sprawdzić, czy jest ona potencjalnym oszustwem.""",
            'input_placeholder': "Wprowadź treść SMS...",
            'analyze_button': "Analizuj wiadomość",
            'result_positive': "Ostrzeżenie: Wiadomość może być oszustwem!",
            'result_negative': "Wiadomość wydaje się być bezpieczna.",
            'report_button': "Zgłoś numer jako oszustwo",
            'history_header': "Historia Analiz",
            'phone_input_label': "Numer telefonu nadawcy (z kodem kierunkowym kraju, np. +48123456789):",
            'additional_info_header': "Dodatkowe Informacje",
            'frequency_label': "Jak często otrzymujesz wiadomości od tego numeru?",
            'frequency_options': ('Pierwszy raz', 'Sporadycznie', 'Regularnie'),
            'last_received_label': "Kiedy ostatnio otrzymałeś podobną wiadomość?",
            'last_received_options': ('Dziś', 'W ciągu ostatniego tygodnia', 'W ciągu ostatniego miesiąca', 'Dłużej'),
            'confidence_level_label': "Jak bardzo jesteś pewny, że wiadomość jest autentyczna?",
            'confidence_level_help': "1: Bardzo mało pewny, 5: Bardzo pewny",
            'unexpected_label': "Czy otrzymanie tej wiadomości było dla Ciebie niespodziewane?",
            'unexpected_options': ('Tak', 'Nie'),
            'additional_notes_label': "Dodatkowe uwagi lub informacje (opcjonalnie)"
        },
        'German': {
            'header': "📊 SMS-Analyse",
            'content': """Hier befindet sich die Benutzeroberfläche zur Analyse von SMS-Nachrichten. Geben Sie den Text der Nachricht unten ein, um zu überprüfen, ob es sich um einen potenziellen Betrugsversuch handelt.""",
            'input_placeholder': "Geben Sie den SMS-Inhalt ein...",
            'analyze_button': "Analysieren",
            'result_positive': "Warnung: Die Nachricht könnte ein Betrug sein!",
            'result_negative': "Die Nachricht scheint sicher zu sein.",
            'report_button': "Nummer als Betrug melden",
            'history_header': "Analyseverlauf",
            'phone_input_label': "Telefonnummer des Absenders (mit Ländervorwahl, z. B. +49123456789):",
            'additional_info_header': "Zusätzliche Informationen",
            'frequency_label': "Wie oft erhalten Sie Nachrichten von dieser Nummer?",
            'frequency_options': ('Zum ersten Mal', 'Gelegentlich', 'Regelmäßig'),
            'last_received_label': "Wann haben Sie zuletzt eine ähnliche Nachricht erhalten?",
            'last_received_options': ('Heute', 'In der letzten Woche', 'Im letzten Monat', 'Länger'),
            'confidence_level_label': "Wie sicher sind Sie, dass die Nachricht authentisch ist?",
            'confidence_level_help': "1: Sehr unsicher, 5: Sehr sicher",
            'unexpected_label': "War der Empfang dieser Nachricht für Sie unerwartet?",
            'unexpected_options': ('Ja', 'Nein'),
            'additional_notes_label': "Zusätzliche Bemerkungen oder Informationen (optional)"
        },
        'English': {
            'header': "📊 SMS Analysis",
            'content': """Here is the interface for analyzing SMS messages. Enter the content of the message below to check if it is a potential fraud attempt.""",
            'input_placeholder': "Enter SMS content...",
            'analyze_button': "Analyze Message",
            'result_positive': "Warning: The message may be a fraud!",
            'result_negative': "The message appears to be safe.",
            'report_button': "Report number as fraud",
            'history_header': "Analysis History",
            'phone_input_label': "Sender's Phone Number (with country code, e.g. +123456789):",
            'additional_info_header': "Additional Information",
            'frequency_label': "How often do you receive messages from this number?",
            'frequency_options': ('First time', 'Occasionally', 'Regularly'),
            'last_received_label': "When did you last receive a similar message?",
            'last_received_options': ('Today', 'Within the last week', 'Within the last month', 'Longer'),
            'confidence_level_label': "How confident are you that the message is authentic?",
            'confidence_level_help': "1: Very unsure, 5: Very confident",
            'unexpected_label': "Was receiving this message unexpected for you?",
            'unexpected_options': ('Yes', 'No'),
            'additional_notes_label': "Additional notes or information (optional)"
        }
    }

    st.header(page_translations[language]['header'])
    st.write(page_translations[language]['content'])

    # Inicjalizacja pliku fake_numbers.json (jeśli jeszcze nie istnieje)
    init_fake_numbers_file()

    with st.form("sms_form"):
        message = st.text_area(
            label=page_translations[language]['content'],  # Non-empty label for accessibility
            placeholder=page_translations[language]['input_placeholder'], 
            height=150
        )
        phone_number = st.text_input(
            label=page_translations[language]['phone_input_label'],
            value="", 
            max_chars=15
        )
        
        st.markdown(f"### {page_translations[language]['additional_info_header']}")
        
        # Dodane pytania
        frequency = st.selectbox(
            label=page_translations[language]['frequency_label'],
            options=page_translations[language]['frequency_options']
        )
        last_received = st.selectbox(
            label=page_translations[language]['last_received_label'],
            options=page_translations[language]['last_received_options']
        )
        confidence_level = st.slider(
            label=page_translations[language]['confidence_level_label'],
            min_value=1,
            max_value=5,
            value=3,
            help=page_translations[language]['confidence_level_help']
        )
        unexpected = st.radio(
            label=page_translations[language]['unexpected_label'],
            options=page_translations[language]['unexpected_options']
        )
        additional_notes = st.text_area(
            label=page_translations[language]['additional_notes_label'],
            height=100
        )
        
        submitted = st.form_submit_button(page_translations[language]['analyze_button'])

    if submitted:
        if not message.strip():
            st.error(page_translations[language]['input_placeholder'])
        elif not phone_number.strip():
            st.error(page_translations[language]['phone_input_label'])
        else:
            # Informacje o numerze telefonu
            country, operator = get_phone_info(phone_number)
            if country and operator:
                st.write("**Informacje o numerze telefonu:**")
                st.write(f"- **Kraj:** {country}")
                st.write(f"- **Operator:** {operator}")
            else:
                st.write("Nie udało się uzyskać informacji o numerze telefonu.")

            # Sprawdzenie, czy numer jest w bazie fałszywych numerów
            if is_fake_number(phone_number):
                st.warning(page_translations[language]['result_positive'])
            else:
                st.info(page_translations[language]['result_negative'])

            # Przeprowadź proste sprawdzenia heurystyczne
            warnings = simple_checks(message, language)  # Przekazujemy argument language
            if warnings:
                if language == 'Polish':
                    st.warning("Znaleziono następujące potencjalne czerwone flagi:")
                elif language == 'German':
                    st.warning("Folgende potenzielle rote Flaggen wurden gefunden:")
                else:
                    st.warning("The following potential red flags were found:")
                for warn in warnings:
                    st.write(f"- {warn}")

            # Zbierz dodatkowe informacje
            additional_info = f"""
**{ 'Jak często otrzymujesz wiadomości od tego numeru?' if language == 'Polish' else 
   'Wie oft erhalten Sie Nachrichten von dieser Nummer?' if language == 'German' else 
   'How often do you receive messages from this number?' }** {frequency}

**{ 'Kiedy ostatnio otrzymałeś podobną wiadomość?' if language == 'Polish' else 
   'Wann haben Sie zuletzt eine ähnliche Nachricht erhalten?' if language == 'German' else 
   'When did you last receive a similar message?' }** {last_received}

**{ 'Jak bardzo jesteś pewny, że wiadomość jest autentyczna?' if language == 'Polish' else 
   'Wie sicher sind Sie, dass die Nachricht authentisch ist?' if language == 'German' else 
   'How confident are you that the message is authentic?' }** {confidence_level}/5

**{ 'Czy otrzymanie tej wiadomości było dla Ciebie niespodziewane?' if language == 'Polish' else 
   'War der Empfang dieser Nachricht für Sie unerwartet?' if language == 'German' else 
   'Was receiving this message unexpected for you?' }** {unexpected}

**{ 'Dodatkowe uwagi lub informacje:' if language == 'Polish' else 
   'Zusätzliche Bemerkungen oder Informationen:' if language == 'German' else 
   'Additional notes or information:' }** {additional_notes}
            """

            # Pobierz klucz API
            api_key = os.getenv('SAMBANOVA_API_KEY')
            if not api_key:
                st.error("Brak klucza API. Ustaw zmienną środowiskową SAMBANOVA_API_KEY.")
            else:
                with st.spinner("Analizuję wiadomość przy użyciu modelu AI..."):
                    analysis_text, risk_text, recommendations_text = analyze_message(message, phone_number, additional_info, api_key, language)
                    st.subheader("📑 Analiza treści wiadomości:")
                    st.markdown(analysis_text)
                    st.subheader("⚠️ Ocena ryzyka oszustwa:")
                    st.markdown(risk_text)
                    st.subheader("✅ Zalecenia dla użytkownika:")
                    st.markdown(recommendations_text)

                    # Aktualizacja statystyk na podstawie oceny ryzyka
                    try:
                        match = re.search(r'(\d+)/10', risk_text)
                        fraud_detected = int(match.group(1)) >= 7 if match else False
                        update_stats(fraud_detected=fraud_detected)
                    except:
                        fraud_detected = False

                    # Dodanie analizy do historii
                    add_to_history(message, phone_number, analysis_text, risk_text, recommendations_text)

                st.info("📌 Pamiętaj: zachowaj ostrożność przy wiadomościach od nieznanych nadawców.")

            # Zgłoszenie numeru jako oszustwo
            if fraud_detected:
                if st.button(page_translations[language]['report_button']):
                    success = add_fake_number(phone_number)
                    if success:
                        st.success("Numer został zgłoszony jako oszustwo.")
                    else:
                        st.info("Numer został już zgłoszony jako oszustwo.")