first commit

main
stef 2025-07-23 13:09:08 +02:00
commit c13cc2c6e9
3 changed files with 171 additions and 0 deletions

1
.gitignore vendored 100644
View File

@ -0,0 +1 @@
.env

57
Readme.md 100644
View File

@ -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"
}
```

113
send_sms.py 100644
View File

@ -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)