sexta-feira, setembro 07, 2007

Bot para Gtalk, em java

Fala gente,

Estou pesquisando sobre bots e precisei implementar um em java. Este programa conecta-se em um servidor do google talk e fica on-line eternamente, aguardando mensagens dos usuários. Para fins didáticos, ele apenas retorna o número informado, multiplicado por 2.

O programa extra que vc precisa baixar pra tudo isso funcionar, é a API Smack (v. 3.0.4), que encontra-se aqui. (após descompactar, vamos precisar apenas do smack.jar e smackx.jar)

Ponha o código-fonte abaixo num arquivo chamado Botsd.java. Coloque os dois .jar e o .java na mesma pasta e compile e execute:
$ javac -cp '.:smack.jar:smackx.jar' *.java
$ java -cp '.:smack.jar:smackx.jar' Botsd

Pronto! Vc já tem seu bot! Ah, obviamente mude o email e a senha que estão dentro do arquivo.

Obs: se quer mais informações sobre como utilizar uma API que vem num .jar leia isso.

Código-fonte:

/*
* Mantém um bot para gtalk
*/

import org.jivesoftware.smack.*;
import
org.jivesoftware.smack.packet.Presence;
import
org.jivesoftware.smack.packet.Packet;
import
org.jivesoftware.smack.packet.Message;
import
org.jivesoftware.smack.PacketListener;
import
org.jivesoftware.smack.filter.PacketFilter;
import
org.jivesoftware.smack.filter.PacketTypeFilter;
import
org.jivesoftware.smack.Chat;
import
org.jivesoftware.smack.XMPPException;
import
org.jivesoftware.smack.ConnectionConfiguration;
import
org.jivesoftware.smack.XMPPConnection;

public class Botsd {

static XMPPConnection conexao;

public Botsd() {}

public static void main(String args[]) {


// strings
String servidor = "talk.google.com";
Integer porta = 5222;
String servico = "gmail.com";
String usuario = "meu_usuario_do_gmail_sem_arroba";
String senha =
"minha_senha";

// configs do gtalk
ConnectionConfiguration config =
new ConnectionConfiguration(servidor, porta, servico);
config.setSASLAuthenticationEnabled(
true);
config.setReconnectionAllowed(
true);
conexao =
new XMPPConnection(config);

// tentando conectar
System.out.println(
"[ .... ] Tentando conectar... ");

try {
conexao.connect();
System.out.println(
"[ OK ] Conectado.");

// tentando logar
System.out.println(
"[ .... ] Tentando logar...");

try {
conexao.login(usuario, senha);
System.out.println(
"[ OK ] Logado.");

// envia presenca
System.out.println(
"[ .... ] Atualizando presenca e status...");
Presence presenca =
new Presence(Presence.Type.available);
presenca.setStatus(
"Oi gente!");
conexao.sendPacket(presenca);
System.out.println(
"[ OK ] Atualizado.");

PacketFilter meuFiltro = new PacketTypeFilter(Message.class);

conexao.addPacketListener(criaListener(), meuFiltro);

try {

// loop infinito, aguardando mensagens...
System.out.println(
"[ .... ] Ouvindo...");

while(true) {
Thread.sleep(1000);
}

} catch (Exception e) {};

} catch (XMPPException e) {
System.out.println(
"[ ERRO ] Nao consegui logar!");
}

} catch (XMPPException e) {
System.out.println(
"[ ERRO ] Nao consegui conectar no servidor!");
}

}

/*
* Aqui esta definido o metodo que ira manipular as mensagens recebidas...
*/

public static PacketListener criaListener() {
PacketListener meuListener = new PacketListener() {
public
void processPacket(Packet pacote) {
// pega dados relevantes

String mensagem = ((Message)pacote).getBody();
String origem = pacote.getFrom();

Integer resultado = Integer.parseInt(mensagem) * 2;
String retorno = mensagem+" * 2 = "+resultado;

enviaMensagem(origem, retorno);
}};
return meuListener;
}


/*
* Envia mensagem para o destino especificado...
*/

public static void enviaMensagem(String destino, String mensagem) {
MessageListener meuMessageListener;
meuMessageListener =
new MessageListener() {public void processMessage(Chat chat, Message message) {}};
Chat chat = conexao.getChatManager().createChat(destino, meuMessageListener);
try {
chat.sendMessage(mensagem);
}
catch (XMPPException e) {
System.out.println(
"[ ERRO ] Nao consegui enviar mensagem para "+destino);
}
}

}



Obs: se lhe foi útil, deixe um comentário, por favor...
Obs2: tentei identar o código, mas o blogger tirou tudo...

2 comentários: