first commit
commit
c13cc2c6e9
|
|
@ -0,0 +1 @@
|
|||
.env
|
||||
|
|
@ -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"
|
||||
}
|
||||
```
|
||||
|
|
@ -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)
|
||||
|
||||
|
||||
Loading…
Reference in New Issue