¿Cómo puedo enviar un mensaje de texto (SMS) en Django?
Me encontré con un problema al intentar enviar mensajes de texto utilizando el servicio SMSC en un proyecto Django.
Mi tarea de Celery para enviar correos electrónicos y mensajes de texto:
def orden_creada_detalle(id_orden):
# Tarea para enviar un correo electrónico cuando se crea una orden exitosamente
orden = OrderRetail.objects.get(id=id_orden)
subject = 'Orden №{}.format(orden.id)'
mensaje_correo = '¡Hola, {}! Has realizado exitosamente una orden {}. El gerente se pondrá en contacto contigo en breve.'.format(orden.primer_nombre, orden.id)
mensaje_sms = '¡Tu orden №{} ha sido aceptada! Espera la llamada del operador.'
correo_enviado = send_mail(
subject,
mensaje_correo,
'correo@correo.com',
[orden.email]
)
smsc = SMSC()
sms_enviado = smsc.send_sms(
[orden.telefono],
str(mensaje_sms)
)
return correo_enviado, sms_enviado
El envío de correos electrónicos funciona correctamente, pero para el mensaje de texto obtengo el siguiente error:
La tarea orders.tasks.orden_creada_detalle[f05458b1-65e8-493b-9069-fbaa55083e7a] generó un error inesperado: TypeError(‘quote_from_bytes() esperaba bytes’)
La función de la biblioteca SMSC:
def enviar_sms(self, telefonos, mensaje, translit=0, time="", id_=0, formato=0, remitente=False, query=""):
formatos = ["flash=1", "push=1", "hlr=1", "bin=1", "bin=2", "ping=1", "mms=1", "mail=1", "call=1", "viber=1", "soc=1"]
m = self._smsc_send_cmd("send", "cost=3&phones=" + quote(telefonos) + "&mes=" + quote(mensaje) + \
"&translit=" + str(translit) + "&id=" + str(id_) + ifs(formato > 0, "&" + formatos[formato-1], "") + \
ifs(remitente == False, "", "&sender=" + quote(str(remitente))) + \
ifs(time, "&time=" + quote(time), "") + ifs(query, "&" + query, ""))
# (id, cnt, cost, balance) o (id, -error)
if SMSC_DEBUG:
if m[1] > "0":
print("Mensaje enviado exitosamente. ID: " + m[0] + ", total de SMS: " + m[1] + ", costo: " + m[2] + ", saldo: " + m[3])
else:
print("Error №" + m[1][1:] + ifs(m[0] > "0", "", "ID: " + m[0], ""))
return m
¿Qué estoy haciendo mal?
¡Gracias!
davy.ai
Parece que la función de la biblioteca SMSC
quote
espera bytes como entrada, pero está recibiendo una cadena de texto. El mensaje de error “quote_from_bytes() expected bytes” sugiere que la entrada se está tratando como una cadena de texto, lo cual es incorrecto.Para resolver este problema, podemos convertir la cadena de texto del mensaje a bytes antes de pasarlo a la función
quote
. Aquí tienes una versión actualizada de la funciónsend_sms
que debería resolver el problema:Al codificar la cadena de texto del mensaje a bytes y usar
quote_from_bytes
en lugar dequote
, el mensaje debería ser citado correctamente y enviado al servicio de SMS.