Spaces:
Sleeping
Sleeping
Create app.py
Browse files
app.py
ADDED
@@ -0,0 +1,111 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
import requests
|
3 |
+
import os
|
4 |
+
import phonenumbers
|
5 |
+
from phonenumbers import geocoder, carrier
|
6 |
+
import re
|
7 |
+
|
8 |
+
# Pobierz klucz API z zmiennej 艣rodowiskowej
|
9 |
+
API_KEY = os.getenv('SAMBANOVA_API_KEY')
|
10 |
+
|
11 |
+
if not API_KEY:
|
12 |
+
st.error("Brak klucza API. Ustaw zmienn膮 艣rodowiskow膮 SAMBANOVA_API_KEY w ustawieniach Spaces.")
|
13 |
+
st.stop()
|
14 |
+
|
15 |
+
# Funkcja do weryfikacji numeru telefonu
|
16 |
+
def get_phone_info(phone_number):
|
17 |
+
try:
|
18 |
+
parsed_number = phonenumbers.parse(phone_number, None)
|
19 |
+
country = geocoder.description_for_number(parsed_number, 'pl')
|
20 |
+
operator = carrier.name_for_number(parsed_number, 'pl')
|
21 |
+
return country, operator
|
22 |
+
except phonenumbers.NumberParseException:
|
23 |
+
return None, None
|
24 |
+
|
25 |
+
# Proste sprawdzenia heurystyczne wiadomo艣ci
|
26 |
+
def simple_checks(message):
|
27 |
+
warnings = []
|
28 |
+
# S艂owa kluczowe cz臋sto u偶ywane w oszustwach
|
29 |
+
scam_keywords = ['pieni膮dze', 'przelew', 'has艂o', 'kod', 'nagroda', 'wygrana', 'pilne', 'pomoc', 'op艂ata']
|
30 |
+
if any(keyword in message.lower() for keyword in scam_keywords):
|
31 |
+
warnings.append("Wiadomo艣膰 zawiera s艂owa kluczowe zwi膮zane z potencjalnym oszustwem.")
|
32 |
+
# Sprawdzenie obecno艣ci link贸w
|
33 |
+
if re.search(r'http[s]?://', message):
|
34 |
+
warnings.append("Wiadomo艣膰 zawiera link.")
|
35 |
+
# Sprawdzenie, czy nadawca prosi o poufne informacje
|
36 |
+
if re.search(r'\b(podaj|prze艣lij|udost臋pnij)\b.*\b(has艂o|kod|dane osobowe|numer konta)\b', message.lower()):
|
37 |
+
warnings.append("Wiadomo艣膰 zawiera pro艣b臋 o poufne informacje.")
|
38 |
+
return warnings
|
39 |
+
|
40 |
+
# Funkcja do analizy wiadomo艣ci za pomoc膮 API SambaNova
|
41 |
+
def analyze_message(message, phone_number):
|
42 |
+
url = "https://api.sambanova.ai/v1/chat/completions"
|
43 |
+
headers = {
|
44 |
+
"Authorization": f"Bearer {API_KEY}"
|
45 |
+
}
|
46 |
+
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."
|
47 |
+
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."
|
48 |
+
|
49 |
+
payload = {
|
50 |
+
"model": "Meta-Llama-3.1-8B-Instruct",
|
51 |
+
"messages": [
|
52 |
+
{"role": "system", "content": system_prompt},
|
53 |
+
{"role": "user", "content": user_prompt}
|
54 |
+
],
|
55 |
+
"max_tokens": 500,
|
56 |
+
"temperature": 0.1,
|
57 |
+
"top_p": 0.9,
|
58 |
+
"stop": ["<|eot_id|>"]
|
59 |
+
}
|
60 |
+
|
61 |
+
response = requests.post(url, headers=headers, json=payload)
|
62 |
+
if response.status_code == 200:
|
63 |
+
data = response.json()
|
64 |
+
analysis = data['choices'][0]['message']['content']
|
65 |
+
return analysis
|
66 |
+
else:
|
67 |
+
return f"B艂膮d API: {response.status_code} - {response.text}"
|
68 |
+
|
69 |
+
# G艂贸wny interfejs aplikacji
|
70 |
+
def main():
|
71 |
+
st.set_page_config(page_title="Detektor Fa艂szywych Wiadomo艣ci SMS", page_icon="馃摫")
|
72 |
+
st.title("馃摫 Detektor Fa艂szywych Wiadomo艣ci SMS")
|
73 |
+
st.write("Wprowad藕 tre艣膰 wiadomo艣ci SMS oraz numer telefonu nadawcy, aby przeprowadzi膰 analiz臋 pod k膮tem potencjalnego oszustwa.")
|
74 |
+
|
75 |
+
with st.form("sms_form"):
|
76 |
+
message = st.text_area("Tre艣膰 wiadomo艣ci SMS", height=150)
|
77 |
+
phone_number = st.text_input("Numer telefonu nadawcy (w formacie mi臋dzynarodowym, np. +48123123123)")
|
78 |
+
submitted = st.form_submit_button("Analizuj wiadomo艣膰")
|
79 |
+
|
80 |
+
if submitted:
|
81 |
+
if not message.strip():
|
82 |
+
st.error("Prosz臋 wprowadzi膰 tre艣膰 wiadomo艣ci.")
|
83 |
+
else:
|
84 |
+
# Wy艣wietl informacje o numerze telefonu
|
85 |
+
if phone_number:
|
86 |
+
country, operator = get_phone_info(phone_number)
|
87 |
+
if country and operator:
|
88 |
+
st.write(f"**Informacje o numerze telefonu:**")
|
89 |
+
st.write(f"- **Kraj:** {country}")
|
90 |
+
st.write(f"- **Operator:** {operator}")
|
91 |
+
else:
|
92 |
+
st.write("Nie uda艂o si臋 uzyska膰 informacji o numerze telefonu.")
|
93 |
+
|
94 |
+
# Przeprowad藕 proste sprawdzenia heurystyczne
|
95 |
+
warnings = simple_checks(message)
|
96 |
+
if warnings:
|
97 |
+
st.warning("Znaleziono nast臋puj膮ce potencjalne czerwone flagi:")
|
98 |
+
for warn in warnings:
|
99 |
+
st.write(f"- {warn}")
|
100 |
+
|
101 |
+
# Analiza za pomoc膮 modelu j臋zykowego
|
102 |
+
with st.spinner("Analizuj臋 wiadomo艣膰 przy u偶yciu modelu AI..."):
|
103 |
+
analysis = analyze_message(message, phone_number)
|
104 |
+
st.subheader("Wynik analizy AI:")
|
105 |
+
st.write(analysis)
|
106 |
+
|
107 |
+
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.")
|
108 |
+
|
109 |
+
if __name__ == "__main__":
|
110 |
+
main()
|
111 |
+
|