Spaces:
Sleeping
Sleeping
import streamlit as st | |
import requests | |
import os | |
import phonenumbers | |
from phonenumbers import geocoder, carrier | |
import re | |
# Pobierz klucz API z zmiennej środowiskowej | |
API_KEY = os.getenv('SAMBANOVA_API_KEY') | |
if not API_KEY: | |
st.error("Brak klucza API. Ustaw zmienną środowiskową SAMBANOVA_API_KEY w ustawieniach Spaces.") | |
st.stop() | |
# Funkcja do weryfikacji numeru telefonu | |
def get_phone_info(phone_number): | |
try: | |
parsed_number = phonenumbers.parse(phone_number, None) | |
country = geocoder.description_for_number(parsed_number, 'pl') | |
operator = carrier.name_for_number(parsed_number, 'pl') | |
return country, operator | |
except phonenumbers.NumberParseException: | |
return None, None | |
# Proste sprawdzenia heurystyczne wiadomości | |
def simple_checks(message): | |
warnings = [] | |
# Słowa kluczowe często używane w oszustwach | |
scam_keywords = ['pieniądze', 'przelew', 'hasło', 'kod', 'nagroda', 'wygrana', 'pilne', 'pomoc', 'opłata'] | |
if any(keyword in message.lower() for keyword in scam_keywords): | |
warnings.append("Wiadomość zawiera słowa kluczowe związane z potencjalnym oszustwem.") | |
# Sprawdzenie obecności linków | |
if re.search(r'http[s]?://', message): | |
warnings.append("Wiadomość zawiera link.") | |
# Sprawdzenie, czy nadawca prosi o poufne informacje | |
if re.search(r'\b(podaj|prześlij|udostępnij)\b.*\b(hasło|kod|dane osobowe|numer konta)\b', message.lower()): | |
warnings.append("Wiadomość zawiera prośbę o poufne informacje.") | |
return warnings | |
# Funkcja do analizy wiadomości za pomocą API SambaNova | |
def analyze_message(message, phone_number): | |
url = "https://api.sambanova.ai/v1/chat/completions" | |
headers = { | |
"Authorization": f"Bearer {API_KEY}" | |
} | |
system_prompt = "Jesteś asystentem pomagającym w identyfikacji fałszywych wiadomości SMS. Analizuj pod kątem typowych cech oszustw i phishingu. Podaj swoją ocenę oraz zalecenia dla użytkownika." | |
user_prompt = f"Przeanalizuj następującą wiadomość pod kątem potencjalnego oszustwa:\n\nWiadomość: {message}\nNumer telefonu: {phone_number}\n\nPodaj swoją analizę i wnioski po polsku." | |
payload = { | |
"model": "Meta-Llama-3.1-8B-Instruct", | |
"messages": [ | |
{"role": "system", "content": system_prompt}, | |
{"role": "user", "content": user_prompt} | |
], | |
"max_tokens": 500, | |
"temperature": 0.1, | |
"top_p": 0.9, | |
"stop": ["<|eot_id|>"] | |
} | |
response = requests.post(url, headers=headers, json=payload) | |
if response.status_code == 200: | |
data = response.json() | |
analysis = data['choices'][0]['message']['content'] | |
return analysis | |
else: | |
return f"Błąd API: {response.status_code} - {response.text}" | |
# Główny interfejs aplikacji | |
def main(): | |
st.set_page_config(page_title="Detektor Fałszywych Wiadomości SMS", page_icon="📱") | |
st.title("📱 Detektor Fałszywych Wiadomości SMS") | |
st.write("Wprowadź treść wiadomości SMS oraz numer telefonu nadawcy, aby przeprowadzić analizę pod kątem potencjalnego oszustwa.") | |
with st.form("sms_form"): | |
message = st.text_area("Treść wiadomości SMS", height=150) | |
phone_number = st.text_input("Numer telefonu nadawcy (w formacie międzynarodowym, np. +48123123123)") | |
submitted = st.form_submit_button("Analizuj wiadomość") | |
if submitted: | |
if not message.strip(): | |
st.error("Proszę wprowadzić treść wiadomości.") | |
else: | |
# Wyświetl informacje o numerze telefonu | |
if phone_number: | |
country, operator = get_phone_info(phone_number) | |
if country and operator: | |
st.write(f"**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.") | |
# Przeprowadź proste sprawdzenia heurystyczne | |
warnings = simple_checks(message) | |
if warnings: | |
st.warning("Znaleziono następujące potencjalne czerwone flagi:") | |
for warn in warnings: | |
st.write(f"- {warn}") | |
# Analiza za pomocą modelu językowego | |
with st.spinner("Analizuję wiadomość przy użyciu modelu AI..."): | |
analysis = analyze_message(message, phone_number) | |
st.subheader("Wynik analizy AI:") | |
st.write(analysis) | |
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.") | |
if __name__ == "__main__": | |
main() | |