Spaces:
Sleeping
Sleeping
# pages/Analysis.py | |
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:", | |
'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:", | |
'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:", | |
'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) | |
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.") | |
# Nie dodawaj "if __name__ == '__main__':" w podstronach | |