rafaldembski commited on
Commit
8d47315
1 Parent(s): 63f76ea

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +58 -184
app.py CHANGED
@@ -1,157 +1,7 @@
1
  import streamlit as st
2
- import requests
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
- # Wyświetl informacje o numerze telefonu
170
- if phone_number:
171
- country, operator = get_phone_info(phone_number)
172
- if country and operator:
173
- st.write(f"**Informacje o numerze telefonu:**")
174
- st.write(f"- **Kraj:** {country}")
175
- st.write(f"- **Operator:** {operator}")
176
- else:
177
- st.write("Nie udało się uzyskać informacji o numerze telefonu.")
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
- # Analiza za pomocą modelu językowego
193
- with st.spinner("Analizuję wiadomość przy użyciu modelu AI..."):
194
- analysis_text, risk_text, recommendations_text = analyze_message(message, phone_number)
195
- st.subheader("📑 Analiza treści wiadomości:")
196
- st.markdown(analysis_text)
197
- st.subheader("⚠️ Ocena ryzyka oszustwa:")
198
- st.markdown(risk_text)
199
- st.subheader("✅ Zalecenia dla użytkownika:")
200
- st.markdown(recommendations_text)
201
-
202
- # Opcja dodania numeru do bazy fałszywych numerów
203
- if phone_number and not is_fake_number(phone_number):
204
- if st.button("Zgłoś numer jako fałszywy"):
205
- add_fake_number(phone_number)
206
- st.success("Numer telefonu został zgłoszony jako fałszywy.")
 
 
 
 
 
 
 
 
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