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