domingo, 20 de mayo de 2007

Usando el API de Google Calendar: Alarmas por SMS

   Hace un tiempo descubrí Google Calendar, y aunque no lo utilizo mucho tiene una característica que me llamó la atención desde el principio. Una vez que defines una cita o evento, puedes asociarle un recordatorio para que te avise por email o con un pop-up si tienes la web abierta; hasta aquí ninguna novedad. Lo realmente novedoso es que también permite avisarte por medio de un SMS al móvil y además, en el caso de España es gratis. Sólo hay que asociar a nuestra cuenta de google nuestro número de teléfono móvil y después de una verificación de identidad podemos añadir el aviso por sms como recordatorio de las citas.

   Teniendo esto en mente pensé que sería realmente útil poder enviar alarmas al móvil con el estado de los servidores de casa. Así, si normalmente tenemos alguna tarea programada en crontab que nos avisa por email cuando termina mal, algún monitor de los servicios, espacio en los filesystems,... podríamos añadir una llamada a un programa adicional que introdujese un evento en nuestro calendario de google para que nos llegara el aviso por medio de un sms al móvil y así estar informados en todo momento del estado de nuestras máquinas :-).

   Pues dicho y hecho, me puse a buscar y lo que encontré no pudo ser mejor. Google proporciona un acceso completo a su API, con ejemplos, foros, y además disponible desde varios lenguajes de programación (Java, .Net, PHP y Python). De todos estos, el que más conozco y con el que más he trabajado (aunque ya haga tiempo que no lo toco demasiado) es Java. Además, tiene la ventaja de que al ser multiplataforma podría monitorizar también máquinas windows.

   Me instalé Eclipse y la máquina virtual de Sun 1.5 (ojo que esto es importante, no funciona con la 1.4.2) por medio de un simple apt-get. De la web de google descargué las librerías cliente para java y me puse a probar alguno de los ejemplos. La verdad es que el código es muy sencillo y está muy bien explicado. Hay ejemplos de autenticación, consulta de los eventos del calendario entre determinadas fechas, alta de eventos, borrado, actualización...

   Después de realizar un par de pruebas tenía un esqueleto que funcionaba aunque había que afinar. Examinando con más detalle las clases con Eclipse y con unas pocas pruebas posteriores terminé la versión 0.1 que permite insertar un evento en nuestro calendario y recibir un aviso por sms en 1 minuto. Aspectos a tener en cuenta del código:
  • Para conseguir que llegue el aviso dentro de un minuto lo que hago es poner la hora de comienzo del evento dentro de 6 minutos y la notificación por sms 5 minutos antes. Aunque por código es posible fijar el recordatorio dentro de 1 minuto, luego, cuando se envía la petición se nos muestra un error diciendo que no es válida.
  • Parece que la clase DateTime de Google no se lleva muy bien con la clase Date. Al principio creé un objeto con la hora actual para asignarselo al comienzo del evento, pero una vez asignado, la fecha que ponía era de dos horas antes!. Lo resolví creando un TimeZone para "Europe/Madrid" y utilizándolo en la creación de dicho objeto. Luego hablando con un compañero y comentándole esas 2 horas de diferencia (yo pensé que debería ser sólo una por eso de que estamos en zona GMT+1), me dijo que, con el cambio a horario de verano hemos pasado "automáticamente" a GMT+2. En fin, misterio aclarado. Gracias Jose!.
  • El programa recibe como parámetros el usuario, el password y el texto que queremos enviar. Aunque a priori no hay limitación en la longitud del texto, al móvil sólo nos llegarán los primeros 57 caracteres.
  • Después de construir la petición y enviarla, por la consola aparece un error. Según he investigado parece como si la versión que utilizo de las librerías de google fuera antigua, aunque realmente estoy trabajando con la última. En principio no afecta al funcionamiento, aunque queda un poco "feo".
  • Adicionalmente, es necesario descargar las librerías mail.jar del API JavaMail y activation.jar del Framework de Sun JavaBeansActivation.

  •    Y ya, sin más divagaciones, el código:
    /*
    * Programa para el envío de alarmas por SMS al móvil por medio del API Google Calendar
    *
    * Iván López Martín
    * http://lopezivan.blogspot.com
    *
    */

    import java.net.URL;
    import java.util.Calendar;
    import java.util.GregorianCalendar;
    import java.util.TimeZone;

    import com.google.gdata.client.calendar.CalendarService;
    import com.google.gdata.data.DateTime;
    import com.google.gdata.data.Person;
    import com.google.gdata.data.PlainTextConstruct;
    import com.google.gdata.data.extensions.EventEntry;
    import com.google.gdata.data.extensions.Reminder;
    import com.google.gdata.data.extensions.When;


    public class EnviaSMS {

    public static void main(String[] args) {

    // Comprobamos los argumentos necesarios: usuario, password y texto del mensaje
    if (args.length < 3) {
    System.err.println("Uso: EnviaSMS <usuario> <password> <texto>");
    return;
    }

    String userName = args[0];
    String userPassword = args[1];
    String sms = "";
    // El máximo son 57 caracteres
    for(int i=2; i<args.length; i++) {
    sms = sms + args[i] + " ";
    }
    sms = sms.trim();

    try {
    URL feedUrl = new URL("http://www.google.com/calendar/feeds/" + userName + "/private/full");

    CalendarService myService = new CalendarService("EnviaSMS");

    // Nos autenticamos en google Calendar
    myService.setUserCredentials(userName, userPassword);

    // Creamos el evento
    EventEntry myEntry = new EventEntry();
    myEntry.setTitle(new PlainTextConstruct(sms));

    Person author = new Person(userName, null, userName);
    myEntry.getAuthors().add(author);

    // Definimos la zona horaria
    TimeZone tz = TimeZone.getTimeZone("Europe/Madrid");

    Calendar cal = GregorianCalendar.getInstance();
    cal.add(Calendar.MINUTE, 6);
    DateTime startTime = new DateTime(cal.getTime(), tz); //6m

    cal.add(Calendar.MINUTE, 1);
    DateTime endTime = new DateTime(cal.getTime(), tz); //7m

    // Definimos la hora de comienzo y de fin del evento
    When eventTimes = new When();
    eventTimes.setStartTime(startTime);
    eventTimes.setEndTime(endTime);
    myEntry.addTime(eventTimes);

    // Añadimos el recordatorio sólo como SMS y que avise 5 minutos antes
    Reminder reminder = new Reminder();
    reminder.setMinutes(new Integer(5));
    reminder.setMethod(Reminder.Method.SMS);
    myEntry.getReminder().add(reminder);

    // Enviamos la petición para insertar el evento en el calendario
    EventEntry insertedEntry = (EventEntry)myService.insert(feedUrl, myEntry);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }

       Para la ejecución desde la línea de comandos, he creado un pequeño script:
    ivan@doraemon:~$ cat enviaSMS.sh 
    #!/bin/sh
    #################################
    # Iván López Martín #
    # http://lopezivan.blogspot.com #
    #################################
    SMS_HOME=/home/ivan/workspace/GoogleCalendar

    CLASSPATH=$SMS_HOME/lib/activation.jar:$SMS_HOME/lib/gdata-calendar-1.0.jar:$SMS_HOME/lib/gdata-client-1.0.jar:$SMS_HOME/lib/mail.jar:$SMS_HOME/bin

    java -classpath $CLASSPATH EnviaSMS $@

    ivan@doraemon:~$ ./enviaSMS.sh usuario@gmail.com password "Visita el blog de Iván López. http://lopezivan.blogspot.com"

       En nuestro calendario de google aparece el nuevo evento con las opciones que hemos indicado:

       Y un minuto después, en el móvil el sms:


       Como ya he dicho, se trata de la versión 0.1, aunque me parece que no la voy a modificar mucho más porque lo único que necesito es el envío de los sms. No voy a borrar los eventos del calendario, ni actulizarlos, ni consultarlos desde el programa,...

       Cualquiera es libre de modificar el código, usarlo y mejorarlo siempre que por favor respete el comentario del autor y el enlace a este blog. Además, si lo mejoras por favor házmelo saber para poder actulizar este artículo.

       Que lo disfrutéis...

    71 comentarios:

    Super Coco dijo...

    Me ha parecido muy interesante y de verdad muy, muy útil.

    Cuando he leído la entrada he pensado : Esto debería de salir en Menéame. He ido y he visto que ya estaba enviado pero que algunos votos negativos lo habían bloqueado. Una auténtica lástima, porque es una idea buena de verdad.

    De todas formas, si se popularizara seguro que pronto lo quitaban, no sé qué será mejor ;-)

    Iván dijo...

    Gracias, me alegro de que te guste y te resulte útil. En un próximo artículo pondré el uso que le estoy dando para la monitorización del servidor.
    A parte de enviarlo a Meneame, también lo envié a Barrapunto, pero parece ser que no terminó de cuajar. Yo también pienso que es muy útil (no porque lo haya hecho yo), porque puedes saber en cualquier momento cómo están tus servidores. En fin, como dicen por ahí "Barrapunto ya no es lo que era" ;-).

    Saludos, Iván.

    José A. (Pepe) dijo...

    Genial, muy bueno, gracias...

    Iván dijo...

    Gracias Pepe, muy escueto pero muy explicativo!. Me alegro de que te guste y de que te sea útil.

    Saludos, Iván.

    Jose Antonio dijo...

    Genial Ivan!!!! simplemente genial!!!

    belay dijo...

    Fenomenal, isto é increible ;-D

    Iván dijo...

    Jose Antonio y Belay, muchas gracias a los dos!. Me alegro de que os haya gustado y de que os pueda resultar útil.

    Saludos, Iván.

    Errante dijo...

    Con tu permiso, me he tomado la libertad de pasarlo a php para poder usarlo desde mas sitios.

    http://elias.badenes.es/2007/07/04/alarmas-sms-gracias-a-google

    Saludos y gracias

    Iván dijo...

    Hola Errante,

    no hay ningún problema. Puse el código para que cualquiera pudiera usarlo y modificarlo a su gusto. Además pedí por favor que se respetaran los créditos y tu lo has hecho. Muchas gracias.

    Saludos, Iván.

    angel miguel dijo...

    me ha parecido muy interesante, me gustaria saber en que version del eclipse y que plugins instalaste para que te funcione estas librerias, si es posible me ayudes como configurar la plataforma de desarrollo java eclipse google, espero que me puedas ayudar porque soy nuevo en esto y trato de implementar un calendario en mi aplicacion pero tengo problemas con lineas de codigo como estas

    import com.google.gdata.client.*;
    import com.google.gdata.client.calendar.*;
    import com.google.gdata.data.*;
    import com.google.gdata.data.acl.*;
    import com.google.gdata.data.calendar.*;
    import com.google.gdata.data.extensions.*;
    import com.google.gdata.util.ServiceException;

    espero me ayudes para poder acabar de implementar mi aplicacion.
    Att: Angel Macas
    mail
    ammacas1@hotmail.com
    ammacas1@yahoo.es

    Iván dijo...

    Hola Angel Miguel,

    te respondo por partes:
    * Versión de Eclipse: Version: 3.2.2
    Build id: M20070212-1330 (Ubuntu version: 3.2.2-0ubuntu3). Como digo en el artículo la instalé con apt-get
    * Plugins: Ninguno adicional.
    * Para que te funcionen las librerías lo único que tienes que hacer es descargarlas y desde eclipse añadirlas al proyecto. Para hacerlo:
    Botón derecho en el proyecto -> Properties. Opción Java Build Path, solapa Libraries y ahí añades las librerías. Yo tengo añadidas: activation.jar, gdata-calendar-1.0.jar, gdata-client-1.0.jar y mail.jar. Con esas 4 librerías ya no deberías tener ningún problema ni de compilación ni en los imports.

    Espero que con esta explicación sea suficiente. Si necesitas algo más no dudes en preguntar.

    Saludos, Iván.

    pedro dijo...

    Muy buenas

    He seguido el articulo y me ha dado problemas a la hora de la compilacion en dos metodos que no se encuentran implementados en las clases.

    Las Lineas son estas:

    reminder.setMethod(Reminder.Method.SMS);
    myEntry.getReminder().add(reminder);

    No reconoce ninguna de las dos

    Gracias

    Iván dijo...

    Hola Pedro,

    el método setMethod está implementado en la clase com.google.gdata.data.extensions.Reminder y el método getReminder está implementado en la clase com.google.gdata.data.extensions.BaseEventEntry. Ambas clases se encuentran en la librería gdata-client-1.0.jar que como has visto en el post debes añadir a tu proyecto.

    Espero que con esto soluciones tu problema.

    Saludos, Iván.

    Pedro dijo...

    Hola Ivan.

    La libreria gdata-client-1.0.jar ya se encuantra incluida en el proyecto y me sigue diciendo lo mismo. No se si será que necesita una mas moderna o hay algo que hacer en l workspace o en el proyect adicional. La liberia la baje de la web de google.

    Saludos

    Iván dijo...

    Hola de nuevo Pedro,

    debes estar haciendo algo mal porque acabo de probar con la última versión de las librerías de google y compila sin problemas. Además, sin esa librería tendrías muchos más errores de compilación. Has añadido el resto de librerías: activation.jar, gdata-calendar-1.0.jar y mail.jar?

    En la configuración del proyecto y del workspace del eclipse no he hecho nada adicional que no sea incluir las librerías y utilizar la versión 1.5 del jdk.

    Saludos, Iván.

    pedro dijo...

    Hola Ivan ...

    Esas tres librerias si que estan incluidas, y de igual manera estoy usando la version 1.5 de java ...

    No se me ocurre que puede fallar ...

    Me puedes indicar el link de donde la bajaste?

    Gracias

    Iván dijo...

    Siento no poder ayudarte más, los links de los que descargué todas las librerías están en el post original. Ahí puedes encontrarlos todos, tanto las de google como las 2 adicionales de la páginas de Sun.

    Saludos, Iván.

    pedro dijo...

    Tambien tengo cargado el gdata-client-1.0.jar. Ese tb es necesario, no?

    Gracias.

    Iván dijo...

    Sí, esa librería también es necesaria.

    Saludos, Iván.

    pedro dijo...

    OKS, ya he conseguido solucionar eso ...

    Ahora tengo oro problema ... jejejejeje

    cuando intento ejecutarlo con el script, me dice esto:

    Exception in thread "main"
    java.lang.NoClassDefFoundError: java

    Alguna idea?

    Gracias

    Iván dijo...

    Hola Pedro,

    según el script que puse tienes que definir el path correcto en la variable SMS_HOME y dentro de ese path tiene que existir el directorio lib con los .jar y el bin con el .class. Comprueba que tengas todo bien definido.

    Saludos, Iván.

    bytecoders dijo...

    Lo primero: gracias por el script.
    Me he permitido el lujo de acoplar el código para un sistema de aviso por SMS de nuevo voicemail en Asterisk.

    http://bytecoders.homelinux.com/content/aviso-por-sms-de-nuevo-voicemail.html

    Buen trabajo :)
    Bytecoders

    Iván dijo...

    Hola Bytecoders,

    me alegro de que le hayas dado una utilidad al aviso por SMS. Gracias por compartirlo.

    Saludos, Iván.

    miguelico dijo...

    muy bueno lo de los sms ivan

    solo tengo una pregunta. Si usas varios moviles, por ejemplo uno poersonal y otro de empresa? es posible que la nota llegue a varios moviles?

    espero tu respuesta

    miguel

    Iván dijo...

    Hola Miguelico,

    me alegro de que te haya gustado. Respecto a tu pregunta, la única opción que se me ocurre es que asocies el teléfono de tu empresa a una cuenta que te crees de gmail y utilices mi programa para enviar el mismo aviso 2 veces, cada una con un usuario y password distinto.
    Habría que ver si añadiendo el evento a varias personas a la vez llega a los dos.

    Saludos, Iván.

    Anónimo dijo...

    Sin embargo en la página:

    http://www.google.com/support/calendar/bin/answer.py?answer=37025&query=sms&topic=&type=

    dice que NO ES GRATUITO.
    Léase lo siguiente:

    ¿Es gratuito?
    Sí, Google Calendar es un servicio gratuito. Sin embargo, si decides recibir notificaciones tales como recordatorios de eventos mediante SMS, es posible que se apliquen las tarifas estándar de tu operador móvil por la recepción de mensajes de texto. Tu operador también puede cobrarte por los mensajes SMS salientes. Si tienes alguna pregunta acerca de la tarifa, por favor, ponte en contacto con tu operador para obtener más información.

    Iván dijo...

    Hola Anónimo,

    lo que dice el enlace es que es gratuito porque Google no cobra nada. Lo que sí dice es que puede que tu operador móvil te cobre por recibir sms, pero esto último no ocurre en España (creo que en USA sí).

    Saludos, Iván.

    David Gonzalez dijo...

    Hola
    Felicidades por tu codigo, aunque yo tambien e encotrado problemas con las librerias, para solucionarlo yo tambien añadi el gdata-core-1.0.jar y se soluciono ;)

    Iván dijo...

    Hola David González,

    muchas grcias por las felicitaciones y por tu comentario.

    Saludos, Iván.

    Feliun dijo...

    Hola,

    Ante todo,muchas gracias por el código, es realmente útil. Pero tengo una duda: ¿se puede configurar tu telefono movil programaticamente de alguna forma, o hay que hacerlo "a mano"?Porque, en el caso de que quieras añadir usuarios (por XML, por ejemplo), lo deseable es que ellos simplemente te dieran su telefono movil, y tu internamente gestionaras todo. Es esto posible?
    Muchas gracias!!

    Iván dijo...

    Hola Feliun,

    no estoy seguro de haber comprendido lo que quieres hacer.
    Al principio parace que me preguntas que si puedes desarrollar algún tipo de software para tu móvil. Sin embargo, más adelante lo que parezco deducir es que quieres enviar la notificación por SMS a varios usuarios.
    En este segundo caso, creo que sí se podría hacer aunque habría que modificar el programa. A la hora de crear el evento para insertarlo en el calendario, tendrías que añadir como participantes a todas las personas a las que quieres enviar el SMS. Éstas a su vez deberían configurar su cuenta de Google Calendar para recibir SMS como aviso de eventos.

    Si no es esto lo que preguntabas, por favor aclarámelo y te intento responder.

    Saludos, Iván.

    feliun dijo...

    hola,iván

    Disculpame, me exprese mal. Mi pregunta es otra. Quiero saber si es totalmente necesario configurar "a mano" la cuenta de google calendar para indicar cual es tu movil. Quiero decir, imaginate que yo te digo mi numero de movil, y tu no sabes nada mas de mi. Podrias enviarme un sms? Podrias configurar desde una aplicacion una cuenta con mi numero de movil, o tendriamos que hacerlo a mano? Mi pregunta es si en la API existe algun metodo para poder configurar una cuenta con un movil sin necesidad de hacerlo a mano.
    gracias de nuevo

    Iván dijo...

    Hola Feliun,

    la asociación del número del móvil a la cuenta Google hay que hacerla a mano. De hecho, una vez que introduces el número de teléfono, google te envía un SMS con un código que tienes que poner en la web para verificar tu identidad.
    Así, sin hacer tú nada a mano es imposible que yo tu pudiera enviar un sms. Otra cosa sería lo que te he comentado de añadir el evento contigo como asistente.

    Saludos, Iván.

    Feliun dijo...

    Pues muchas gracias. Es una pena, porque el poder automatizarlo seria un gran avance.

    Un saludo

    juegossex dijo...

    A mi no me ha funcionado, existe algún log donde pueda ver que está ocurriendo, por que no me arroja nigún error

    Muchas gracias por tu trabajo

    Iván dijo...

    Hola juegossex,

    el único log que se muestra es lo que sale por pantalla cuando ejecutas el script. Puedes comprobar en la web de google calendar si el evento se está cargando correctamente en tu calendario. Si es así y no te llega el SMS, el problema es de Google. Si no se carga el evento en el calendario es que puede que haya cambiado algo en la API y tenga que actualizar el programa.

    Saludos, Iván.

    davidin dijo...

    Buenas Ivan,
    antes de nada muchas felicidades por tu trabajo,
    tener este servicio en mi central Asterisk seria muy bueno.

    Te comento ,
    tengo dos consultas que hacerte:

    1)Creo que para el envio de sms debo enlazar mi Asterisk con el Google Calendar ,he leido algunos articulos de la empresa Irontec sobre esto,y tengo problemas de compilacion del fichero .rb ,mi pregunta es si controlas algo sobre este lenguaje de programacion,Ruby.

    2)Hay algo que no me quedo totalmente claro y es como enlazaria mi movil con Google Calendar,¿este enlaza es gratuito?.

    Nada mas ,muchas Gracias y un coordial saludo.

    David Escañuela ALonso

    Iván dijo...

    Hola davidin,

    gracias, me alegro de que te guste y te pueda resultar útil. Te respondo:
    1.- No sé nada de ruby ni de Irontec ni si se puede enlazar de alguna manera Asterisk con Google Calendar de "manera nativa".

    2.- Para enlazar tu móvil con Google Calendar te debes conectar a Google Calendar y en el menú Settings -> Mobile Setup tienes la opción para hacerlo. Una vez configurado, insertas un evento en tu calendario, activas el recordatorio por sms y esperas a que te llegue el aviso.
    Cuando tengas hecho eso podrás utilizar mi script para insertar eventos en tu calendario.

    Si lo quieres enlazar con Asterisk tendrás que hacer algún script que según tu criterio introduzca esos eventos en tu calendario para que se te envíen por SMS.

    Por último, como comento en el artículo, en España el envío de estos sms es totalmente gratuito.

    Saludos, Iván.

    davidin dijo...

    Buenas de nuevo Ivan,

    la primera pregunta que hize ya la he resuelto,mi intencion era enlazar Asterisk a Google Calendar para recibir llamadas teniendo en cuenta un calendario determinado.

    Lo que me gustaria hacer es un enlace de Asterisk con el envio de SMS de forma que en determinado momento se envie un sms a un numero concreto.

    Supongo por lo que me comentas que si quiero q se envie a varios numeros diferentes tendre que hacer tantas cuentas en google como numeros quiera ,no es muy optimo pero....pasable.

    He seguido los pasos de tu articulo,modifique el directorio de instalacion y la configuracion de Google en el archivo sms_send.php.

    No uso FreePBX y nose que hay que modificar en el voicemail.conf,modifique el extensions.conf como te puse en el foro de tu articulo (http://www.bytecoders.homelinux.com/content/aviso-por-sms-de-nuevo-voicemail.html).

    No recibo ningun sms ,supongo que la configuracion del correo hace falta.

    Lo que te puse del archivo de log es porque se sobreescribe.

    Un saludo y gracias por tu atencion.

    Iván dijo...

    Hola davidin,

    me parece que te has confundido y deberías preguntar esto a bytecoders en su blog. El artículo que enlazas es suyo y él es el experto en Asterisk, yo no sé nada de eso y me temo que no te puedo ayudar.
    Yo hice el código java y como ves en los comentarios de este post Errante lo convirtió a php para poderlo usar en su web.

    Lo siento pero no te puedo ayudar mucho más con tu configuración.

    Saludos, Iván.

    davidin dijo...

    Tienes toda la razon Ivan,lo siento por la equivocacion,no obstante, tu ers el que creo la aplicacion para el envio de SMS a traves de Google que al fin y al cabo es lo que me hacia falta,la integracion con Asterisk tengo que afinarla mas ,pero bueno..Muchas Gracias por tu atencion.
    Un saludo.

    davidin dijo...

    Buenas de nuevo Ivan,
    he modificado un poco tu codigo para meterle la duracion del evento por parametros.

    Me da un error que he leido en comentarios de arriba que es por el SMS_HOME:

    Lo que pasa es que nose que pongo mal, las librerias no hay que cambiarlas de ruta ,solo el .class nuevo supongo ,y eso hago pero sigue dando este error:

    Exception in thread "main" java.lang.NoClassDefFoundError: /root/NetBeansProject/SMS/build/classes/sms

    davidin dijo...

    Buenas Ivan,
    no se cuando podras contestarme pero te comento que tu programilla me funciona si le paso los parametros desde dentro y no desde la ejecucion del .sh .Se que es un problema de path,nose si podras ayudarme ,cree el java en un proyecto pero en el paquete por defecto ,lo compile y copie el .java y el .class en la carpeta SMSGoogle.


    Y al ejecutar el .sh me aparecen errores de java.lang ,como java.lang.NoClassDefFoundError o java.lang.ClassLoader.

    Si pudieras ayuarme te lo agradeceria .

    Iván dijo...

    Hola davidin,

    con los paths de java siempre hay problemas al principio :-P. Te copio la salida de un ls -lR para que veas cómo lo tengo configurado:

    ivan@doraemon:~/workspace/GoogleCalendar$ ls -lR
    .:
    total 12
    drwxr-xr-x 2 ivan ivan 4096 2008-06-13 20:39 bin
    drwxr-xr-x 2 ivan ivan 4096 2007-05-20 01:11 lib
    drwxr-xr-x 2 ivan ivan 4096 2007-06-03 00:59 src

    ./bin:
    total 4
    -rw-r--r-- 1 ivan ivan 3464 2008-06-13 21:00 EnviaSMS.class

    ./lib:
    total 764
    -rw-rw-r-- 1 ivan ivan 55932 2006-04-19 17:11 activation.jar
    -rw------- 1 ivan ivan 19874 2007-05-01 01:33 gdata-calendar-1.0.jar
    -rw------- 1 ivan ivan 329159 2007-05-01 01:32 gdata-client-1.0.jar
    -rw-rw-r-- 1 ivan ivan 356519 2006-04-19 17:13 mail.jar

    ./src:
    total 4
    -rw-r--r-- 1 ivan ivan 2648 2008-06-13 21:00 EnviaSMS.java

    Espero que te sirva.

    Saludos, Iván.

    davidin dijo...

    Ya solucione el tema ,era simplemente que en el archivo .sh sobraba "/bin" .Ya envio sms satisfactoriamente jeje,gracias por tu ayuda y un saludo.

    Anónimo dijo...

    Hola,

    Soy analfabeto total en lo que concierne a desarrollo Java :p Pero el caso es que tu aplicación me viene de perlas, pero tengo un problema y es que necesito que la conexión que se hace salga a través de proxy.
    He probado a incluir esto en el .sh:

    java -DproxySet=true -Dhttp.proxyHost=proxy.miproxy.es -Dhttp.proxyPort=8080 -classpath $CLASSPATH EnviaSMS $@

    Pero no funciona. No se si es una burrada de todos modos. Tiene fácil solución? o voy llamando a alguien que sepa? xD

    Gracias Ivan! :)

    Iván dijo...

    Hola Anónimo,

    Me alegro de que mi aplicación te pueda resultar útil. Siento no poder ayudarte pero no estoy detrás de un proxy para poder hacer pruebas. Vas a tener que seguir buscando más...

    Saludos, Iván.

    Jeysson Poquioma dijo...

    Muy buen ejemplo, te felicito es muy interesante este tema, me fue de mucha utilidad sigue adelante !!

    Iván dijo...

    Hola Jeysson Poquioma,

    muchas gracias, me alegro de que te haya sido útil.

    Saludos, Iván.

    Quim dijo...

    Buenas Iván,

    Muy buen trabajo!

    Yo he tenido que añadir, a parte de la gdata-core-1.0.jar, la google-collect-1.0.jar. Y la notificación por SMS funcionando en toda regla.

    Saludos!

    Iván dijo...

    Hola Quim,

    gracias! :-D

    Las librerías en los casi 3 años que hace que publiqué esto han cambiado, pero como dices, sólo hay que poner las nuevas y a tirar :-).

    Saludos, Iván.

    Jim dijo...

    Hola Ivan, soy Jim, gracias por tu post, me sirvio de mucho... Ahora yo estoy relacionando el API de Goole Calendar con una aplicacion de Java.

    Gracias...

    Iván dijo...

    Hola Jim,

    gracias a ti por tu comentario :-). Yo también estoy trabajando actualmente con las APIs de Google y este antiguo artículo me ha servido para recordar un poco todo...

    Saludos, Iván.

    Ricardo Bazan dijo...

    Hola Ivan! Excelente tu trabajo, leer esto me motivo a aprender sobre las Apis de Google.

    Sin embargo todavia no pude hacerlo andar,leyendo todo los comentarios, agregue las nuevas librerias...y finalmente compila correctamente. pero al usar los argumentos, me da un error, me ayudas a resolverlo?---

    Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/collect/Maps
    at com.google.gdata.wireformats.AltRegistry.(AltRegistry.java:118)
    at com.google.gdata.wireformats.AltRegistry.(AltRegistry.java:100)
    at com.google.gdata.client.Service.(Service.java:555)
    at EnviaSMS.main(EnviaSMS.java:42)
    Caused by: java.lang.ClassNotFoundException: com.google.common.collect.Maps
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 4 more


    Muchas Gracias

    Ricardo Bazan dijo...

    lo solucione!!!

    Muchas gracias!!!

    simplemente me faltaba la libreria google-collect-1.0.jar

    Iván dijo...

    Hola Ricardo,

    me alegro de que te haya gustado :-). Al final lo has descubierto tu sólo y no me ha dado tiempo a decírtelo.

    Ten en cuenta que este artículo es de hace más de 3 años, por lo que las librerías se han actualizado y también lo han hecho las dependencias. Por eso inicialmente no era necesario incluir esa librería.

    Saludos, Iván.

    Eneko dijo...

    Hola Iván,

    Si utilizo la notificación por email funciona correctamente, pero lo que es el sms (es decir, tu código copiado y pegado) no llega. En google está todo bien configurado, mi móvil indicado y activado, pero nada, que no llega. He utilizado todos los .jar que habéis mencionado posteriormente en los comentarios y ni por esas. Supongo que como bien dices será un problema de Google, pero se me hace raro, la verdad.

    Gracias por el script, es la bomba.

    Iván dijo...

    Hola,

    @Eneko: Has probado a crear un evento desde la interfaz web de Google Calendar indicando que quieres que te avise por SMS?. En ocasiones los SMS no llegan o tu operador no los envían. Ahora creo que ya no pasa, pero hace tiempo con operadores como Simyo y Masmovil no llegaban los SMS de Google.

    Saludos, Iván.

    Software de Historia Clinica dijo...

    Excelente noticia sobre el uso de los sms y que mejor que utilizarlos gratis, yo lo he usado desde mexico y mi compañia de celular es movistar, pero aun sin saldo me llegan las notificaciones a mi cel, yo lo estoy tratando de implementar en php pero aqui en mexico no funciona con la compañia de telefonia telcel, eso quita bastante ventaja de usarlo, pero me parece un increible recurso para la telefonia movistar, saludos

    Anónimo dijo...

    Me pueden pasar el ejemplo porfas se los agradecería mucho, gracias!

    compagm dijo...

    Hola Iván, muy buen aporte. Lo estoy usando para enviar eventos (citas, convocatoria de reunión) pero tengo un problema con los usuarios de hotmail y los que usan como cliente de correo outlook. En el calendario de hotmail y outlook no se estan viendo los eventos agendados. Agradezco me cuentes si se te ocurre algo.
    Saludos.

    Roger dijo...

    Muy gran aporte, gracias! Esta tarde lo pruebo :)

    Hernan Rodrigo Pareja Jordan dijo...

    Felicitaciones Iván y muchas gracias! A pesar de que ya pasaron varios añitos sigue siendo muy útil para todos. Saludos desde Peru :D

    Iván dijo...

    Muchas gracias a todos por vuestros comentarios :-)

    Saludos, Iván.

    Luis Miguel dijo...

    Un trabajo excelente, pero creo que ya no funciona, google detecta que es un "bot" y lo rechaza, luego te manda un sms informándote de un posible intento de hackeo. ¿Alguna idea para solucionarlo?.
    Gracias y saludos: Luis.

    Iván dijo...

    Hola Luis Miguel,

    gracias por el aviso. Lo probaré cuando tenga un hueco. Es probable que haya que utilizar nuevas versiones de las librerías y hacer algún cambio. Es un artículo que tiene ya casi 7 años; mucho ha durado :-)

    Saludos, Iván.

    Martín Giannechini Merello dijo...

    Hola Iván, te agradecería mucho si vieras la forma de adaptar este trabajo a las librerías nuevas, porque esas que utilizaste ya no funcionan. Soy estudiante de Ingeniería en Sistemas de Información y tengo que realizar un trabajo donde utilicemos la API de Google Calendar con Java y NetBeans, y no he podido dar con la solución adecuada. Desde ya muchas gracias!

    buxade java dijo...

    No lo consegui!

    buxade.java@gmail.com
    password
    Nueva Cita
    Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.collect.ImmutableSet.copyOf([Ljava/lang/Object;)Lcom/google/common/collect/ImmutableSet;
    at com.google.gdata.wireformats.AltFormat$Builder.setAcceptableTypes(AltFormat.java:399)
    at com.google.gdata.wireformats.AltFormat$Builder.setAcceptableXmlTypes(AltFormat.java:387)
    at com.google.gdata.wireformats.AltFormat.(AltFormat.java:49)
    at com.google.gdata.client.Service.(Service.java:558)
    at EnviaSMS.main(EnviaSMS.java:48)

    Luis Miguel dijo...

    Hola a todos:
    Quiero dar una respuesta y formular una pregunta:
    La respuesta es para el usuario que ha dicho quegoogle detecta que es un bot y ya no funciona.
    Para solucionar eso, hay que crear una clave de aplicación en tu cuenta de google. Yo crearía una cuenta nueva para pruebas.
    Y la pregunta es a ver si sigue funcionando el invento.
    En la actualidad hay infinidad de códigos php que hacen esto, la mayoría usan las librerías zend.
    Yo usaba uno de esos códigos que hay por la red y andaba perfecto, pero hace unas semanas dejó de funcionar. Tengo mucho interés en saber si le sigue funcionando a alguien, para descartar algún problema en mi server.
    Muchas gracias.

    Luis Miguel dijo...

    ME estoy riendo solo de mi mismo :) porque ese usuario fui yo, jaja y ni me acordaba que lo había posteado. En fin, que como se puede deducir, solucioné ese problema usando claves de aplicación, pero dejó de funcionar ya.

    Iván dijo...

    Hola,

    es una pena que ya funcione pero ahora mismo me resulta prácticamente imposible poder dedicarle tiempo a probar una solución alternativa.

    Lo siento.

    Saludos, Iván.

    Publicar un comentario