ScamDetector / app.py
rafaldembski's picture
Create app.py
3aa83be verified
raw
history blame
4.86 kB
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()