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