Spaces:
Sleeping
Sleeping
rafaldembski
commited on
Commit
•
8d47315
1
Parent(s):
63f76ea
Update app.py
Browse files
app.py
CHANGED
@@ -1,157 +1,7 @@
|
|
1 |
import streamlit as st
|
2 |
-
import
|
3 |
import os
|
4 |
-
import phonenumbers
|
5 |
-
from phonenumbers import geocoder, carrier
|
6 |
-
import re
|
7 |
-
import json
|
8 |
-
from datetime import datetime
|
9 |
|
10 |
-
# Ścieżka do pliku JSON przechowującego fałszywe numery
|
11 |
-
FAKE_NUMBERS_FILE = 'fake_numbers.json'
|
12 |
-
|
13 |
-
# Inicjalizacja pliku JSON
|
14 |
-
def init_fake_numbers_file():
|
15 |
-
if not os.path.exists(FAKE_NUMBERS_FILE):
|
16 |
-
with open(FAKE_NUMBERS_FILE, 'w') as f:
|
17 |
-
json.dump([], f)
|
18 |
-
else:
|
19 |
-
# Sprawdzenie, czy plik nie jest pusty i zawiera prawidłowy JSON
|
20 |
-
try:
|
21 |
-
with open(FAKE_NUMBERS_FILE, 'r') as f:
|
22 |
-
json.load(f)
|
23 |
-
except json.JSONDecodeError:
|
24 |
-
# Jeśli plik jest uszkodzony lub pusty, zresetuj go do pustej listy
|
25 |
-
with open(FAKE_NUMBERS_FILE, 'w') as f:
|
26 |
-
json.dump([], f)
|
27 |
-
|
28 |
-
# Dodanie numeru telefonu do pliku JSON
|
29 |
-
def add_fake_number(phone_number):
|
30 |
-
try:
|
31 |
-
with open(FAKE_NUMBERS_FILE, 'r') as f:
|
32 |
-
fake_numbers = json.load(f)
|
33 |
-
except (json.JSONDecodeError, FileNotFoundError):
|
34 |
-
fake_numbers = []
|
35 |
-
|
36 |
-
if not any(entry["phone_number"] == phone_number for entry in fake_numbers):
|
37 |
-
fake_numbers.append({
|
38 |
-
"phone_number": phone_number,
|
39 |
-
"reported_at": datetime.now().isoformat()
|
40 |
-
})
|
41 |
-
with open(FAKE_NUMBERS_FILE, 'w') as f:
|
42 |
-
json.dump(fake_numbers, f, indent=4)
|
43 |
-
|
44 |
-
# Sprawdzenie, czy numer telefonu jest w pliku JSON
|
45 |
-
def is_fake_number(phone_number):
|
46 |
-
try:
|
47 |
-
with open(FAKE_NUMBERS_FILE, 'r') as f:
|
48 |
-
fake_numbers = json.load(f)
|
49 |
-
return any(entry["phone_number"] == phone_number for entry in fake_numbers)
|
50 |
-
except (json.JSONDecodeError, FileNotFoundError):
|
51 |
-
return False
|
52 |
-
|
53 |
-
# Pobierz klucz API z zmiennej środowiskowej
|
54 |
-
API_KEY = os.getenv('SAMBANOVA_API_KEY')
|
55 |
-
|
56 |
-
if not API_KEY:
|
57 |
-
st.error("Brak klucza API. Ustaw zmienną środowiskową SAMBANOVA_API_KEY w ustawieniach Spaces.")
|
58 |
-
st.stop()
|
59 |
-
|
60 |
-
# Funkcja do weryfikacji numeru telefonu
|
61 |
-
def get_phone_info(phone_number):
|
62 |
-
try:
|
63 |
-
parsed_number = phonenumbers.parse(phone_number, None)
|
64 |
-
country = geocoder.description_for_number(parsed_number, 'pl')
|
65 |
-
operator = carrier.name_for_number(parsed_number, 'pl')
|
66 |
-
return country, operator
|
67 |
-
except phonenumbers.NumberParseException:
|
68 |
-
return None, None
|
69 |
-
|
70 |
-
# Proste sprawdzenia heurystyczne wiadomości
|
71 |
-
def simple_checks(message):
|
72 |
-
warnings = []
|
73 |
-
# Słowa kluczowe często używane w oszustwach
|
74 |
-
scam_keywords = ['pieniądze', 'przelew', 'hasło', 'kod', 'nagroda', 'wygrana', 'pilne', 'pomoc', 'opłata']
|
75 |
-
if any(keyword in message.lower() for keyword in scam_keywords):
|
76 |
-
warnings.append("Wiadomość zawiera słowa kluczowe związane z potencjalnym oszustwem.")
|
77 |
-
# Sprawdzenie obecności linków
|
78 |
-
if re.search(r'http[s]?://', message):
|
79 |
-
warnings.append("Wiadomość zawiera link.")
|
80 |
-
# Sprawdzenie, czy nadawca prosi o poufne informacje
|
81 |
-
if re.search(r'\b(podaj|prześlij|udostępnij)\b.*\b(hasło|kod|dane osobowe|numer konta)\b', message.lower()):
|
82 |
-
warnings.append("Wiadomość zawiera prośbę o poufne informacje.")
|
83 |
-
return warnings
|
84 |
-
|
85 |
-
# Funkcja do analizy wiadomości za pomocą API SambaNova z głębszym procesem myślenia
|
86 |
-
def analyze_message(message, phone_number):
|
87 |
-
url = "https://api.sambanova.ai/v1/chat/completions"
|
88 |
-
headers = {
|
89 |
-
"Authorization": f"Bearer {API_KEY}"
|
90 |
-
}
|
91 |
-
# Rozbudowany system prompt z głębszym procesem myślenia
|
92 |
-
system_prompt = """
|
93 |
-
Jesteś zaawansowanym asystentem AI specjalizującym się w identyfikacji fałszywych wiadomości SMS. Twoim zadaniem jest przeprowadzenie szczegółowej analizy wiadomości, wykorzystując głęboki proces myślenia i dostarczając kompleksową ocenę. Twoja odpowiedź powinna być podzielona na trzy sekcje:
|
94 |
-
|
95 |
-
<analysis>
|
96 |
-
**Analiza Treści Wiadomości:**
|
97 |
-
- Przeprowadź szczegółową analizę treści wiadomości, identyfikując potencjalne czerwone flagi, takie jak błędy językowe, prośby o dane osobowe, pilne prośby o kontakt itp.
|
98 |
-
- Opisz kontekst językowy i kulturowy wiadomości.
|
99 |
-
- Zidentyfikuj wszelkie elementy, które mogą sugerować, że wiadomość jest próbą wyłudzenia informacji lub pieniędzy.
|
100 |
-
</analysis>
|
101 |
-
|
102 |
-
<risk_assessment>
|
103 |
-
**Ocena Ryzyka Oszustwa:**
|
104 |
-
- Na podstawie analizy treści i dostępnych informacji oceń prawdopodobieństwo, że wiadomość jest oszustwem. Użyj skali od 1 do 10, gdzie 1 oznacza bardzo niskie ryzyko, a 10 bardzo wysokie ryzyko.
|
105 |
-
- Wyjaśnij, jakie czynniki wpływają na tę ocenę.
|
106 |
-
</risk_assessment>
|
107 |
-
|
108 |
-
<recommendations>
|
109 |
-
**Zalecenia dla Użytkownika:**
|
110 |
-
- Podaj jasne i konkretne zalecenia dotyczące dalszych kroków, które użytkownik powinien podjąć.
|
111 |
-
- Uwzględnij sugestie dotyczące bezpieczeństwa, takie jak blokowanie nadawcy, zgłaszanie wiadomości do odpowiednich instytucji, czy też ignorowanie wiadomości.
|
112 |
-
- Jeśli to możliwe, zasugeruj dodatkowe środki ostrożności, które użytkownik może podjąć, aby chronić swoje dane osobowe i finansowe.
|
113 |
-
</recommendations>
|
114 |
-
|
115 |
-
Twoja odpowiedź powinna być sformatowana dokładnie w powyższy sposób, używając znaczników <analysis>, <risk_assessment> i <recommendations>. Upewnij się, że każda sekcja jest wypełniona kompletnie i szczegółowo.
|
116 |
-
"""
|
117 |
-
|
118 |
-
user_prompt = f"""Przeanalizuj następującą wiadomość pod kątem potencjalnego oszustwa:
|
119 |
-
|
120 |
-
Wiadomość: "{message}"
|
121 |
-
Numer telefonu nadawcy: {phone_number}
|
122 |
-
|
123 |
-
Podaj swoją analizę i wnioski zgodnie z powyższymi wytycznymi."""
|
124 |
-
|
125 |
-
payload = {
|
126 |
-
"model": "Meta-Llama-3.1-8B-Instruct",
|
127 |
-
"messages": [
|
128 |
-
{"role": "system", "content": system_prompt},
|
129 |
-
{"role": "user", "content": user_prompt}
|
130 |
-
],
|
131 |
-
"max_tokens": 1000,
|
132 |
-
"temperature": 0.2,
|
133 |
-
"top_p": 0.9,
|
134 |
-
"stop": ["<|eot_id|>"]
|
135 |
-
}
|
136 |
-
|
137 |
-
response = requests.post(url, headers=headers, json=payload)
|
138 |
-
if response.status_code == 200:
|
139 |
-
data = response.json()
|
140 |
-
ai_response = data['choices'][0]['message']['content']
|
141 |
-
# Parsowanie odpowiedzi
|
142 |
-
analysis = re.search(r'<analysis>(.*?)</analysis>', ai_response, re.DOTALL)
|
143 |
-
risk_assessment = re.search(r'<risk_assessment>(.*?)</risk_assessment>', ai_response, re.DOTALL)
|
144 |
-
recommendations = re.search(r'<recommendations>(.*?)</recommendations>', ai_response, re.DOTALL)
|
145 |
-
|
146 |
-
analysis_text = analysis.group(1).strip() if analysis else "Brak analizy."
|
147 |
-
risk_text = risk_assessment.group(1).strip() if risk_assessment else "Brak oceny ryzyka."
|
148 |
-
recommendations_text = recommendations.group(1).strip() if recommendations else "Brak zaleceń."
|
149 |
-
|
150 |
-
return analysis_text, risk_text, recommendations_text
|
151 |
-
else:
|
152 |
-
return f"Błąd API: {response.status_code} - {response.text}", "", ""
|
153 |
-
|
154 |
-
# Główny interfejs aplikacji
|
155 |
def main():
|
156 |
st.set_page_config(page_title="📱 Detektor Fałszywych Wiadomości SMS", page_icon="📱")
|
157 |
st.title("📱 Detektor Fałszywych Wiadomości SMS")
|
@@ -160,54 +10,78 @@ def main():
|
|
160 |
with st.form("sms_form"):
|
161 |
message = st.text_area("Treść wiadomości SMS", height=150)
|
162 |
phone_number = st.text_input("Numer telefonu nadawcy (w formacie międzynarodowym, np. +48123123123)")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
163 |
submitted = st.form_submit_button("Analizuj wiadomość")
|
164 |
|
165 |
if submitted:
|
166 |
if not message.strip():
|
167 |
st.error("Proszę wprowadzić treść wiadomości.")
|
|
|
|
|
168 |
else:
|
169 |
-
#
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
# Sprawdzenie, czy numer jest w bazie fałszywych numerów
|
180 |
-
if is_fake_number(phone_number):
|
181 |
-
st.warning("Numer telefonu znajduje się w bazie znanych fałszywych numerów.")
|
182 |
-
else:
|
183 |
-
st.info("Numer telefonu nie znajduje się w bazie fałszywych numerów.")
|
184 |
-
|
185 |
-
# Przeprowadź proste sprawdzenia heurystyczne
|
186 |
warnings = simple_checks(message)
|
187 |
if warnings:
|
188 |
st.warning("Znaleziono następujące potencjalne czerwone flagi:")
|
189 |
for warn in warnings:
|
190 |
st.write(f"- {warn}")
|
191 |
|
192 |
-
#
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
if
|
204 |
-
|
205 |
-
|
206 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
207 |
|
208 |
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.")
|
209 |
|
210 |
if __name__ == "__main__":
|
211 |
-
init_fake_numbers_file()
|
212 |
main()
|
213 |
|
|
|
1 |
import streamlit as st
|
2 |
+
from utils.functions import get_phone_info, simple_checks, analyze_message
|
3 |
import os
|
|
|
|
|
|
|
|
|
|
|
4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5 |
def main():
|
6 |
st.set_page_config(page_title="📱 Detektor Fałszywych Wiadomości SMS", page_icon="📱")
|
7 |
st.title("📱 Detektor Fałszywych Wiadomości SMS")
|
|
|
10 |
with st.form("sms_form"):
|
11 |
message = st.text_area("Treść wiadomości SMS", height=150)
|
12 |
phone_number = st.text_input("Numer telefonu nadawcy (w formacie międzynarodowym, np. +48123123123)")
|
13 |
+
|
14 |
+
st.markdown("### Dodatkowe Informacje")
|
15 |
+
# Dodane pytania
|
16 |
+
frequency = st.selectbox(
|
17 |
+
"Jak często otrzymujesz wiadomości od tego numeru?",
|
18 |
+
('Pierwszy raz', 'Sporadycznie', 'Regularnie')
|
19 |
+
)
|
20 |
+
last_received = st.selectbox(
|
21 |
+
"Kiedy ostatnio otrzymałeś podobną wiadomość?",
|
22 |
+
('Dziś', 'W ciągu ostatniego tygodnia', 'W ciągu ostatniego miesiąca', 'Dłużej')
|
23 |
+
)
|
24 |
+
confidence_level = st.slider(
|
25 |
+
"Jak bardzo jesteś pewny, że wiadomość jest autentyczna?",
|
26 |
+
1, 5, 3,
|
27 |
+
help="1: Bardzo mało pewny, 5: Bardzo pewny"
|
28 |
+
)
|
29 |
+
unexpected = st.radio(
|
30 |
+
"Czy otrzymanie tej wiadomości było dla Ciebie niespodziewane?",
|
31 |
+
('Tak', 'Nie')
|
32 |
+
)
|
33 |
+
additional_notes = st.text_area("Dodatkowe uwagi lub informacje (opcjonalnie)", height=100)
|
34 |
+
|
35 |
submitted = st.form_submit_button("Analizuj wiadomość")
|
36 |
|
37 |
if submitted:
|
38 |
if not message.strip():
|
39 |
st.error("Proszę wprowadzić treść wiadomości.")
|
40 |
+
elif not phone_number.strip():
|
41 |
+
st.error("Proszę wprowadzić numer telefonu nadawcy.")
|
42 |
else:
|
43 |
+
# Informacje o numerze telefonu
|
44 |
+
country, operator = get_phone_info(phone_number)
|
45 |
+
if country and operator:
|
46 |
+
st.write(f"**Informacje o numerze telefonu:**")
|
47 |
+
st.write(f"- **Kraj:** {country}")
|
48 |
+
st.write(f"- **Operator:** {operator}")
|
49 |
+
else:
|
50 |
+
st.write("Nie udało się uzyskać informacji o numerze telefonu.")
|
51 |
+
|
52 |
+
# Heurystyczne sprawdzenia
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
53 |
warnings = simple_checks(message)
|
54 |
if warnings:
|
55 |
st.warning("Znaleziono następujące potencjalne czerwone flagi:")
|
56 |
for warn in warnings:
|
57 |
st.write(f"- {warn}")
|
58 |
|
59 |
+
# Zbierz dodatkowe informacje
|
60 |
+
additional_info = f"""
|
61 |
+
**Jak często otrzymujesz wiadomości od tego numeru?** {frequency}
|
62 |
+
**Kiedy ostatnio otrzymałeś podobną wiadomość?** {last_received}
|
63 |
+
**Jak bardzo jesteś pewny, że wiadomość jest autentyczna?** {confidence_level}/5
|
64 |
+
**Czy otrzymanie tej wiadomości było dla Ciebie niespodziewane?** {unexpected}
|
65 |
+
**Dodatkowe uwagi lub informacje:** {additional_notes}
|
66 |
+
"""
|
67 |
+
|
68 |
+
# Pobierz klucz API
|
69 |
+
api_key = os.getenv('SAMBANOVA_API_KEY')
|
70 |
+
if not api_key:
|
71 |
+
st.error("Brak klucza API. Ustaw zmienną środowiskową SAMBANOVA_API_KEY w ustawieniach aplikacji.")
|
72 |
+
else:
|
73 |
+
# Analiza za pomocą modelu AI
|
74 |
+
with st.spinner("Analizuję wiadomość przy użyciu modelu AI..."):
|
75 |
+
analysis_text, risk_text, recommendations_text = analyze_message(message, phone_number, additional_info, api_key)
|
76 |
+
st.subheader("📑 Analiza treści wiadomości:")
|
77 |
+
st.markdown(analysis_text)
|
78 |
+
st.subheader("⚠️ Ocena ryzyka oszustwa:")
|
79 |
+
st.markdown(risk_text)
|
80 |
+
st.subheader("✅ Zalecenia dla użytkownika:")
|
81 |
+
st.markdown(recommendations_text)
|
82 |
|
83 |
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.")
|
84 |
|
85 |
if __name__ == "__main__":
|
|
|
86 |
main()
|
87 |
|