BOT para Google Talk

botEl programa Talk de Google es una aplicación de mensajería instantánea que implementa los protocolos XMPP y Jingle. Si queréis más información técnica podéis ver Google Talk for Developers

¿Que es un Bot?
Pues según la Wikipedia, es un programa informático que simula el comportamiento humano. Y un Bot conversacional un programa informático que simula mantener una conversación con una persona.

Vamos ha hacer una aplicación que se conecte a Google Talk como un contacto más y cuando le escribas algún mensaje, realice una acción.
¿Que cosas puede hacer un Bot? Lo que se te ocurra, por ejemplo:

  • Si tienes un servidor en casa, puedes poner un Bot en el y desde cualquier sitio pedirle cierta información.
  • Ponerlo en el ordenador del trabajo y desde casa mandarle algún comando para que ejecute algo en el.
  • Mandarle mensajes automáticos a tus contactos


Google tiene disponibles mas de 30 Bots para realizar traducciones de un idioma a otro, por ejemplo, tu le pones una frase en castellano y el te responde la misma frase en ingles.

Se puede hacer con el API que facilita Google App Engine, pero para hacer algo más independiente, se puede usar cualquier librería que implemente el protocolo XMPP. En este caso yo he usado la librería Smack, esta librería funciona bastante bien y es muy fácil de usar.

Empecemos:
El Bot, se va a conectar con el usuario se establezcamos en la variable user, este usuario lo tenéis que tener ya disponible en vuestra lista de contactos para poder interactuar con el.

package com.jrodriguezweb.bot.gtalk;

import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.ChatManager;
import org.jivesoftware.smack.ChatManagerListener;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.Presence;

public class Bot {

	private Object lockSalir = new Object();
	private final String user = "usuario@gmail.com";
	private final String pass = "password";
	private final String msgStatus = "";

	public static void main(String[] args) {

		Bot bot = new Bot();
		bot.run();
	}

	private int run() {

		ConnectionConfiguration config = new ConnectionConfiguration(
				"talk.google.com", 5222, "gmail.com");
		config.setSASLAuthenticationEnabled(true);
		// Para poder conectar a Gtalk, es obligatorio usar TLS
		// Por defecto esta activo, así que esta llamada no haría falta, pero
		// nunca esta de más ponerla
		config.setSecurityMode(ConnectionConfiguration.SecurityMode.enabled);

		final XMPPConnection con = new XMPPConnection(config);
		try {
			con.connect();
			con.login(user, pass);
		} catch (XMPPException e) {
			System.err.println("Error al conectar: " + e.getMessage());
			return -1;
		}

		// Fijamos nuestro estado
		Presence presence = new Presence(Presence.Type.available, msgStatus, 0,
				Presence.Mode.available);
		con.sendPacket(presence);

		ChatManager chatManager = con.getChatManager();
		final MessageListener ml = new MiMessageListener(con, lockSalir);
		chatManager.addChatListener(new ChatManagerListener() {
			@Override
			public void chatCreated(Chat chat, boolean createdLocally) {
				chat.addMessageListener(ml);
			}
		});

		synchronized (lockSalir) {
			try {
				// Esperamos a que alguien nos avise para salir
				lockSalir.wait();
			} catch (InterruptedException e) {

			}
		}

		con.disconnect();
		System.out.println("Saliendo ...");
		return 0;
	}

}

En la línea 27 creamos un objeto de tipo ConnectionConfiguration donde establecemos los parámetros de conexión. Para poder conectarte al servidor de Talk de Google, es obligatorio activar la seguridad TLS, Smack por defecto lo tiene activado con lo cual no sería necesario indicarlo, pero por claridad, prefiero indicárselo en la línea 33. Si estuviéramos detrás de un proxy, deberemos indicárselo a la clase ConnectionConfiguration pasándole en el constructor un objeto de tipo ProxyInfo.
Una vez que tenemos todos los parámetros fijados, realizamos la conexión, lineas 35 – 42, y ponemos nuestro estado a disponible

Ya estamos conectados y disponibles para recibir o enviar mensajes. Entre las lineas 49 – 56 indicamos que todos los mensajes que recibamos, los vamos a procesar en el MessageListener que será una instancia del tipo MiMessageListener. En la función processMessage(Chat chat, Message message) es donde se van a recibir todos los mensajes, con lo cual es aquí donde esta la gracia del asunto.

Veamos el listener (Copio los fuentes enteros por su brevedad)

package com.jrodriguezweb.bot.gtalk;

import java.util.Date;

import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Presence;

public class MiMessageListener implements MessageListener {

	private XMPPConnection con;
	private Object lockSalir;
	private Presence.Mode mode = Presence.Mode.available;

	public MiMessageListener(XMPPConnection con, Object lockSalir) {
		this.con = con;
		this.lockSalir = lockSalir;
	}

	@Override
	public void processMessage(Chat chat, Message message) {
		if (message.getType() == Message.Type.chat && message.getBody() != null) {
			final String msg = message.getBody().toUpperCase();

			switch (msg) {
			case "HORA":
				try {
					if (mode == Presence.Mode.available) {
						chat.sendMessage("Hora actual: " + new Date());
					}
				} catch (XMPPException e) {
					System.err.println("Error al procesar Hora");
				}
				break;
			case "DUERME":
				Presence p = new Presence(Presence.Type.available, "", 0,
						Presence.Mode.xa);
				con.sendPacket(p);
				mode = Presence.Mode.xa;
				break;
			case "DESPIERTA":
				Presence p2 = new Presence(Presence.Type.available, "", 0,
						Presence.Mode.available);
				con.sendPacket(p2);
				mode = Presence.Mode.available;
				break;
			case "ADIOS":
				synchronized (lockSalir) {
					// Avisamos al thread principal para terminar
					lockSalir.notify();
				}
				break;
			}
		}
	}
}

Este Bot es muy simple, solo tiene cuatro comandos sencillos:

  • Hora: Devuelve la hora actual
  • Duerme: Cambia su estado a ausente y no procesa ningún mensaje.
  • Despierta: Vuelve a estar disponible
  • Adios: Se desconecta

Como se puede ver, es muy sencillo y las posibilidades son enormes, así que imaginación al poder.

Anuncios

2 Responses to BOT para Google Talk

  1. jackgris says:

    Muy interesante el post, gracias 😉

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: