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.")