ScamDetector / pages /Analysis.py
rafaldembski's picture
Update pages/Analysis.py
e384056 verified
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,
get_email_info,
analyze_url,
extract_text_from_image,
get_analysis_history,
get_statistics
)
import os
import re
import requests
from phonenumbers import parse, is_valid_number, NumberParseException
def extract_urls(text):
url_pattern = re.compile(r'(https?://[^\s]+)|(www\.[^\s]+)')
urls = url_pattern.findall(text)
urls = [url[0] or url[1] for url in urls]
return urls
def check_urls_with_phishtank(urls):
phishing_urls = []
for url in urls:
params = {'format': 'json', 'url': url}
try:
response = requests.post('https://checkurl.phishtank.com/checkurl/', data=params)
if response.status_code == 200:
data = response.json()
in_database = data.get('results', {}).get('in_database', False)
valid = data.get('results', {}).get('valid', False)
if in_database and valid:
phishing_urls.append(url)
else:
st.warning(f"Błąd podczas sprawdzania URL w PhishTank: {response.status_code}")
except Exception as e:
st.error(f"Błąd podczas sprawdzania URL w PhishTank: {e}")
return phishing_urls
def check_urls_with_safe_browsing(urls):
api_key = os.getenv('GOOGLE_SAFE_BROWSING_API_KEY')
if not api_key:
return None
unsafe_urls = []
headers = {'Content-Type': 'application/json'}
client_body = {
'client': {
'clientId': 'yourcompanyname',
'clientVersion': '1.0'
},
'threatInfo': {
'threatTypes': ["MALWARE", "SOCIAL_ENGINEERING", "UNWANTED_SOFTWARE", "POTENTIALLY_HARMFUL_APPLICATION"],
'platformTypes': ["ANY_PLATFORM"],
'threatEntryTypes': ["URL"],
'threatEntries': [{'url': url} for url in urls]
}
}
try:
response = requests.post(
f'https://safebrowsing.googleapis.com/v4/threatMatches:find?key={api_key}',
headers=headers,
json=client_body
)
if response.status_code == 200:
data = response.json()
matches = data.get('matches', [])
unsafe_urls = [match['threat']['url'] for match in matches]
else:
st.error(f"Błąd podczas komunikacji z Google Safe Browsing API: {response.status_code}")
except Exception as e:
st.error(f"Błąd podczas sprawdzania URL w Google Safe Browsing: {e}")
return unsafe_urls
def analyze_sms(message, phone_number, additional_info, language):
st.subheader(get_translation('sms_analysis_header', language))
# Informacje o numerze telefonu
country, operator = get_phone_info(phone_number)
if country and operator:
st.write(get_translation('phone_info', language))
st.write(f"- **{get_translation('country_label', language)}:** {country}")
st.write(f"- **{get_translation('operator_label', language)}:** {operator}")
else:
st.write(get_translation('unable_to_retrieve', language))
# Sprawdzenie, czy numer jest w bazie fałszywych numerów
fraud_detected = is_fake_number(phone_number)
if fraud_detected:
st.warning(get_translation('number_reported_warning', language))
# Przeprowadź proste sprawdzenia heurystyczne
warnings = simple_checks(message, language)
if warnings:
st.warning(get_translation('red_flags_found', language))
for warn in warnings:
st.write(f"- {warn}")
# Analiza URL
urls = extract_urls(message)
if urls:
st.subheader(get_translation('url_analysis_header', language))
st.write(get_translation('extracted_urls', language))
for url in urls:
st.write(f"- {url}")
# Sprawdzanie URL w PhishTank
phishing_urls_phishtank = check_urls_with_phishtank(urls)
if phishing_urls_phishtank:
st.warning(get_translation('phishtank_warning', language))
for url in phishing_urls_phishtank:
st.write(f"- {url}")
else:
st.write(get_translation('no_phishtank_threats', language))
# Sprawdzanie URL w Google Safe Browsing
phishing_urls_safe_browsing = check_urls_with_safe_browsing(urls)
if phishing_urls_safe_browsing is None:
st.warning(get_translation('api_key_missing', language).format('Google Safe Browsing'))
elif phishing_urls_safe_browsing:
st.warning(get_translation('safe_browsing_warning', language))
for url in phishing_urls_safe_browsing:
st.write(f"- {url}")
else:
st.write(get_translation('no_safe_browsing_threats', language))
else:
st.write(get_translation('no_urls_found', language))
# Analiza wiadomości z użyciem modelu AI
api_key = os.getenv('SAMBANOVA_API_KEY')
if not api_key:
st.error(get_translation('api_key_missing', language).format('SambaNova'))
else:
with st.spinner(get_translation('analyzing_message', language)):
try:
analysis_text, risk_text, recommendations_text = analyze_message(
message, phone_number, additional_info, api_key, language
)
st.subheader(get_translation('message_analysis_header', language))
st.markdown(analysis_text)
st.subheader(get_translation('risk_assessment_header', language))
st.markdown(risk_text)
st.subheader(get_translation('user_recommendations_header', language))
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 fraud_detected
update_stats(fraud_detected=fraud_detected)
except Exception as e:
st.error(f"Błąd podczas aktualizacji statystyk: {e}")
# Dodanie analizy do historii
add_to_history(message, phone_number, analysis_text, risk_text, recommendations_text)
except Exception as e:
st.error(f"Błąd podczas analizy wiadomości: {e}")
st.info(get_translation('remember_caution', language))
# Zgłoszenie numeru jako oszustwo
if fraud_detected:
if st.button(get_translation('report_button', language)):
try:
parsed_number = parse(phone_number, None)
if is_valid_number(parsed_number):
success = add_fake_number(phone_number)
if success:
st.success(get_translation('number_reported', language))
else:
st.info(get_translation('number_already_reported', language))
else:
st.error(get_translation('invalid_number', language))
except NumberParseException:
st.error(get_translation('failed_to_parse', language))
def analyze_email(email_content, sender_email, language):
st.subheader(get_translation('email_analysis_header', language))
# Informacje o adresie e-mail nadawcy
domain_info = get_email_info(sender_email)
if domain_info:
st.write(get_translation('email_sender_info', language))
st.write(f"- **{get_translation('domain_label', language)}:** {domain_info['domain']}")
st.write(f"- **{get_translation('organization_label', language)}:** {domain_info['organization']}")
st.write(f"- **{get_translation('country_label', language)}:** {domain_info['country']}")
else:
st.write(get_translation('unable_to_retrieve_email', language))
# Przeprowadź proste sprawdzenia heurystyczne
warnings = simple_checks(email_content, language)
if warnings:
st.warning(get_translation('red_flags_found', language))
for warn in warnings:
st.write(f"- {warn}")
# Analiza URL
urls = extract_urls(email_content)
if urls:
st.subheader(get_translation('url_analysis_header', language))
st.write(get_translation('extracted_urls', language))
for url in urls:
st.write(f"- {url}")
# Sprawdzanie URL w PhishTank
phishing_urls_phishtank = check_urls_with_phishtank(urls)
if phishing_urls_phishtank:
st.warning(get_translation('phishtank_warning', language))
for url in phishing_urls_phishtank:
st.write(f"- {url}")
else:
st.write(get_translation('no_phishtank_threats', language))
# Sprawdzanie URL w Google Safe Browsing
phishing_urls_safe_browsing = check_urls_with_safe_browsing(urls)
if phishing_urls_safe_browsing is None:
st.warning(get_translation('api_key_missing', language).format('Google Safe Browsing'))
elif phishing_urls_safe_browsing:
st.warning(get_translation('safe_browsing_warning', language))
for url in phishing_urls_safe_browsing:
st.write(f"- {url}")
else:
st.write(get_translation('no_safe_browsing_threats', language))
else:
st.write(get_translation('no_urls_found', language))
# Analiza wiadomości z użyciem modelu AI
api_key = os.getenv('SAMBANOVA_API_KEY')
if not api_key:
st.error(get_translation('api_key_missing', language).format('SambaNova'))
else:
with st.spinner(get_translation('analyzing_message', language)):
try:
analysis_text, risk_text, recommendations_text = analyze_message(
email_content, sender_email, "", api_key, language
)
st.subheader(get_translation('message_analysis_header', language))
st.markdown(analysis_text)
st.subheader(get_translation('risk_assessment_header', language))
st.markdown(risk_text)
st.subheader(get_translation('user_recommendations_header', language))
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 Exception as e:
st.error(f"Błąd podczas aktualizacji statystyk: {e}")
# Dodanie analizy do historii
add_to_history(email_content, sender_email, analysis_text, risk_text, recommendations_text)
except Exception as e:
st.error(f"Błąd podczas analizy wiadomości: {e}")
st.info(get_translation('remember_caution', language))
def analyze_website(url, language):
st.subheader(get_translation('website_analysis_header', language))
# Sprawdzanie URL w PhishTank
phishing_urls_phishtank = check_urls_with_phishtank([url])
if phishing_urls_phishtank:
st.warning(get_translation('phishtank_warning', language))
st.write(f"- {url}")
else:
st.write(get_translation('no_phishtank_threats', language))
# Sprawdzanie URL w Google Safe Browsing
phishing_urls_safe_browsing = check_urls_with_safe_browsing([url])
if phishing_urls_safe_browsing is None:
st.warning(get_translation('api_key_missing', language).format('Google Safe Browsing'))
elif phishing_urls_safe_browsing:
st.warning(get_translation('safe_browsing_warning', language))
st.write(f"- {url}")
else:
st.write(get_translation('no_safe_browsing_threats', language))
# Analiza treści strony
try:
page_content = analyze_url(url)
st.subheader(get_translation('website_content_analysis', language))
st.write(page_content)
except Exception as e:
st.error(f"Błąd podczas pobierania zawartości strony: {e}")
def analyze_phone_number(phone_number, language):
st.subheader(get_translation('phone_number_analysis_header', language))
# Informacje o numerze telefonu
country, operator = get_phone_info(phone_number)
if country and operator:
st.write(get_translation('phone_info', language))
st.write(f"- **{get_translation('country_label', language)}:** {country}")
st.write(f"- **{get_translation('operator_label', language)}:** {operator}")
else:
st.write(get_translation('unable_to_retrieve', language))
# Sprawdzenie, czy numer jest w bazie fałszywych numerów
if is_fake_number(phone_number):
st.warning(get_translation('number_reported_warning', language))
else:
st.info(get_translation('number_not_reported', language))
def analyze_image(image_file, language):
st.subheader(get_translation('image_analysis_header', language))
# Wyświetlenie obrazu
st.image(image_file)
# Ekstrakcja tekstu z obrazu
try:
extracted_text = extract_text_from_image(image_file)
st.write(get_translation('extracted_text', language))
st.write(extracted_text)
# Analiza wyodrębnionego tekstu
analyze_sms(extracted_text, "", "", language)
except Exception as e:
st.error(f"Błąd podczas analizy obrazu: {e}")
def show_history(language):
st.subheader(get_translation('history_header', language))
# Zakładamy, że funkcja `get_analysis_history` zwraca listę analiz
history = get_analysis_history()
if history:
for record in history:
st.write(f"**{get_translation('date_label', language)}:** {record['date']}")
st.write(f"**{get_translation('analysis_type_label', language)}:** {record['type']}")
st.write(f"**{get_translation('details_label', language)}:** {record['details']}")
st.markdown("---")
else:
st.write(get_translation('no_history', language))
def show_statistics(language):
st.subheader(get_translation('statistics_header', language))
# Zakładamy, że funkcja `get_statistics` zwraca słownik ze statystykami
stats = get_statistics()
st.write(f"{get_translation('total_analyses', language)}: **{stats['total']}**")
st.write(f"{get_translation('fraud_detected', language)}: **{stats['fraud']}**")
st.write(f"{get_translation('safe_detected', language)}: **{stats['safe']}**")
def get_translation(key, language):
translations = {
'Polish': {
'analysis_center_title': "Centrum Analizy",
'select_analysis_type': "Wybierz typ analizy:",
'sms_analysis': "Analiza SMS",
'email_analysis': "Analiza E-mail",
'website_analysis': "Analiza Strony Internetowej",
'phone_number_analysis': "Analiza Numeru Telefonu",
'image_analysis': "Analiza Obrazu",
'history': "Historia Analiz",
'statistics': "Statystyki",
'sms_analysis_header': "Analiza SMS",
'email_analysis_header': "Analiza E-mail",
'website_analysis_header': "Analiza Strony Internetowej",
'phone_number_analysis_header': "Analiza Numeru Telefonu",
'image_analysis_header': "Analiza Obrazu",
'enter_sms_content': "Wprowadź treść SMS",
'sender_phone_number': "Numer telefonu nadawcy (z kodem kierunkowym kraju, np. +48123456789)",
'analyze_button': "Analizuj",
'enter_email_content': "Wprowadź treść e-maila",
'sender_email_address': "Adres e-mail nadawcy",
'enter_website_url': "Wprowadź adres URL strony do analizy",
'upload_image': "Prześlij obraz do analizy",
'no_image_selected': "Proszę wybrać obraz do analizy.",
'enter_phone_number': "Wprowadź numer telefonu do analizy",
'email_sender_info': "Informacje o nadawcy e-mail:",
'domain_label': "Domena",
'organization_label': "Organizacja",
'unable_to_retrieve_email': "Nie można uzyskać informacji o nadawcy e-mail.",
'phone_info': "Informacje o numerze telefonu:",
'country_label': "Kraj",
'operator_label': "Operator",
'unable_to_retrieve': "Nie można uzyskać informacji o numerze telefonu.",
'number_reported_warning': "Ostrzeżenie: Ten numer został wcześniej zgłoszony jako oszustwo!",
'number_not_reported': "Ten numer nie został zgłoszony jako oszustwo.",
'red_flags_found': "Znaleziono następujące potencjalne czerwone flagi:",
'url_analysis_header': "Analiza URL",
'extracted_urls': "Wyodrębnione URL z treści:",
'phishtank_warning': "Następujące URL są oznaczone jako phishing przez PhishTank:",
'no_phishtank_threats': "Brak zagrożeń phishingowych według PhishTank.",
'api_key_missing': "Brak klucza API dla usługi: {}.",
'safe_browsing_warning': "Następujące URL są oznaczone jako niebezpieczne przez Google Safe Browsing:",
'no_safe_browsing_threats': "Brak zagrożeń według Google Safe Browsing.",
'no_urls_found': "Brak URL w treści.",
'analyzing_message': "Analizowanie treści za pomocą modelu AI...",
'message_analysis_header': "Analiza treści:",
'risk_assessment_header': "Ocena ryzyka oszustwa:",
'user_recommendations_header': "Zalecenia dla użytkownika:",
'remember_caution': "📌 Pamiętaj: Bądź ostrożny z komunikacjami od nieznanych nadawców.",
'report_button': "Zgłoś numer jako oszustwo",
'number_reported': "Numer został zgłoszony jako oszustwo.",
'number_already_reported': "Numer został już wcześniej zgłoszony jako oszustwo.",
'invalid_number': "Podany numer telefonu jest nieprawidłowy.",
'failed_to_parse': "Nie udało się przetworzyć numeru telefonu. Upewnij się, że jest w poprawnym formacie.",
'website_content_analysis': "Analiza zawartości strony:",
'extracted_text': "Wyodrębniony tekst z obrazu:",
'history_header': "Historia Analiz",
'no_history': "Brak zapisanej historii analiz.",
'statistics_header': "Statystyki",
'total_analyses': "Łączna liczba analiz",
'fraud_detected': "Wykryte oszustwa",
'safe_detected': "Bezpieczne przypadki",
'date_label': "Data",
'analysis_type_label': "Typ Analizy",
'details_label': "Szczegóły",
},
'English': {
'analysis_center_title': "Analysis Center",
'select_analysis_type': "Select analysis type:",
'sms_analysis': "SMS Analysis",
'email_analysis': "Email Analysis",
'website_analysis': "Website Analysis",
'phone_number_analysis': "Phone Number Analysis",
'image_analysis': "Image Analysis",
'history': "Analysis History",
'statistics': "Statistics",
'sms_analysis_header': "SMS Analysis",
'email_analysis_header': "Email Analysis",
'website_analysis_header': "Website Analysis",
'phone_number_analysis_header': "Phone Number Analysis",
'image_analysis_header': "Image Analysis",
'enter_sms_content': "Enter SMS content",
'sender_phone_number': "Sender's phone number (with country code, e.g., +123456789)",
'analyze_button': "Analyze",
'enter_email_content': "Enter email content",
'sender_email_address': "Sender's email address",
'enter_website_url': "Enter website URL to analyze",
'upload_image': "Upload image for analysis",
'no_image_selected': "Please select an image to analyze.",
'enter_phone_number': "Enter phone number to analyze",
'email_sender_info': "Email sender information:",
'domain_label': "Domain",
'organization_label': "Organization",
'unable_to_retrieve_email': "Unable to retrieve email sender information.",
'phone_info': "Phone number information:",
'country_label': "Country",
'operator_label': "Operator",
'unable_to_retrieve': "Unable to retrieve phone number information.",
'number_reported_warning': "Warning: This number has been previously reported as fraud!",
'number_not_reported': "This number has not been reported as fraud.",
'red_flags_found': "The following potential red flags were found:",
'url_analysis_header': "URL Analysis",
'extracted_urls': "Extracted URLs from the content:",
'phishtank_warning': "The following URLs are flagged as phishing by PhishTank:",
'no_phishtank_threats': "No phishing threats detected by PhishTank.",
'api_key_missing': "API key missing for service: {}.",
'safe_browsing_warning': "The following URLs are flagged as unsafe by Google Safe Browsing:",
'no_safe_browsing_threats': "No threats detected by Google Safe Browsing.",
'no_urls_found': "No URLs found in the content.",
'analyzing_message': "Analyzing content using AI model...",
'message_analysis_header': "Content Analysis:",
'risk_assessment_header': "Fraud Risk Assessment:",
'user_recommendations_header': "User Recommendations:",
'remember_caution': "📌 Remember: Be cautious with communications from unknown senders.",
'report_button': "Report number as fraud",
'number_reported': "Number has been reported as fraud.",
'number_already_reported': "Number has already been reported as fraud.",
'invalid_number': "The provided phone number is invalid.",
'failed_to_parse': "Failed to parse the phone number. Ensure it is in the correct format.",
'website_content_analysis': "Website content analysis:",
'extracted_text': "Extracted text from image:",
'history_header': "Analysis History",
'no_history': "No analysis history found.",
'statistics_header': "Statistics",
'total_analyses': "Total analyses",
'fraud_detected': "Frauds detected",
'safe_detected': "Safe cases",
'date_label': "Date",
'analysis_type_label': "Analysis Type",
'details_label': "Details",
},
'German': {
'analysis_center_title': "Analysezentrum",
'select_analysis_type': "Wählen Sie den Analysetyp:",
'sms_analysis': "SMS-Analyse",
'email_analysis': "E-Mail-Analyse",
'website_analysis': "Website-Analyse",
'phone_number_analysis': "Telefonnummernanalyse",
'image_analysis': "Bildanalyse",
'history': "Analyseverlauf",
'statistics': "Statistiken",
'sms_analysis_header': "SMS-Analyse",
'email_analysis_header': "E-Mail-Analyse",
'website_analysis_header': "Website-Analyse",
'phone_number_analysis_header': "Telefonnummernanalyse",
'image_analysis_header': "Bildanalyse",
'enter_sms_content': "SMS-Inhalt eingeben",
'sender_phone_number': "Telefonnummer des Absenders (mit Ländercode, z.B. +49123456789)",
'analyze_button': "Analysieren",
'enter_email_content': "E-Mail-Inhalt eingeben",
'sender_email_address': "E-Mail-Adresse des Absenders",
'enter_website_url': "Zu analysierende Website-URL eingeben",
'upload_image': "Bild für die Analyse hochladen",
'no_image_selected': "Bitte wählen Sie ein Bild zur Analyse aus.",
'enter_phone_number': "Telefonnummer zur Analyse eingeben",
'email_sender_info': "Informationen zum E-Mail-Absender:",
'domain_label': "Domain",
'organization_label': "Organisation",
'unable_to_retrieve_email': "Informationen zum E-Mail-Absender können nicht abgerufen werden.",
'phone_info': "Informationen zur Telefonnummer:",
'country_label': "Land",
'operator_label': "Anbieter",
'unable_to_retrieve': "Informationen zur Telefonnummer können nicht abgerufen werden.",
'number_reported_warning': "Warnung: Diese Nummer wurde bereits als Betrug gemeldet!",
'number_not_reported': "Diese Nummer wurde nicht als Betrug gemeldet.",
'red_flags_found': "Die folgenden potenziellen Warnsignale wurden gefunden:",
'url_analysis_header': "URL-Analyse",
'extracted_urls': "Extrahierte URLs aus dem Inhalt:",
'phishtank_warning': "Die folgenden URLs wurden von PhishTank als Phishing markiert:",
'no_phishtank_threats': "Keine Phishing-Bedrohungen von PhishTank erkannt.",
'api_key_missing': "API-Schlüssel für Dienst fehlt: {}.",
'safe_browsing_warning': "Die folgenden URLs wurden von Google Safe Browsing als unsicher markiert:",
'no_safe_browsing_threats': "Keine Bedrohungen von Google Safe Browsing erkannt.",
'no_urls_found': "Keine URLs im Inhalt gefunden.",
'analyzing_message': "Analyse des Inhalts mit KI-Modell...",
'message_analysis_header': "Inhaltsanalyse:",
'risk_assessment_header': "Betrugsrisikobewertung:",
'user_recommendations_header': "Empfehlungen für den Benutzer:",
'remember_caution': "📌 Denken Sie daran: Seien Sie vorsichtig mit Mitteilungen von unbekannten Absendern.",
'report_button': "Nummer als Betrug melden",
'number_reported': "Nummer wurde als Betrug gemeldet.",
'number_already_reported': "Nummer wurde bereits als Betrug gemeldet.",
'invalid_number': "Die angegebene Telefonnummer ist ungültig.",
'failed_to_parse': "Die Telefonnummer konnte nicht verarbeitet werden. Stellen Sie sicher, dass sie im richtigen Format vorliegt.",
'website_content_analysis': "Analyse des Website-Inhalts:",
'extracted_text': "Aus dem Bild extrahierter Text:",
'history_header': "Analyseverlauf",
'no_history': "Kein Analyseverlauf gefunden.",
'statistics_header': "Statistiken",
'total_analyses': "Gesamtzahl der Analysen",
'fraud_detected': "Erkannte Betrugsfälle",
'safe_detected': "Sichere Fälle",
'date_label': "Datum",
'analysis_type_label': "Analysetyp",
'details_label': "Details",
}
}
return translations.get(language, translations['English']).get(key, key)
def show_analysis(language):
st.title(get_translation('analysis_center_title', language))
analysis_options = [
get_translation('sms_analysis', language),
get_translation('email_analysis', language),
get_translation('website_analysis', language),
get_translation('phone_number_analysis', language),
get_translation('image_analysis', language),
get_translation('history', language),
get_translation('statistics', language)
]
selected_analysis = st.radio(
get_translation('select_analysis_type', language),
analysis_options
)
if selected_analysis == get_translation('sms_analysis', language):
with st.form("sms_form"):
message = st.text_area(get_translation('enter_sms_content', language), height=150)
phone_number = st.text_input(get_translation('sender_phone_number', language))
submitted = st.form_submit_button(get_translation('analyze_button', language))
if submitted:
if not message.strip():
st.error(get_translation('enter_sms_content', language))
elif not phone_number.strip():
st.error(get_translation('sender_phone_number', language))
else:
additional_info = ""
analyze_sms(message, phone_number, additional_info, language)
elif selected_analysis == get_translation('email_analysis', language):
with st.form("email_form"):
email_content = st.text_area(get_translation('enter_email_content', language), height=150)
sender_email = st.text_input(get_translation('sender_email_address', language))
submitted = st.form_submit_button(get_translation('analyze_button', language))
if submitted:
if not email_content.strip():
st.error(get_translation('enter_email_content', language))
elif not sender_email.strip():
st.error(get_translation('sender_email_address', language))
else:
analyze_email(email_content, sender_email, language)
elif selected_analysis == get_translation('website_analysis', language):
with st.form("website_form"):
url = st.text_input(get_translation('enter_website_url', language))
submitted = st.form_submit_button(get_translation('analyze_button', language))
if submitted:
if not url.strip():
st.error(get_translation('enter_website_url', language))
else:
analyze_website(url, language)
elif selected_analysis == get_translation('phone_number_analysis', language):
with st.form("phone_number_form"):
phone_number = st.text_input(get_translation('enter_phone_number', language))
submitted = st.form_submit_button(get_translation('analyze_button', language))
if submitted:
if not phone_number.strip():
st.error(get_translation('enter_phone_number', language))
else:
analyze_phone_number(phone_number, language)
elif selected_analysis == get_translation('image_analysis', language):
with st.form("image_form"):
image_file = st.file_uploader(get_translation('upload_image', language), type=['png', 'jpg', 'jpeg'])
submitted = st.form_submit_button(get_translation('analyze_button', language))
if submitted:
if image_file is None:
st.error(get_translation('no_image_selected', language))
else:
analyze_image(image_file, language)
elif selected_analysis == get_translation('history', language):
show_history(language)
elif selected_analysis == get_translation('statistics', language):
show_statistics(language)