# Envío automatizado de SMS (Solucionado)

## Txema

Buenas, pues llevo un tiempo queriendo hacer esto y no lo consigo, ¿alguien sabe como hacer que el servidor pueda mandar un SMS ante ciertas situaciones?

He visto varios programas por portage pero son tan antiguos que ya no funcionan. Lo ideal obviamente sería no depender de internet y enviarlo directamente pero no me compensa ni el precio ni el trabajo, así que lo que busco es poder enviarlos usando algún servicio de internet, el problema es que no los encuentro, había pensado incluso usar facebook o tweeter pero no envían a España ¬¬

Un saludo.Last edited by Txema on Thu Jun 09, 2011 3:59 pm; edited 1 time in total

----------

## opotonil

Tambien me interesa el tema, aunque nunca he llegado a probar.

Quizas te pueda interesar algo de esto:

http://lopezivan.blogspot.com/2007/05/usando-el-api-de-google-calendar.html

http://blog.flink.it/2010/11/free-smses-through-google-calendar-by.html

Esto tiene pinta de ser demasiado viejo:

http://wiki.nagios.org/index.php/SkypeSmsNotification

Si alguna vez llega Google Voice a España:

http://everydayscripting.blogspot.com/2009/07/google-voice-python-sms.html

Salu2.

----------

## pelelademadera

un sms se puede hacer mediante mail.

al menos aca en argentina, en la epoca de ctimovil era:

nºdetelefono@ctimovil.com y te enviaba un sms.

actualmente no lo he chequeado

----------

## Txema

No, el envío mediante mail no funciona, hace años que lo deshabilitaron aquí  :Sad: 

Gracias opotonil, no había encontrado eso, voy a probar a ver si funciona (aunque lleva un día para mandarme el código de confirmación al móvil y todavía nada...)

Un saludo.

----------

## Txema

Parece que ya llegan los mensajes, ahora a usar las APIs

He encontrado este mini script en python, el problema es que no tengo ni idea de como se ejecuta siquiera un programa en python así que no sé qué hace xDD

```
# Requires gdata.py-1.2.1 from http://code.google.com/p/gdata-python-client/

try:

  from xml.etree import ElementTree

except ImportError:

  from elementtree import ElementTree

import gdata.calendar.service

import gdata.service

import atom.service

import gdata.calendar

import atom

import base64

import time

def send_sms(message_text):

    cal_client = gdata.calendar.service.CalendarService()

    cal_client.email = "YOUR GOOGLE MAIL ACCOUNT"

    cal_client.password = "YOUR GOOGLE MAIL PASSWORD"

    cal_client.source = 'calendar-sms-misuse-1.0'

    cal_client.ProgrammaticLogin()

    event = gdata.calendar.CalendarEventEntry()

    event.title = atom.Title(text=message_text)

    event.content = atom.Content(text="")

    # can't set SMS reminders for under 5 minutes, so set this to 6 mins from now

    start_time = time.strftime('%Y-%m-%dT%H:%M:%S.000Z', time.gmtime(time.time()+(6*60)))

    end_time = time.strftime('%Y-%m-%dT%H:%M:%S.000Z', time.gmtime(time.time() + 3600))

    when = gdata.calendar.When(start_time=start_time, end_time=end_time)

    # can't set SMS reminders for under 5 minutes, so set this to 5

    reminder = gdata.calendar.Reminder(minutes=5, extension_attributes={"method":"sms"})

    when.reminder.append(reminder)

    event.when.append(when)

    cal_client.InsertEvent(event, '/calendar/feeds/default/private/full')
```

¿Alguna ayudita?

Un saludo.

----------

## agdg

Para ejecutar un programa python tan solo debes invocar a python: python2 /ruta/programa-python.py. O incluso puedes darle permisos de ejecucción al programa de python e invocarlo directamente: chmod +x python-program.py && ./python-program.py

Respecto a lo que hace el programa, obviamente lo que dice que hace  :Razz:  En cualquier caso, el pequeño trozo que has puesto tan solo importa una serie de módulos de la librería estándar de python así como el módulo de terceros gdata, de ahí que te indique expresamente que gdata es una dependencia. En cualquier caso no es problema, ya que incluso está en portage: /package/dev-python/gdata

A continuación viene la función send_sms(), a la cual se le pasa como parámetro el contenido de la variable message_text, que por el nombre se intuye que debe ser el contenido del mensaje. Y ahí termina el fragmento que pusiste. Obviamente la parte más importante a configurar son los parámetros que te está pidiendo en cal.client.____

Normalmente los script de python incluyen instrucciones de uso; si ejecutas python2 python-program.py -h; seguramente te salga el método de uso.

----------

## Txema

El problema es que ese es todo el código que hay xDD

gdata ya lo había instalado pero no consigo hacerlo funcionar

Con python send_sms.py Prueba se ejecuta y no muestra error, pero no hace lo que debe y con ./send_sms.py Prueba da un montón de errores del tipo:

```
./send_sms.py: línea 3: from: no se encontró la orden
```

Un saludo

----------

## agdg

En ese caso prueba lo siguiente:

Añade al final del script:

```
message_text = input().replace("\n", " ")

send_sms(message_text)
```

Al llamar el script, pasale un fichero de texto que contenga el mensaje a enviar. Si el script se llama script.py y el mensaje esta en el archivo mensaje.text:

```
script.py < mensaje.text
```

OJO: De forma intencionada los retornos de carro se convierten en espacios, ya que no se como se comportará el script si encuentra un retorno de carro. Si quieres eliminar este comportamiento, elimina: .replace("\n", " ")

----------

## opotonil

Para ejecutarse con:

```

./send_sms.py

```

¿No necisitaria una linea al inicio del script indicando el lenguaje? algo similar a "#!/bin/bash" pero para python.

Por descartar intenta ejecutarlo con:

```

python send_sms.py

```

Salu2.

--- EDITADO ---

Perdona, veo que lo anterior ya lo probaste. No me fije bien en tu post.

Sin que tenga ni idea de python el script anterior tiene pinta de definir la funcion "send_sms" pero parece que no la llame en ningun lado, repito de python, realmente, ni idea.

Pero puedes probar a añadir lo siguiente al final del script:

```

if __name__ == '__main__':

     send_sms("Prueba de notificacion")

```

No se si lo de "if __name__ == '__main__':" seria necesario, pero por los scripts de python que he visto es tipico...

O prueba con este otro:

http://www.randomshouting.com/2011/02/06/Free-SMS-notifications-from-Google.html

Segun la fecha es de este año y el codigo parece bastante limpio. En este por lo que entiendo se declara una clase "GoogleSms" con su constructor "__init__" y el metodo "send" y al final del mismo si que se instancia la clase y se llama al metodo "send".Last edited by opotonil on Thu Jun 09, 2011 9:56 am; edited 5 times in total

----------

## agdg

opotonil lleva toda la razón, y puesto que no existe línea shebang, crea-la añadiendo justo al principio del archivo:

#!/usr/bin/env python2

----------

## Txema

Mil gracias a los dos, ya tengo el segundo script funcionando con algunas modificaciones, lo pongo aquí para el que le interese:

```
#!/usr/bin/env python2

import atom

import gdata.calendar

import gdata.calendar.service

import time

import sys

 

TIME_FORMAT = '%Y-%m-%dT%H:%M:%S.000Z'

CALENDAR_URL = 'http://www.google.com/calendar/feeds/default/private/full'

 

class GoogleSms:

    def __init__(self, username, password):

        self.username = username

        self.password = password

 

        service = gdata.calendar.service.CalendarService()

        service.email = username

        service.password = password

        service.source = 'GoogleSms'

        service.ProgrammaticLogin()

 

        self.calendar_service = service

 

    def send(self, title, message):

        # Set time to one hour from now

        event_time = time.strftime(TIME_FORMAT, time.gmtime(time.time()+420))

 

        event = gdata.calendar.CalendarEventEntry()

        event.title = atom.Title(text=title)

        event.content = atom.Content(text=message)

  

        # Send a reminder 60 minutes before the event.

        # Since the event is 60 minutes from now, we will receive the message

        # in a few seconds.

        reminder = gdata.calendar.Reminder(minutes=5)

        reminder.method = 'sms'

 

        when = gdata.calendar.When(event_time)

        when.reminder.append(reminder)

 

        event.when.append(when)

 

        try:

            # Add the entry to calendar

            cal_event = self.calendar_service.InsertEvent(event, CALENDAR_URL)

        except gdata.service.RequestError, request_exception:

            raise

  

if __name__ == '__main__':

    sms = GoogleSms('yourusername@gmail.com', 'yourpassword')

    sms.send(sys.argv[1],sys.argv[2])
```

Lo he modificado para poder ejecutarlo directamente como ./script y además le he añadido dos argumentos para el título y el mensaje.

Un saludo  :Wink: 

----------

## HIHIHI

Me interesa el tema, quisiera que me ayuden a poder recibir sms al llegar un mail de gmail. 

gracias.Last edited by HIHIHI on Mon Nov 14, 2011 9:54 pm; edited 1 time in total

----------

## Txema

¿Qué quieres exactamente?

Este código es simplemente para mandar el sms, si además quieres que lo mande cuando suceda X entonces hay que crear otro script que hará uso de este al final.

Yo hice uno que comprobaba si había correos de cierto remitente y cuando era asi me mandaba un SMS avisándome, este es el código:

```
#!/bin/bash

offlineimap

MAIL=`grep -l Biblioteca .UGR/INBOX/cur/*`

fecha_actual=`date +%d/%m/%y`

if [ "$MAIL" != "" ]

then

        min=8

        for i in $MAIL

        do

                Titulo=`iconv -f iso-8859-1 -t utf-8 /home/server/$i|sed 's/,/\\,/g'|sed 's/=/\\=/g'|sed 's/:/\\:/g'|grep TITLE |sed 's/.*TITLE....//'|sed 's/ /_/g'`

                for UnTitulo in $Titulo

                do

                        if [ "${#UnTitulo}" -gt 30 ]

                        then

                                UnTitulo=`echo "${UnTitulo:0:30}..."`

                        fi

                        Fecha=`iconv -f iso-8859-1 -t utf-8 /home/server/$i|sed 's/,/\\,/g'|sed 's/=/\\=/g'|sed 's/:/\\:/g'|grep -m 1 DUE |sed 's/.*DUE..//'`

                        if [ "${Fecha:6:2}" -eq "${fecha_actual:6:2}" ] && [ "${Fecha:3:2}" -eq "${fecha_actual:3:2}" ] && [ "${Fecha:0:2}" -gt "${fecha_actual:0:2}" ] || [ "${Fecha:3:2}" -gt "${fecha_actual:3:2}" ] || [ "${Fecha:6:2}" -gt "${fecha_actual:6:2}" ]

                        then

                                TituloLimpio=`echo $UnTitulo|sed 's/_/ /g'`

                                /usr/local/bin/EnviarSMS.py " $TituloLimpio antes del $Fecha ||" $min

                                let "min += 30"

                                sleep 130

                                #echo "Ejecutado - $TituloLimpio - $Fecha || ${Fecha:3:2} - ${fecha_actual:3:2} | ${Fecha:0:2} - ${fecha_actual:0:2}"

                        fi

                done

        done

fi
```

Seguro que puede hacerse mejor, pero esto es lo que tengo actualmente funcionando.

Y este es el script para enviar los sms en python modificado:

```
#!/usr/bin/env python2

import atom

import gdata.calendar

import gdata.calendar.service

import time

import sys

 

TIME_FORMAT = '%Y-%m-%dT%H:%M:%S.000Z'

CALENDAR_URL = 'http://www.google.com/calendar/feeds/default/private/full'

 

class GoogleSms:

    def __init__(self, username, password):

        self.username = username

        self.password = password

 

        service = gdata.calendar.service.CalendarService()

        service.email = username

        service.password = password

        service.source = 'GoogleSms'

        service.ProgrammaticLogin()

 

        self.calendar_service = service

 

    def send(self, message, tiempo):

        # Set time to one hour from now

        event_time = time.strftime(TIME_FORMAT, time.gmtime(time.time()+int(int(tiempo)*60)))

 

        event = gdata.calendar.CalendarEventEntry()

        event.title = atom.Title(text=message)

        event.content = atom.Content(text=message)

  

        # Send a reminder 60 minutes before the event.

        # Since the event is 60 minutes from now, we will receive the message

        # in a few seconds.

        reminder = gdata.calendar.Reminder(minutes=5)

        reminder.method = 'sms'

 

        when = gdata.calendar.When(event_time)

        when.reminder.append(reminder)

 

        event.when.append(when)

 

        try:

            # Add the entry to calendar

            cal_event = self.calendar_service.InsertEvent(event, CALENDAR_URL)

        except gdata.service.RequestError, request_exception:

            raise

  

if __name__ == '__main__':

    sms = GoogleSms('TUUSUARIO@gmail.com', 'TUCONTRASEÑA')

    if len(sys.argv) < 3:

        sms.send(sys.argv[1],7)

    else:

        sms.send(sys.argv[1],sys.argv[2])

```

Un saludo

----------

## HIHIHI

La verdad soy un ignorante del tema Python y no quisiera molestarte. 

Pero me interesaria alojar en un hosting (website) con soporte python, dichos comandos/script  para hacer automatico el envio de los nuevos correos para asi recibirlos via sms. 

Por el monento use dicho gadget http://mail2sms.fr.nf/help.php que me funciono bastante bien, pero me empezo a fallar.

Me gustaria poder realizar lo que tu hiciste.

Saludos, y gracias.

----------

## Txema

 *Quote:*   

> tengo un servidor que soporta python, pero la verdad no tengo idea de como se usa.
> 
> Probe con PHP y no me funcionaron. ahora me encuentro que a usted le funciona pero eso si, con python.

 

Yo no domino nada del tema de python como podrás ver en los mensajes de arriba  :Wink:  lo único que hice fue copiar el script, ponerle el nombre (EnviarSMS.py) y hacerlo ejecutable. A ese respecto no hice nada más con python, y de PHP ya sí que no he tocado nada xD

 *Quote:*   

> El primer Script (el cual no se como llamarlo ni punto cuanto es) verifica si hay un correo, es cierto?

 

El primer Script que he puesto es simplemente un script en BASH que yo he llamado AvisoBiblioteca.sh y he hecho ejecutable. Comprueba si hay correo proveniente de la biblioteca, luego extrae el título del libro así como las fechas de entrega, hace algunos cálculos y si la fecha de entrega es mayor que la fecha actual entonces manda el SMS

 *Quote:*   

> El segundo el llamado EnviarSMS.py envia si encuentra un o el correo deseado. es asi el tema?

 

El segundo script, EnviarSMS.py, envía un SMS (sin comprobar nada, eso lo hace el primer script). Este sólo envía un SMS con dos opciones:

· un sólo argumento que corresponde al contenido del mensaje: EnviarSMS.py "CONTENIDO"

· Dos argumentos siendo el primero el contenido y el segundo el lapso de tiempo para colocar la alarma en google calendar(número en minutos, ej: 7): EnviarSMS.py "CONTENIDO" TIEMPO

Si usas el primer método lo pone a los 7 minutos, esto lo calculé a ojo y el segundo método lo puse porque me di cuenta de que a veces si pones muy juntas dos alarmas solo te envía el SMS de una de ellas.

----------

## HIHIHI

De nuevo gracias, Txema.

Me sentare a estudiar un poco mas.

Mas didactico imposible Txema, se agradece mucho.

Te aseguro habra mas preguntas. 

Saludos-

----------

