From c13cc2c6e92dd0b15cd9b480d54cb49b160e63d3 Mon Sep 17 00:00:00 2001 From: stef Date: Wed, 23 Jul 2025 13:09:08 +0200 Subject: [PATCH] first commit --- .gitignore | 1 + Readme.md | 57 ++++++++++++++++++++++++++ send_sms.py | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 171 insertions(+) create mode 100644 .gitignore create mode 100644 Readme.md create mode 100644 send_sms.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4c49bd7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.env diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..7ac33f3 --- /dev/null +++ b/Readme.md @@ -0,0 +1,57 @@ +# Presentation +Code de test d'envoi de SMS via l'API OVH + +Pour le moment ces un traitment simple ( envoi d'un message sur un numero de téléphone) + +Il reste a traiter les envois par lot soit via lecture d'un fichier, d'une queue ou interrogation d'une autre API. + +# Prerequis (Debian): +``` +apt install pip3 +/usr/bin/pip3 install --break-system-packages ovh +apt install python3-dotenv +``` +- Vous devez avoir creer ou disposer d'une clé d'api sur le site OVH +- Un nom de service sms + +L'ensemble des paramètre sont définis dans un fichier .env ayant le format suivant + +``` +application_key = "xxxxxxxxxxxxx" +application_secret="xxxxxxxxxxxxxxxxxxxxxx" +consumer_key="xxxxxxxxxxxxxxxxxxx" +sms_service_name="sms-xxxxxxx-y" +credit_warning=100 +log_file="sms.log" +LOG_LEVEL="INFO" +``` + +Note: +Modifier le ```LOG_LEVEL``` en DEBUG si besoin de voir plus de details de fonctionnement. + +Idem pour le seuil d'avertissement ```credit_warning``` + +# Fonctionnement +``` +python3 send_sms.py --help +usage: send_sms.py [-h] [-n NUMERO] [-m MESSAGE] + +options: + -h, --help show this help message and exit + -n NUMERO, --numero NUMERO + -m MESSAGE, --message MESSAGE +``` +``` +python3 send_sms.py -n "+33xxxxxxxxx" -m "Message de test." +{ + "totalCreditsRemoved": 1, + "validReceivers": [ + "+33xxxxxxxxx" + ], + "invalidReceivers": [], + "ids": [ + xxxxxxxxx + ], + "tag": "xxxxxxxxxxx" +} +``` \ No newline at end of file diff --git a/send_sms.py b/send_sms.py new file mode 100644 index 0000000..efc43ea --- /dev/null +++ b/send_sms.py @@ -0,0 +1,113 @@ + +import json +import os +from dotenv import load_dotenv +import ovh +import re +import logging +import argparse + +# Vérification de l'existance du fichier .env +# AUCUNES variables ou information d'api ne doit être définies dans le code ! +if not os.path.exists('.env'): + print('Erreur pas de fichier .env présent ou accessible.') + os._exit(os.EX_CONFIG) + +# Load .env file +load_dotenv() + +# Configuration des logs +logging.basicConfig(filename=os.environ['log_file'], encoding='utf-8', level=logging.os.environ['LOG_LEVEL'],format='%(asctime)s %(levelname)s %(message)s', datefmt='%d/%m/%Y %I:%M:%S %p') + +logging.info("Start SMS Script") + +# Return boolean +# True si le service "enabled" et le credit sms est > 0 +# False si le service n'est pas "enabled" ou qu'il n'y a plus de credit sms. +# Parametre: +# - client : instance du client ovh +def check_service_sms(client): + result = client.get("/sms/"+os.environ['sms_service_name']) + if result["creditsLeft"] == 0: + logging.error("Plus de crédit sms") + return False + elif result["creditsLeft"] <= int(os.environ['credit_warning']): + logging.warning("Nombre de crédit sms est inférieur a "+ os.environ['credit_warning']) + elif result["status"] != "enable": + logging.error("Le service sms n'est pas actif!") + return False + logging.info("Nombre de crédit restant: "+str(result["creditsLeft"])) + return True + +# Récuperation des senders définis dans OVH +# Parametre: +# - client : instance du client ovh +def get_senders(client): + result = client.get("/sms/"+os.environ['sms_service_name']+"/senders") + return result + +# Parametres: +# - client : instance du client ovh +# - sender : nom du sender +# - num : Numero de telephone cible +# - message : Message a envoyer +def send_sms(client,sender,num,message): + # Test de la validité du numero + numtelre = re.compile('^\+33\d{9}$') + m = numtelre.match( num ) + if m: + receivers=[] + receivers.append(num) + result = client.post("/sms/"+os.environ['sms_service_name']+"/jobs", + coding = '7bit', # The sms coding (type: sms.CharsetEnum, nullable) + differedPeriod = 0, # The time -in minute(s)- to wait before sending the message (type: long, nullable) + message = message, # The sms message (type: string) + noStopClause = False, # Do not display STOP clause in the message, this requires that this is not an advertising message (type: boolean, nullable) + priority = "high", # The priority of the message (type: sms.PriorityEnum, nullable) + receivers = receivers, # The receivers list (type: string[], nullable) + sender = sender, # The sender (type: string, nullable) + ) + logmes="Message envoyé a "+str(num)+", Crédit consommé: "+str(result["totalCreditsRemoved"]) + logging.info(logmes) + print(json.dumps(result, indent=4)) + else: + logging.error('Mauvais format du numéro de téléphone: '+num+'.') + + +# Instanciation du Client OVH. +client = ovh.Client( + endpoint='ovh-eu', # Endpoint of API OVH (List of available endpoints: https://github.com/ovh/python-ovh#2-configure-your-application) + application_key=os.environ['application_key'], # Application Key + application_secret=os.environ['application_secret'], # Application Secret + consumer_key=os.environ['consumer_key'], # Consumer Key +) + +# Configuration des arguments +parser = argparse.ArgumentParser() +parser.add_argument("-n", "--numero") +parser.add_argument("-m", "--message") + +# Traitement des arguments +args = parser.parse_args() +numero = args.numero +message = args.message + +if check_service_sms(client): + # Recupération des senders OVH + senders=get_senders(client) + # Selection du premier .. voir si cela doit être passé en parametre + sender=senders[0] + # Envoie de message + logging.debug("Demande d'envoi de SMS "+sender+" a "+ numero + " message:" + message) + send_sms(client,sender,numero,message) +else: + # Le service n'est pas utilisable + print("Le service SMS OVH n'est pas utilisable. Voir le fichier de log: "+os.environ['log_file']) + logging.critical("Le service SMS OVH n'est pas utilisable.") + os._exit(os.EX_UNAVAILABLE) + + +logging.info("End SMS Script") +os._exit(os.EX_OK) + +