ScamDetector / pages /Analysis.py
rafaldembski's picture
Update pages/Analysis.py
bbf69c9 verified
raw
history blame
16.3 kB
# 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