Commit 420ef37f by Luciano Barletta

Version 0.6 - SMS added

1 parent 8095ea7e
# Multimensajería # Multimensajería
#### version 0.56 #### version 0.6
Este repositorio es un servicio web de Flask en Python3 cuyo propósito es mandar mensajes de todo tipo de formatos a todo tipo de plataformas que tengan una API para ese propósito. Este repositorio es un servicio web de Flask en Python3 cuyo propósito es mandar mensajes de todo tipo de formatos a todo tipo de plataformas que tengan una API para ese propósito.
Implementa una base de datos de mensajes a enviar, usa la MAC address del host que pide mandar mensajes para diferenciar las consultas y permitir la posibilidad de que el mensaje venga encriptado. Implementa una base de datos de mensajes a enviar, usa la MAC address del host que pide mandar mensajes para diferenciar las consultas y permitir la posibilidad de que el mensaje venga encriptado.
...@@ -69,6 +69,8 @@ WhatsApp 1 - ['wpp1'](/Wpp1.md) ...@@ -69,6 +69,8 @@ WhatsApp 1 - ['wpp1'](/Wpp1.md)
Mail - ['mail'](/Mail.md) Mail - ['mail'](/Mail.md)
SMS - ['sms'](/SMS.md)
Los tipos que aceptan y la forma de usarlos se encuentran en los links. Los tipos que aceptan y la forma de usarlos se encuentran en los links.
...@@ -147,5 +149,4 @@ Para testear se debe tener una carpeta llamada 'testfolder' donde poder tirar lo ...@@ -147,5 +149,4 @@ Para testear se debe tener una carpeta llamada 'testfolder' donde poder tirar lo
## Mejoras no implementadas ## Mejoras no implementadas
1. Añadir estado "partially delivered" para mensajes enviados a medias. 1. Posibilidad de usar un emisor de mensajes diferente. (hecho parcialmente)
2. Posibilidad de usar un emisor de mensajes diferente. (hecho parcialmente)
# Servicio SMS
## Tipos
- texto: 'text'
## Parámetros
Este servicio no acepta ningún parámetro
## Notas
El número de teléfono para este servicio es regional sin símbolos ni espacios
\ No newline at end of file \ No newline at end of file
...@@ -2,10 +2,10 @@ ...@@ -2,10 +2,10 @@
## Tipos ## Tipos
texto - 'text' - texto: 'text'
imagenes - 'image' - imagenes: 'image'
todo tipo de archivos - 'document' - todo tipo de archivos: 'document'
links - 'link' - links: 'link'
Los últimos 3 funcionan de la misma manera, link se usa para cualquier link y los otros dos para su tipo respectivo Los últimos 3 funcionan de la misma manera, link se usa para cualquier link y los otros dos para su tipo respectivo
...@@ -13,4 +13,8 @@ Los últimos 3 funcionan de la misma manera, link se usa para cualquier link y l ...@@ -13,4 +13,8 @@ Los últimos 3 funcionan de la misma manera, link se usa para cualquier link y l
- 'origen': especifíca el origen - 'origen': especifíca el origen
Este servicio acepta no tomar parámetros
\ No newline at end of file \ No newline at end of file
Este servicio acepta no tomar parámetros
## Notas
El número de este servicio se pone en formato internacional sin símbolos ni espacios
\ No newline at end of file \ No newline at end of file
...@@ -25,6 +25,7 @@ class States: ...@@ -25,6 +25,7 @@ class States:
class Services: class Services:
wpp1 = "wpp1" wpp1 = "wpp1"
mail = "mail" mail = "mail"
sms = "sms"
@staticmethod @staticmethod
def validate(serv): def validate(serv):
......
...@@ -141,9 +141,40 @@ class Mail(ServiceBase): ...@@ -141,9 +141,40 @@ class Mail(ServiceBase):
return False return False
return True return True
class SMS(ServiceBase):
Allowed = [Datatypes.text]
URL = "http://192.168.15.120:8080/v1/sms/send/"
def send(self,data):
types = json.loads(data[Table.type])
success = {}
for file in types:
with open(data[Table.path] + file) as m:
text = m.read()
if type(text) == bytes:
text = text.decode("utf-8")
response = requests.get(url = SMS.URL, params = {
"phone" : data[Table.dest],
"message" : text
})
success[file] = True if response.text == "OK" else False
return success
def validatetype(self,type):
return type in SMS.Allowed
def validateinfo(self,info):
if info == None:
return True
return False
def serviceFactory(serv): def serviceFactory(serv):
if serv == Services.wpp1: if serv == Services.wpp1:
return Wpp1() return Wpp1()
if serv == Services.mail: if serv == Services.mail:
return Mail() return Mail()
if serv == Services.sms:
return SMS()
return None return None
import os, time, requests, json, threading import os, time, requests, json, threading
from database import DBconnection from database import DBconnection
URL = "http://192.168.15.21:5000/" URL = "http://192.168.15.119:5000/"
TESTPHONE = "5493415959169" TESTPHONE = "5493415959169"
TESTREGIONPHONE = "3415959169"
TESTMAIL = "sujetodeprueba0110@gmail.com" TESTMAIL = "sujetodeprueba0110@gmail.com"
FOLDER = "testfolder/" FOLDER = "testfolder/"
SENDING_TIME = 60 # aumentar a medida que se vuelva necesario SENDING_TIME = 60 # aumentar a medida que se vuelva necesario
...@@ -10,10 +11,10 @@ START_TIME = 10 # cambiar dependiendo de la velocidad de la máquina ...@@ -10,10 +11,10 @@ START_TIME = 10 # cambiar dependiendo de la velocidad de la máquina
def wpp1(phone): def wpp1(phone):
id = requests.post(url = URL + "data", files = { id = requests.post(url = URL + "data", files = {
'wpmsg' : open(FOLDER + "wptext","rb"), 'wpmsg' : open(FOLDER + "text","rb"),
'wpimage' : open(FOLDER + "wpimage","rb"), 'wpimage' : open(FOLDER + "image","rb"),
'wpmedia' : open(FOLDER + "wpmedia","rb"), 'wpmedia' : open(FOLDER + "image","rb"),
'wplink' : open(FOLDER + "wplink","rb") 'wplink' : open(FOLDER + "image","rb")
}) })
assert int(id.text) > 0 , id.text + "no es mayor a 0" assert int(id.text) > 0 , id.text + "no es mayor a 0"
state = requests.post(url = URL + "msg", params = { state = requests.post(url = URL + "msg", params = {
...@@ -37,9 +38,9 @@ def wpp1(phone): ...@@ -37,9 +38,9 @@ def wpp1(phone):
def mail(mail): def mail(mail):
id = requests.post(url = URL + "data", files = { id = requests.post(url = URL + "data", files = {
'mailmsg' : open(FOLDER + "mailtext","rb"), 'mailmsg' : open(FOLDER + "text","rb"),
'mailimage' : open(FOLDER + "mailimage","rb"), 'mailimage' : open(FOLDER + "image","rb"),
'maildocument' : open(FOLDER + "maildocument","rb") 'maildocument' : open(FOLDER + "document","rb")
}) })
assert int(id.text) > 0 , id.text + "no es mayor a 0" assert int(id.text) > 0 , id.text + "no es mayor a 0"
state = requests.post(url = URL + "msg", params = { state = requests.post(url = URL + "msg", params = {
...@@ -69,13 +70,13 @@ def encryption(phone): ...@@ -69,13 +70,13 @@ def encryption(phone):
f.write(key.text) f.write(key.text)
f.close() f.close()
os.system("openssl rand -base64 32 > " + FOLDER + "rand.key") os.system("openssl rand -base64 32 > " + FOLDER + "rand.key")
os.system("openssl enc -aes-256-cbc -salt -in " + FOLDER + "plaintext" " -out " + FOLDER + "plaintext.enc -pass file:" + FOLDER + "rand.key") os.system("openssl enc -aes-256-cbc -salt -in " + FOLDER + "text" " -out " + FOLDER + "text.enc -pass file:" + FOLDER + "rand.key")
os.system("openssl enc -aes-256-cbc -salt -in " + FOLDER + "plainimage" " -out " + FOLDER + "plainimage.enc -pass file:" + FOLDER + "rand.key") os.system("openssl enc -aes-256-cbc -salt -in " + FOLDER + "image" " -out " + FOLDER + "image.enc -pass file:" + FOLDER + "rand.key")
os.system("openssl rsautl -encrypt -inkey " + FOLDER + "server_rsa_key.pub -pubin -in " + FOLDER + "rand.key -out " + FOLDER + "rand.key.enc") os.system("openssl rsautl -encrypt -inkey " + FOLDER + "server_rsa_key.pub -pubin -in " + FOLDER + "rand.key -out " + FOLDER + "rand.key.enc")
id = requests.post(url = URL + "data", files = { id = requests.post(url = URL + "data", files = {
'plaintext' : open(FOLDER + "plaintext.enc","rb"), 'plaintext' : open(FOLDER + "text.enc","rb"),
'plainimage' : open(FOLDER + "plainimage.enc","rb"), 'plainimage' : open(FOLDER + "image.enc","rb"),
'key' : open(FOLDER + "rand.key.enc","rb") 'key' : open(FOLDER + "rand.key.enc","rb")
}) })
assert int(id.text) > 0 , id.text + "no es mayor a 0" assert int(id.text) > 0 , id.text + "no es mayor a 0"
...@@ -107,7 +108,7 @@ def errors(phone): ...@@ -107,7 +108,7 @@ def errors(phone):
assert error.text == "El id - no existe" assert error.text == "El id - no existe"
# servicio no valido # servicio no valido
id = requests.post(url = URL + "data", files = { id = requests.post(url = URL + "data", files = {
"errortext" : open(FOLDER + "errortext","rb") "errortext" : open(FOLDER + "text","rb")
}) })
error = requests.post(url = URL + "msg", params = { error = requests.post(url = URL + "msg", params = {
'id' : id.text, 'id' : id.text,
...@@ -152,7 +153,7 @@ def errors(phone): ...@@ -152,7 +153,7 @@ def errors(phone):
def noconf(phone): def noconf(phone):
id = requests.post(url = URL + "data", files = { id = requests.post(url = URL + "data", files = {
'wpmsg' : open(FOLDER + "wptext","rb") 'wpmsg' : open(FOLDER + "text","rb")
}) })
assert int(id.text) > 0 , id.text + "no es mayor a 0" assert int(id.text) > 0 , id.text + "no es mayor a 0"
state = requests.post(url = URL + "msg", params = { state = requests.post(url = URL + "msg", params = {
...@@ -169,7 +170,29 @@ def noconf(phone): ...@@ -169,7 +170,29 @@ def noconf(phone):
'id' : id.text 'id' : id.text
}) })
assert (error.text == "El id " + id.text + " no existe") , "'" + error.text + "' no es igual a 'El id " + id.text + " no existe'" assert (error.text == "El id " + id.text + " no existe") , "'" + error.text + "' no es igual a 'El id " + id.text + " no existe'"
def sms(phone):
id = requests.post(url = URL + "data", files = {
'smsmsg1' : open(FOLDER + "text","rb"),
'smsmsg2' : open(FOLDER + "text","rb")
})
assert int(id.text) > 0 , id.text + "no es mayor a 0"
state = requests.post(url = URL + "msg", params = {
'id' : id.text,
'serv' : "sms",
'dest' : phone,
'type' : json.dumps({
'smsmsg1' : 'text',
'smsmsg2' : 'text'
}),
'conf' : 'true'
})
time.sleep(SENDING_TIME)
state = requests.post(url = URL + "cons", params = {
'id' : id.text
})
assert (state.text == "delivered") , "'" + state.text + "' no es igual a 'delivered'"
def main(): def main():
try: try:
...@@ -182,6 +205,7 @@ def main(): ...@@ -182,6 +205,7 @@ def main():
threads.append(threading.Thread(target = mail, args = (TESTMAIL,))) threads.append(threading.Thread(target = mail, args = (TESTMAIL,)))
threads.append(threading.Thread(target = errors, args = (TESTPHONE,))) threads.append(threading.Thread(target = errors, args = (TESTPHONE,)))
threads.append(threading.Thread(target = noconf, args = (TESTPHONE,))) threads.append(threading.Thread(target = noconf, args = (TESTPHONE,)))
threads.append(threading.Thread(target = sms, args = (TESTREGIONPHONE,)))
for thread in threads: for thread in threads:
thread.start() thread.start()
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!