import streamlit as st from utils.functions import ( get_phone_info, simple_checks, analyze_message, update_stats, add_to_history, is_fake_number ) 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']) 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(): if language == 'Polish': st.error("Proszę wprowadzić treść wiadomości.") elif language == 'German': st.error("Bitte geben Sie den Nachrichtentext ein.") else: st.error("Please enter the message content.") elif not phone_number.strip(): if language == 'Polish': st.error("Proszę wprowadzić numer telefonu nadawcy.") elif language == 'German': st.error("Bitte geben Sie die Telefonnummer des Absenders ein.") else: st.error("Please enter the sender's phone number.") else: # Informacje o numerze telefonu country, operator = get_phone_info(phone_number) if country and operator: if language == 'Polish': st.write("**Informacje o numerze telefonu:**") st.write(f"- **Kraj:** {country}") st.write(f"- **Operator:** {operator}") elif language == 'German': st.write("**Informationen zur Telefonnummer:**") st.write(f"- **Land:** {country}") st.write(f"- **Operator:** {operator}") else: st.write("**Phone Number Information:**") st.write(f"- **Country:** {country}") st.write(f"- **Operator:** {operator}") else: if language == 'Polish': st.write("Nie udało się uzyskać informacji o numerze telefonu.") elif language == 'German': st.write("Informationen zur Telefonnummer konnten nicht abgerufen werden.") else: st.write("Failed to retrieve phone number information.") # Sprawdzenie, czy numer jest w bazie fałszywych numerów if is_fake_number(phone_number): if language == 'Polish': st.warning("Numer telefonu znajduje się w bazie znanych fałszywych numerów.") elif language == 'German': st.warning("Die Telefonnummer befindet sich in der Datenbank bekannter Betrügernummern.") else: st.warning("The phone number is in the database of known fake numbers.") else: if language == 'Polish': st.info("Numer telefonu nie znajduje się w bazie fałszywych numerów.") elif language == 'German': st.info("Die Telefonnummer befindet sich nicht in der Datenbank bekannter Betrügernummern.") else: st.info("The phone number is not in the database of known fake numbers.") # 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: if language == 'Polish': st.error("Brak klucza API. Ustaw zmienną środowiskową SAMBANOVA_API_KEY w ustawieniach aplikacji.") elif language == 'German': st.error("Kein API-Schlüssel vorhanden. Setzen Sie die Umgebungsvariable SAMBANOVA_API_KEY in den App-Einstellungen.") else: st.error("API key missing. Set the SAMBANOVA_API_KEY environment variable in the app settings.") else: # Analiza za pomocą modelu AI with st.spinner( "Analizuję wiadomość przy użyciu modelu AI..." if language == 'Polish' else "Analysiere Nachricht mit AI-Modell..." if language == 'German' else "Analyzing message using AI model..." ): analysis_text, risk_text, recommendations_text = analyze_message(message, phone_number, additional_info, api_key, language) st.subheader( "📑 Analiza treści wiadomości:" if language == 'Polish' else "📑 Nachrichteninhaltsanalyse:" if language == 'German' else "📑 Message Content Analysis:" ) st.markdown(analysis_text) st.subheader( "⚠️ Ocena ryzyka oszustwa:" if language == 'Polish' else "⚠️ Bewertung des Betrugsrisikos:" if language == 'German' else "⚠️ Fraud Risk Assessment:" ) st.markdown(risk_text) st.subheader( "✅ Zalecenia dla użytkownika:" if language == 'Polish' else "✅ Empfehlungen für den Benutzer:" if language == 'German' else "✅ Recommendations for the User:" ) st.markdown(recommendations_text) # Aktualizacja statystyk na podstawie oceny ryzyka try: # Zakładając, że risk_text zawiera np. "Ryzyko: 7/10" # Możesz dostosować parsowanie w zależności od formatu match = re.search(r'(\d+)/10', risk_text) if match: risk_score = int(match.group(1)) fraud_detected = risk_score >= 7 # Przykładowy próg update_stats(fraud_detected=fraud_detected) else: fraud_detected = False except: fraud_detected = False # Dodanie analizy do historii add_to_history(message, phone_number, analysis_text, risk_text, recommendations_text) if language == 'Polish': st.info("📌 Pamiętaj: zawsze zachowuj ostrożność przy otrzymywaniu wiadomości od nieznanych nadawców. Nie udostępniaj poufnych informacji i nie klikaj w podejrzane linki.") elif language == 'German': st.info("📌 Erinnerung: Seien Sie immer vorsichtig beim Erhalt von Nachrichten von unbekannten Absendern. Teilen Sie keine vertraulichen Informationen und klicken Sie nicht auf verdächtige Links.") else: st.info("📌 Remember: Always exercise caution when receiving messages from unknown senders. Do not share confidential information and do not click on suspicious links.") # Zgłoszenie numeru jako oszustwo if fraud_detected: report_label = page_translations[language]['report_button'] if st.button(report_label): success = add_fake_number(phone_number) if success: if language == 'Polish': st.success("Numer został zgłoszony jako oszustwo.") elif language == 'German': st.success("Nummer wurde als Betrug gemeldet.") else: st.success("Number reported as fraud.") else: if language == 'Polish': st.info("Numer został już zgłoszony jako oszustwo.") elif language == 'German': st.info("Nummer wurde bereits als Betrug gemeldet.") else: st.info("Number has already been reported as fraud.")