ScamDetector / pages /Analysis.py
rafaldembski's picture
Update pages/Analysis.py
2c43e4c verified
raw
history blame
11.8 kB
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.")