es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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!

Tags:  , , ,

Answer

  1. Avatar for 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ón send_sms que debería resolver el problema:

        def send_sms(self, phones, message, translit=0, time="", id=0, format=0, sender=False, query=""):
            formats = ["flash=1", "push=1", "hlr=1", "bin=1", "bin=2", "ping=1", "mms=1", "mail=1", "call=1", "viber=1", "soc=1"]
    
            message_bytes = message.encode('utf-8') # convertir la cadena de texto del mensaje a bytes
    
            m = self._smsc_send_cmd("send", "cost=3&phones=" + quote(phones) + "&mes=" + quote_from_bytes(message_bytes) + \
                        "&translit=" + str(translit) + "&id=" + str(id) + ifs(format > 0, "&" + formats[format-1], "") + \
                        ifs(sender == False, "", "&sender=" + quote(str(sender))) + \
                        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 correctamente. ID: " + m[0] + ", total de SMS: " + m[1] + ", coste: " + m[2] + ", saldo: " + m[3])
                else:
                    print("Error nº" + m[1][1:] + ifs(m[0] > "0", ", ID: " + m[0], ""))
    
            return m
    

    Al codificar la cadena de texto del mensaje a bytes y usar quote_from_bytes en lugar de quote, el mensaje debería ser citado correctamente y enviado al servicio de SMS.

Comments are closed.