API réception alertes chute (SmartEye/YOLO), analyse IA (Gemini 2.5 Flash), gestion alertes avec escalade (watchdog), notifications Firebase, dashboard web, documentation MkDocs. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
141 lines
4.4 KiB
Python
Executable File
141 lines
4.4 KiB
Python
Executable File
# -*- coding: utf-8 -*-
|
|
import json
|
|
import ovh
|
|
import os
|
|
import sys
|
|
import psycopg2
|
|
|
|
# DB Config
|
|
DB_PARAMS = {
|
|
"host": "localhost",
|
|
"database": "smarteye",
|
|
"user": "lucas",
|
|
"password": "smarteye_db_pass"
|
|
}
|
|
|
|
# --- CONFIGURATION OVH (A REMPLIR AVEC TES VRAIES CLES) ---
|
|
client = ovh.Client(
|
|
endpoint='ovh-eu',
|
|
application_key='dc809738a0e0ca05',
|
|
application_secret='9a0b1723318676047919f397cabbd4d6',
|
|
consumer_key='f1cd0f7101fe2f9e57d1e3bc7c230fa0'
|
|
)
|
|
SERVICE_NAME = "sms-gr31483-1" # Ton ID Service (gardé de ton ancien code)
|
|
|
|
# --- MAIN : Réception des ordres de PHP ---
|
|
if __name__ == "__main__":
|
|
# On attend 2 arguments : le numéro et le message
|
|
if len(sys.argv) < 3:
|
|
print("Erreur: Arguments manquants")
|
|
sys.exit(1)
|
|
|
|
destinataire = sys.argv[1]
|
|
message_txt = sys.argv[2]
|
|
|
|
try:
|
|
# ENVOI REEL OVH
|
|
result = client.post(f'/sms/{SERVICE_NAME}/jobs',
|
|
message=message_txt,
|
|
sender="UNIGESTFR",
|
|
receivers=[destinataire],
|
|
noStopClause=True,
|
|
priority="high"
|
|
)
|
|
print(f"✅ SUCCÈS OVH: {result}")
|
|
|
|
except Exception as e:
|
|
print(f"❌ ERREUR OVH: {str(e)}")
|
|
|
|
|
|
|
|
def get_contacts(client_id):
|
|
"""Lit database.json et renvoie le Nom du client et la liste des numéros"""
|
|
db_path = '/var/www/lucas/database.json' # Chemin absolu pour être sûr
|
|
|
|
if not os.path.exists(db_path):
|
|
return "Inconnu", []
|
|
|
|
try:
|
|
with open(db_path, 'r') as f:
|
|
data = json.load(f)
|
|
|
|
# Structure : clients -> client_id -> contacts
|
|
client_data = data.get("clients", {}).get(client_id)
|
|
if not client_data:
|
|
return "Client Inconnu", []
|
|
|
|
nom_client = client_data.get("name", "Client")
|
|
contacts_list = client_data.get("contacts", [])
|
|
|
|
numeros_a_contacter = []
|
|
for contact in contacts_list:
|
|
phone = contact.get("phone")
|
|
if phone:
|
|
# Nettoyage
|
|
clean = phone.replace(" ", "").replace(".", "").replace("-", "")
|
|
numeros_a_contacter.append(clean)
|
|
|
|
return nom_client, numeros_a_contacter
|
|
|
|
except Exception as e:
|
|
sys.stderr.write(f"Erreur lecture DB: {e}\n")
|
|
return "Erreur", []
|
|
|
|
def send_alert(client_id, image_url=""):
|
|
"""Envoie le SMS à tous les contacts du client"""
|
|
nom_client, numeros = get_contacts(client_id)
|
|
|
|
if not numeros:
|
|
return False, "Aucun contact trouvé"
|
|
|
|
message_txt = f"ALERTE CHUTE ! {nom_client} est au sol. Voir preuve : {image_url}"
|
|
|
|
# On tronque si trop long (sécurité)
|
|
if len(message_txt) > 160: message_txt = message_txt[:160]
|
|
|
|
logs = []
|
|
for num in numeros:
|
|
try:
|
|
# ENVOI REEL OVH
|
|
result = client.post(f'/sms/{SERVICE_NAME}/jobs',
|
|
message=message_txt,
|
|
sender="UNIGESTFR", # <--- ON AJOUTE TON SENDER ICI
|
|
senderForResponse=False, # <--- ON MET FALSE (Impossible de répondre à un nom)
|
|
receivers=[num],
|
|
noStopClause=True,
|
|
priority="high"
|
|
)
|
|
)
|
|
logs.append(f"OK vers {num}")
|
|
|
|
# --- LOG TO POSTGRES ---
|
|
try:
|
|
conn = psycopg2.connect(**DB_PARAMS)
|
|
cur = conn.cursor()
|
|
cur.execute("""
|
|
INSERT INTO sms_logs (to_number, client_name, message, status, provider_id)
|
|
VALUES (%s, %s, %s, %s, %s)
|
|
""", (num, nom_client, message_txt, "SENT", str(result.get('ids', [''])[0])))
|
|
conn.commit()
|
|
cur.close()
|
|
conn.close()
|
|
except Exception as e:
|
|
logs.append(f"DB ERROR: {e}")
|
|
|
|
except Exception as e:
|
|
logs.append(f"ECHEC vers {num}: {str(e)}")
|
|
# Log failure to DB too
|
|
try:
|
|
conn = psycopg2.connect(**DB_PARAMS)
|
|
cur = conn.cursor()
|
|
cur.execute("""
|
|
INSERT INTO sms_logs (to_number, client_name, message, status)
|
|
VALUES (%s, %s, %s, %s)
|
|
""", (num, nom_client, message_txt, "ERROR"))
|
|
conn.commit()
|
|
cur.close()
|
|
conn.close()
|
|
except: pass
|
|
|
|
return True, ", ".join(logs)
|