Spaces:
Sleeping
Sleeping
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.")
|