Spaces:
Sleeping
Sleeping
rafaldembski
commited on
Commit
•
1fbaac1
1
Parent(s):
47ec987
Update utils/functions.py
Browse files- utils/functions.py +90 -206
utils/functions.py
CHANGED
@@ -1,14 +1,15 @@
|
|
|
|
|
|
1 |
import phonenumbers
|
2 |
-
from phonenumbers import geocoder, carrier
|
3 |
import re
|
4 |
import requests
|
5 |
import os
|
6 |
from datetime import datetime
|
7 |
import logging
|
8 |
import json
|
9 |
-
|
10 |
-
|
11 |
-
import pytesseract # Upewnij się, że moduł 'pytesseract' jest zainstalowany: pip install pytesseract
|
12 |
|
13 |
# Konfiguracja logowania
|
14 |
logging.basicConfig(
|
@@ -24,10 +25,8 @@ FAKE_NUMBERS_FILE = os.path.join(DATA_DIR, 'fake_numbers.json')
|
|
24 |
HISTORY_FILE = os.path.join(DATA_DIR, 'history.json')
|
25 |
STATS_FILE = os.path.join(DATA_DIR, 'stats.json')
|
26 |
|
27 |
-
# Upewnij się, że katalog 'data' istnieje
|
28 |
-
os.makedirs(DATA_DIR, exist_ok=True)
|
29 |
-
|
30 |
# Funkcje pomocnicze
|
|
|
31 |
def load_json(file_path):
|
32 |
"""Ładuje dane z pliku JSON. Jeśli plik nie istnieje, zwraca pustą listę lub domyślny obiekt."""
|
33 |
if not os.path.exists(file_path):
|
@@ -51,19 +50,10 @@ def save_json(file_path, data):
|
|
51 |
json.dump(data, file, ensure_ascii=False, indent=4)
|
52 |
logging.info(f"Dane zostały zapisane do {file_path}.")
|
53 |
|
54 |
-
# Funkcja aktualizacji statystyk
|
55 |
-
def update_stats(fraud_detected):
|
56 |
-
"""Aktualizuje statystyki na podstawie wyniku analizy."""
|
57 |
-
stats = load_json(STATS_FILE)
|
58 |
-
stats["total_analyses"] += 1
|
59 |
-
if fraud_detected:
|
60 |
-
stats["total_frauds_detected"] += 1
|
61 |
-
save_json(STATS_FILE, stats)
|
62 |
-
logging.info(f"Statystyki zaktualizowane: {stats}.")
|
63 |
-
|
64 |
-
# Funkcje związane z fałszywymi numerami telefonów
|
65 |
def add_fake_number(phone_number):
|
66 |
-
"""
|
|
|
|
|
67 |
fake_numbers = load_json(FAKE_NUMBERS_FILE)
|
68 |
if phone_number not in fake_numbers:
|
69 |
fake_numbers.append(phone_number)
|
@@ -75,21 +65,88 @@ def add_fake_number(phone_number):
|
|
75 |
return False
|
76 |
|
77 |
def is_fake_number(phone_number):
|
78 |
-
"""
|
|
|
|
|
79 |
fake_numbers = load_json(FAKE_NUMBERS_FILE)
|
80 |
exists = phone_number in fake_numbers
|
81 |
logging.info(f"Sprawdzanie numeru {phone_number}: {'znaleziony' if exists else 'nie znaleziony'}.")
|
82 |
return exists
|
83 |
|
84 |
def get_fake_numbers():
|
85 |
-
"""
|
|
|
|
|
86 |
fake_numbers = load_json(FAKE_NUMBERS_FILE)
|
87 |
return fake_numbers
|
88 |
|
89 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
90 |
def simple_checks(message, language):
|
91 |
-
"""
|
|
|
|
|
92 |
warnings = []
|
|
|
93 |
scam_keywords = {
|
94 |
'Polish': ['pieniądze', 'przelew', 'hasło', 'kod', 'nagroda', 'wygrana', 'pilne', 'pomoc', 'opłata', 'bank', 'karta', 'konto', 'logowanie', 'transakcja', 'weryfikacja', 'dane osobowe', 'szybka płatność', 'blokada konta', 'powiadomienie'],
|
95 |
'German': ['Geld', 'Überweisung', 'Passwort', 'Code', 'Preis', 'Gewinn', 'dringend', 'Hilfe', 'Gebühr', 'Bank', 'Karte', 'Konto', 'Anmeldung', 'Transaktion', 'Verifizierung', 'persönliche Daten', 'schnelle Zahlung', 'Kontosperrung', 'Benachrichtigung'],
|
@@ -97,6 +154,7 @@ def simple_checks(message, language):
|
|
97 |
}
|
98 |
|
99 |
selected_keywords = scam_keywords.get(language, scam_keywords['English'])
|
|
|
100 |
message_lower = message.lower()
|
101 |
|
102 |
if any(keyword.lower() in message_lower for keyword in selected_keywords):
|
@@ -107,13 +165,15 @@ def simple_checks(message, language):
|
|
107 |
warnings.append("Wiadomość zawiera prośbę o poufne informacje.")
|
108 |
return warnings
|
109 |
|
110 |
-
def analyze_message(
|
111 |
-
"""
|
|
|
|
|
112 |
if not api_key:
|
113 |
logging.error("Brak klucza API.")
|
114 |
return "Brak klucza API.", "Brak klucza API.", "Brak klucza API."
|
115 |
|
116 |
-
url = "https://api.sambanova.ai/v1/chat/completions"
|
117 |
headers = {
|
118 |
"Authorization": f"Bearer {api_key}",
|
119 |
"Content-Type": "application/json"
|
@@ -197,152 +257,12 @@ Your response should be formatted exactly as specified above, using the <analysi
|
|
197 |
"""
|
198 |
}
|
199 |
|
200 |
-
system_prompt = system_prompts.get(language, system_prompts['English'])
|
201 |
|
202 |
user_prompt = f"""Analyze the following message for potential fraud:
|
203 |
|
204 |
-
Message: "{
|
205 |
-
Sender
|
206 |
-
|
207 |
-
Additional Information:
|
208 |
-
{additional_info}
|
209 |
-
|
210 |
-
Provide your analysis and conclusions following the guidelines above."""
|
211 |
-
|
212 |
-
payload = {
|
213 |
-
"model": "Meta-Llama-3.1-8B-Instruct",
|
214 |
-
"messages": [
|
215 |
-
{"role": "system", "content": system_prompt},
|
216 |
-
{"role": "user", "content": user_prompt}
|
217 |
-
],
|
218 |
-
"max_tokens": 1000,
|
219 |
-
"temperature": 0.2,
|
220 |
-
"top_p": 0.9,
|
221 |
-
"stop": ["<|eot_id|>"]
|
222 |
-
}
|
223 |
-
|
224 |
-
try:
|
225 |
-
response = requests.post(url, headers=headers, json=payload)
|
226 |
-
if response.status_code == 200:
|
227 |
-
data = response.json()
|
228 |
-
ai_response = data['choices'][0]['message']['content']
|
229 |
-
# Parsowanie odpowiedzi
|
230 |
-
analysis = re.search(r'<analysis>(.*?)</analysis>', ai_response, re.DOTALL)
|
231 |
-
risk_assessment = re.search(r'<risk_assessment>(.*?)</risk_assessment>', ai_response, re.DOTALL)
|
232 |
-
recommendations = re.search(r'<recommendations>(.*?)</recommendations>', ai_response, re.DOTALL)
|
233 |
-
|
234 |
-
analysis_text = analysis.group(1).strip() if analysis else "Brak analizy."
|
235 |
-
risk_text = risk_assessment.group(1).strip() if risk_assessment else "Brak oceny ryzyka."
|
236 |
-
recommendations_text = recommendations.group(1).strip() if recommendations else "Brak zaleceń."
|
237 |
-
|
238 |
-
return analysis_text, risk_text, recommendations_text
|
239 |
-
else:
|
240 |
-
logging.error(f"Błąd API: {response.status_code} - {response.text}")
|
241 |
-
return f"Błąd API: {response.status_code} - {response.text}", "Błąd analizy.", "Błąd analizy."
|
242 |
-
except Exception as e:
|
243 |
-
logging.error(f"Błąd połączenia z API: {e}")
|
244 |
-
return f"Błąd połączenia z API: {e}", "Błąd analizy.", "Błąd analizy."
|
245 |
-
|
246 |
-
# Funkcje analizy email
|
247 |
-
def analyze_email_message(content, sender_info, additional_info, api_key, language):
|
248 |
-
"""Analizuje treść wiadomości email za pomocą modelu AI, wykorzystując system prompts."""
|
249 |
-
if not api_key:
|
250 |
-
logging.error("Brak klucza API.")
|
251 |
-
return "Brak klucza API.", "Brak klucza API.", "Brak klucza API."
|
252 |
-
|
253 |
-
url = "https://api.sambanova.ai/v1/chat/completions"
|
254 |
-
headers = {
|
255 |
-
"Authorization": f"Bearer {api_key}",
|
256 |
-
"Content-Type": "application/json"
|
257 |
-
}
|
258 |
-
|
259 |
-
system_prompts = {
|
260 |
-
'Polish': """
|
261 |
-
Jesteś zaawansowanym asystentem AI specjalizującym się w identyfikacji fałszywych wiadomości email. Twoim zadaniem jest przeprowadzenie szczegółowej analizy poniższej wiadomości email, wykorzystując głęboki proces myślenia i dostarczając kompleksową ocenę. Twoja odpowiedź powinna być podzielona na trzy sekcje:
|
262 |
-
|
263 |
-
<analysis>
|
264 |
-
**Analiza Treści Wiadomości:**
|
265 |
-
- Przeprowadź szczegółową analizę treści wiadomości email, identyfikując potencjalne czerwone flagi, takie jak błędy językowe, podejrzane linki, prośby o dane osobowe, pilne prośby o kontakt itp.
|
266 |
-
- Oceń autentyczność adresu email nadawcy.
|
267 |
-
- Opisz kontekst językowy i kulturowy wiadomości.
|
268 |
-
- Zidentyfikuj wszelkie elementy, które mogą sugerować, że wiadomość jest próbą phishingu lub oszustwa.
|
269 |
-
</analysis>
|
270 |
-
|
271 |
-
<risk_assessment>
|
272 |
-
**Ocena Ryzyka Oszustwa:**
|
273 |
-
- Na podstawie analizy treści i dostępnych informacji oceń prawdopodobieństwo, że wiadomość email jest oszustwem. Użyj skali od 1 do 10, gdzie 1 oznacza bardzo niskie ryzyko, a 10 bardzo wysokie ryzyko.
|
274 |
-
- Wyjaśnij, jakie czynniki wpływają na tę ocenę.
|
275 |
-
</risk_assessment>
|
276 |
-
|
277 |
-
<recommendations>
|
278 |
-
**Zalecenia dla Użytkownika:**
|
279 |
-
- Podaj jasne i konkretne zalecenia dotyczące dalszych kroków, które użytkownik powinien podjąć.
|
280 |
-
- Uwzględnij sugestie dotyczące bezpieczeństwa, takie jak nieklikanie w podejrzane linki, nieotwieranie załączników, zgłaszanie wiadomości do odpowiednich instytucji itp.
|
281 |
-
- 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.
|
282 |
-
</recommendations>
|
283 |
-
|
284 |
-
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.
|
285 |
-
""",
|
286 |
-
'German': """
|
287 |
-
Du bist ein fortgeschrittener KI-Assistent, spezialisiert auf die Identifizierung gefälschter Nachrichtenemail. Deine Aufgabe ist es, eine detaillierte Analyse der folgenden Nachricht email durchzuführen, indem du einen tiefgreifenden Denkprozess nutzt und eine umfassende Bewertung lieferst. Deine Antwort sollte in drei Abschnitte unterteilt sein:
|
288 |
-
|
289 |
-
<analysis>
|
290 |
-
**Nachrichteninhaltsanalyse:**
|
291 |
-
- Führe eine detaillierte Analyse des Nachrichteninhalts durch und identifiziere potenzielle rote Flaggen wie sprachliche Fehler, verdächtige Links, Aufforderungen zur Preisgabe persönlicher Daten, dringende Kontaktanfragen usw.
|
292 |
-
- Beurteile die Authentizität der E-Mail-Adresse des Absenders.
|
293 |
-
- Beschreibe den sprachlichen und kulturellen Kontext der Nachricht.
|
294 |
-
- Identifiziere alle Elemente, die darauf hindeuten könnten, dass die Nachricht ein Versuch von Phishing oder Betrug ist.
|
295 |
-
</analysis>
|
296 |
-
|
297 |
-
<risk_assessment>
|
298 |
-
**Betrugsrisikobewertung:**
|
299 |
-
- Basierend auf der Inhaltsanalyse und den verfügbaren Informationen, bewerte die Wahrscheinlichkeit, dass die Nachricht email ein Betrug ist. Verwende eine Skala von 1 bis 10, wobei 1 sehr geringes Risiko und 10 sehr hohes Risiko bedeutet.
|
300 |
-
- Erkläre, welche Faktoren diese Bewertung beeinflussen.
|
301 |
-
</risk_assessment>
|
302 |
-
|
303 |
-
<recommendations>
|
304 |
-
**Empfehlungen für den Benutzer:**
|
305 |
-
- Gib klare und konkrete Empfehlungen zu den nächsten Schritten, die der Benutzer unternehmen sollte.
|
306 |
-
- Berücksichtige Sicherheitsempfehlungen wie das Nicht-Klicken auf verdächtige Links, das Nicht-Otöffnen von Anhängen, das Melden der Nachricht an entsprechende Behörden usw.
|
307 |
-
- Wenn möglich, schlage zusätzliche Vorsichtsmaßnahmen vor, die der Benutzer ergreifen kann, um seine persönlichen und finanziellen Daten zu schützen.
|
308 |
-
</recommendations>
|
309 |
-
|
310 |
-
Deine Antwort sollte genau nach den oben genannten Richtlinien formatiert sein und die Markierungen <analysis>, <risk_assessment> und <recommendations> verwenden. Stelle sicher, dass jeder Abschnitt vollständig und detailliert ausgefüllt ist.
|
311 |
-
""",
|
312 |
-
'English': """
|
313 |
-
You are an advanced AI assistant specializing in identifying fake email messages. Your task is to conduct a detailed analysis of the following email message, utilizing a deep thinking process and providing a comprehensive assessment. Your response should be divided into three sections:
|
314 |
-
|
315 |
-
<analysis>
|
316 |
-
**Message Content Analysis:**
|
317 |
-
- Conduct a detailed analysis of the email message content, identifying potential red flags such as language errors, suspicious links, requests for personal information, urgent contact requests, etc.
|
318 |
-
- Assess the authenticity of the sender's email address.
|
319 |
-
- Describe the linguistic and cultural context of the message.
|
320 |
-
- Identify any elements that may suggest the message is an attempt at phishing or fraud.
|
321 |
-
</analysis>
|
322 |
-
|
323 |
-
<risk_assessment>
|
324 |
-
**Fraud Risk Assessment:**
|
325 |
-
- Based on the content analysis and available information, assess the likelihood that the email message is fraudulent. Use a scale from 1 to 10, where 1 indicates very low risk and 10 indicates very high risk.
|
326 |
-
- Explain the factors that influence this assessment.
|
327 |
-
</risk_assessment>
|
328 |
-
|
329 |
-
<recommendations>
|
330 |
-
**User Recommendations:**
|
331 |
-
- Provide clear and concrete recommendations regarding the next steps the user should take.
|
332 |
-
- Include security suggestions such as not clicking on suspicious links, not opening attachments, reporting the message to appropriate authorities, etc.
|
333 |
-
- If possible, suggest additional precautionary measures the user can take to protect their personal and financial information.
|
334 |
-
</recommendations>
|
335 |
-
|
336 |
-
Your response should be formatted exactly as specified above, using the <analysis>, <risk_assessment>, and <recommendations> tags. Ensure that each section is thoroughly and comprehensively filled out.
|
337 |
-
"""
|
338 |
-
}
|
339 |
-
|
340 |
-
system_prompt = system_prompts.get(language, system_prompts['English'])
|
341 |
-
|
342 |
-
user_prompt = f"""Analyze the following email message for potential fraud:
|
343 |
-
|
344 |
-
Email Content: "{content}"
|
345 |
-
Sender Information: "{sender_info}"
|
346 |
|
347 |
Additional Information:
|
348 |
{additional_info}
|
@@ -350,7 +270,7 @@ Additional Information:
|
|
350 |
Provide your analysis and conclusions following the guidelines above."""
|
351 |
|
352 |
payload = {
|
353 |
-
"model": "Meta-Llama-3.1-8B-Instruct",
|
354 |
"messages": [
|
355 |
{"role": "system", "content": system_prompt},
|
356 |
{"role": "user", "content": user_prompt}
|
@@ -382,39 +302,3 @@ Provide your analysis and conclusions following the guidelines above."""
|
|
382 |
except Exception as e:
|
383 |
logging.error(f"Błąd połączenia z API: {e}")
|
384 |
return f"Błąd połączenia z API: {e}", "Błąd analizy.", "Błąd analizy."
|
385 |
-
|
386 |
-
# Funkcja analizy stron internetowych
|
387 |
-
def analyze_website(url, language):
|
388 |
-
"""Analizuje zawartość strony internetowej."""
|
389 |
-
if not api_key:
|
390 |
-
logging.error("Brak klucza API.")
|
391 |
-
return "Brak klucza API.", "Brak klucza API."
|
392 |
-
|
393 |
-
try:
|
394 |
-
response = requests.get(url)
|
395 |
-
if response.status_code == 200:
|
396 |
-
content = response.text
|
397 |
-
logging.info(f"Zawartość strony {url} została pobrana pomyślnie.")
|
398 |
-
return content
|
399 |
-
else:
|
400 |
-
logging.error(f"Błąd podczas pobierania zawartości strony {url}: {response.status_code}")
|
401 |
-
return f"Błąd: {response.status_code}", "Błąd analizy strony.", "Błąd analizy strony."
|
402 |
-
except Exception as e:
|
403 |
-
logging.error(f"Błąd połączenia z {url}: {e}")
|
404 |
-
return f"Błąd połączenia z {url}: {e}", "Błąd analizy strony.", "Błąd analizy strony."
|
405 |
-
|
406 |
-
def get_phone_info(phone_number):
|
407 |
-
"""Weryfikuje numer telefonu i zwraca informacje o kraju i operatorze."""
|
408 |
-
try:
|
409 |
-
parsed_number = phonenumbers.parse(phone_number, None)
|
410 |
-
country = geocoder.description_for_number(parsed_number, 'pl')
|
411 |
-
operator = carrier.name_for_number(parsed_number, 'pl')
|
412 |
-
if not country:
|
413 |
-
country = "Nieznany"
|
414 |
-
if not operator:
|
415 |
-
operator = "Nieznany"
|
416 |
-
logging.info(f"Numer {phone_number} - Kraj: {country}, Operator: {operator}.")
|
417 |
-
return country, operator
|
418 |
-
except NumberParseException as e:
|
419 |
-
logging.error(f"Nie udało się przetworzyć numeru telefonu {phone_number}: {e}")
|
420 |
-
return "Nieznany", "Nieznany"
|
|
|
1 |
+
# utils/functions.py
|
2 |
+
|
3 |
import phonenumbers
|
4 |
+
from phonenumbers import geocoder, carrier
|
5 |
import re
|
6 |
import requests
|
7 |
import os
|
8 |
from datetime import datetime
|
9 |
import logging
|
10 |
import json
|
11 |
+
|
12 |
+
import pycountry # Upewnij się, że zainstalowałeś tę bibliotekę: pip install pycountry
|
|
|
13 |
|
14 |
# Konfiguracja logowania
|
15 |
logging.basicConfig(
|
|
|
25 |
HISTORY_FILE = os.path.join(DATA_DIR, 'history.json')
|
26 |
STATS_FILE = os.path.join(DATA_DIR, 'stats.json')
|
27 |
|
|
|
|
|
|
|
28 |
# Funkcje pomocnicze
|
29 |
+
|
30 |
def load_json(file_path):
|
31 |
"""Ładuje dane z pliku JSON. Jeśli plik nie istnieje, zwraca pustą listę lub domyślny obiekt."""
|
32 |
if not os.path.exists(file_path):
|
|
|
50 |
json.dump(data, file, ensure_ascii=False, indent=4)
|
51 |
logging.info(f"Dane zostały zapisane do {file_path}.")
|
52 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
53 |
def add_fake_number(phone_number):
|
54 |
+
"""
|
55 |
+
Dodaje numer telefonu do pliku fake_numbers.json jako fałszywy, jeśli jeszcze go tam nie ma.
|
56 |
+
"""
|
57 |
fake_numbers = load_json(FAKE_NUMBERS_FILE)
|
58 |
if phone_number not in fake_numbers:
|
59 |
fake_numbers.append(phone_number)
|
|
|
65 |
return False
|
66 |
|
67 |
def is_fake_number(phone_number):
|
68 |
+
"""
|
69 |
+
Sprawdza, czy dany numer telefonu jest oznaczony jako fałszywy w pliku fake_numbers.json.
|
70 |
+
"""
|
71 |
fake_numbers = load_json(FAKE_NUMBERS_FILE)
|
72 |
exists = phone_number in fake_numbers
|
73 |
logging.info(f"Sprawdzanie numeru {phone_number}: {'znaleziony' if exists else 'nie znaleziony'}.")
|
74 |
return exists
|
75 |
|
76 |
def get_fake_numbers():
|
77 |
+
"""
|
78 |
+
Pobiera listę fałszywych numerów z pliku fake_numbers.json.
|
79 |
+
"""
|
80 |
fake_numbers = load_json(FAKE_NUMBERS_FILE)
|
81 |
return fake_numbers
|
82 |
|
83 |
+
def add_to_history(message, phone_number, analysis, risk, recommendations):
|
84 |
+
"""
|
85 |
+
Dodaje wpis do historii analiz w pliku history.json.
|
86 |
+
"""
|
87 |
+
history = load_json(HISTORY_FILE)
|
88 |
+
history.append({
|
89 |
+
"timestamp": datetime.now().isoformat(),
|
90 |
+
"message": message,
|
91 |
+
"phone_number": phone_number,
|
92 |
+
"analysis": analysis,
|
93 |
+
"risk_assessment": risk,
|
94 |
+
"recommendations": recommendations
|
95 |
+
})
|
96 |
+
save_json(HISTORY_FILE, history)
|
97 |
+
logging.info(f"Dodano wpis do history.json dla numeru {phone_number}.")
|
98 |
+
|
99 |
+
def get_history():
|
100 |
+
"""
|
101 |
+
Pobiera historię analiz z pliku history.json jako listę słowników.
|
102 |
+
"""
|
103 |
+
history = load_json(HISTORY_FILE)
|
104 |
+
logging.info("Historia analiz została pobrana pomyślnie.")
|
105 |
+
return history
|
106 |
+
|
107 |
+
def update_stats(fraud_detected=False):
|
108 |
+
"""
|
109 |
+
Aktualizuje statystyki analiz w pliku stats.json.
|
110 |
+
"""
|
111 |
+
stats = load_json(STATS_FILE)
|
112 |
+
stats["total_analyses"] += 1
|
113 |
+
if fraud_detected:
|
114 |
+
stats["total_frauds_detected"] += 1
|
115 |
+
save_json(STATS_FILE, stats)
|
116 |
+
logging.info(f"Statystyki zostały zaktualizowane: Analiz {stats['total_analyses']}, Oszustw {stats['total_frauds_detected']}.")
|
117 |
+
|
118 |
+
def get_stats():
|
119 |
+
"""
|
120 |
+
Pobiera statystyki analiz z pliku stats.json.
|
121 |
+
"""
|
122 |
+
stats = load_json(STATS_FILE)
|
123 |
+
logging.info("Statystyki zostały pobrane pomyślnie.")
|
124 |
+
return stats
|
125 |
+
|
126 |
+
def get_phone_info(phone_number):
|
127 |
+
"""
|
128 |
+
Weryfikuje numer telefonu i zwraca informacje o kraju i operatorze.
|
129 |
+
"""
|
130 |
+
try:
|
131 |
+
parsed_number = phonenumbers.parse(phone_number, None)
|
132 |
+
country = geocoder.description_for_number(parsed_number, 'pl') # Zmiana na 'pl' dla polskiego
|
133 |
+
operator = carrier.name_for_number(parsed_number, 'pl') # Zmiana na 'pl' dla polskiego
|
134 |
+
if not country:
|
135 |
+
country = "Nieznany"
|
136 |
+
if not operator:
|
137 |
+
operator = "Nieznany"
|
138 |
+
logging.info(f"Numer {phone_number} - Kraj: {country}, Operator: {operator}.")
|
139 |
+
return country, operator
|
140 |
+
except phonenumbers.NumberParseException as e:
|
141 |
+
logging.error(f"Nie udało się przetworzyć numeru telefonu {phone_number}: {e}")
|
142 |
+
return "Nieznany", "Nieznany"
|
143 |
+
|
144 |
def simple_checks(message, language):
|
145 |
+
"""
|
146 |
+
Przeprowadza proste sprawdzenia heurystyczne wiadomości SMS.
|
147 |
+
"""
|
148 |
warnings = []
|
149 |
+
# Baza słów kluczowych (polski, niemiecki, angielski)
|
150 |
scam_keywords = {
|
151 |
'Polish': ['pieniądze', 'przelew', 'hasło', 'kod', 'nagroda', 'wygrana', 'pilne', 'pomoc', 'opłata', 'bank', 'karta', 'konto', 'logowanie', 'transakcja', 'weryfikacja', 'dane osobowe', 'szybka płatność', 'blokada konta', 'powiadomienie'],
|
152 |
'German': ['Geld', 'Überweisung', 'Passwort', 'Code', 'Preis', 'Gewinn', 'dringend', 'Hilfe', 'Gebühr', 'Bank', 'Karte', 'Konto', 'Anmeldung', 'Transaktion', 'Verifizierung', 'persönliche Daten', 'schnelle Zahlung', 'Kontosperrung', 'Benachrichtigung'],
|
|
|
154 |
}
|
155 |
|
156 |
selected_keywords = scam_keywords.get(language, scam_keywords['English'])
|
157 |
+
|
158 |
message_lower = message.lower()
|
159 |
|
160 |
if any(keyword.lower() in message_lower for keyword in selected_keywords):
|
|
|
165 |
warnings.append("Wiadomość zawiera prośbę o poufne informacje.")
|
166 |
return warnings
|
167 |
|
168 |
+
def analyze_message(message, phone_number, additional_info, api_key, language):
|
169 |
+
"""
|
170 |
+
Analizuje wiadomość SMS za pomocą API SambaNova.
|
171 |
+
"""
|
172 |
if not api_key:
|
173 |
logging.error("Brak klucza API.")
|
174 |
return "Brak klucza API.", "Brak klucza API.", "Brak klucza API."
|
175 |
|
176 |
+
url = "https://api.sambanova.ai/v1/chat/completions" # Upewnij się, że to poprawny URL
|
177 |
headers = {
|
178 |
"Authorization": f"Bearer {api_key}",
|
179 |
"Content-Type": "application/json"
|
|
|
257 |
"""
|
258 |
}
|
259 |
|
260 |
+
system_prompt = system_prompts.get(language, system_prompts['English']) # Domyślnie angielski, jeśli język nie jest obsługiwany
|
261 |
|
262 |
user_prompt = f"""Analyze the following message for potential fraud:
|
263 |
|
264 |
+
Message: "{message}"
|
265 |
+
Sender's Phone Number: "{phone_number}"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
266 |
|
267 |
Additional Information:
|
268 |
{additional_info}
|
|
|
270 |
Provide your analysis and conclusions following the guidelines above."""
|
271 |
|
272 |
payload = {
|
273 |
+
"model": "Meta-Llama-3.1-8B-Instruct", # Upewnij się, że to poprawny model API
|
274 |
"messages": [
|
275 |
{"role": "system", "content": system_prompt},
|
276 |
{"role": "user", "content": user_prompt}
|
|
|
302 |
except Exception as e:
|
303 |
logging.error(f"Błąd połączenia z API: {e}")
|
304 |
return f"Błąd połączenia z API: {e}", "Błąd analizy.", "Błąd analizy."
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|