Collegarsi a Google Talk in Java: Jivesoftware Smack
Vediamo quanto sia semplice collegarsi a GTalk o a qualsiasi altro servizio di IM basato sul protocollo Jabber, utilizzando la libreria Open Source Smack. Scriviamo un piccolo bot che non faccia altro che rispondere a chi gli scrive come un pappagallo.
Smack è una libreria opensource, scritta dalla community Jivesoftware, che permette di scrivere molto semplicemente un client XMPP, protocollo del sistema di chat IM Jabber, sul quale sono basati molti IM conosciuti, fra cui anche Google Talk.
Questa libreria è sia molto potente, sia molto semplice da usare. Si propone infatti come API ad alto livello, ma permette anche di scendere ad un livello piu’ basso, quello del XMPP Packet, per permettere l’implementazione di servizi più complessi di un semplice bot come quello che stiamo per realizzare. Vediamo quanto sia semplice inviare un messaggio:
1 2 3 4 |
GoogleTalkConnection con = new GoogleTalkConnection(); con.login("user", "password"); con.createChat("utente@gmail.com") .sendMessage("Ciao!"); |
GoogleTalkConnection è una estensione di XMPPConnection, classe base per la connessione a server Jabber. Il nostro bot non farà altro che inviare un messaggio dal testo identico a quello ricevuto, a chi gli scrive. Non è sicuramente un bot utile, ma puo’ servire come base per altri servizi.
Una volta creata la connessione, è opportuno settare la propria “Presence”, altrimenti il bot rimane nascosto (disconnesso) agli occhi degli altri utenti:
1 2 3 4 5 6 7 8 9 10 11 12 |
public void init(String username, String password){ try{ con.login(username, password); Presence presence = new Presence(Presence.Type.AVAILABLE); presence.setStatus("GTalkBot"); con.sendPacket(presence); gpp = new GTalkPacketProcessor(con); gpp.start(); }catch(Exception e){ System.out.println("Initialiting Exception: "+e); } } |
In questo modo il bot è online (AVAILABLE) e il suo status mostra il messaggio “GTalkBot”. Ora dobbiamo essere in grado di ricevere i messaggi e di rispondere a chi ci scrive. La classe Message deriva direttamente da Packet, il pacchetto XMPP, e lo specializza.
Per poter analizzare i pacchetti, bisogna istanziare un PacketCollector, che accumula i pacchetti di una data tipologia a cui possiamo accedere attraverso il metodo bloccante “nextResult()”. La tipologia di messaggio che ci interessa, va settata come PacketFilter. Ma vediamo nel dettaglio la nostra classe “GTalkPacketProcessor”, che estende Thread e si occupa di rispondere a chi ci scrive:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
class GTalkPacketProcessor extends Thread{ PacketCollector pc; GoogleTalkConnection con; public GTalkPacketProcessor(GoogleTalkConnection con){ this.con = con; PacketTypeFilter myFilter = new PacketTypeFilter(Message.class); pc = this.con.createPacketCollector(myFilter); } public void run(){ while(true){ try{ Message message = (Message) pc.nextResult(); System.out.println("Nuovo messaggio: "+message.toXML()); if (message.getType()==Message.Type.CHAT){ Chat c = new Chat(con, message.getFrom()); c.sendMessage(message.getBody()); } }catch(Exception e){ System.out.println("Error processing message: "+e); } } } } |
Abbiamo settato come pacchetti “interessanti” quelli di tipo “Message.class”, i messaggi veri e propri quindi. Poi, se tali messaggi sono messaggi di chat (Message.Type.CHAT), abbiamo replicato con lo stesso testo.
In output stampiamo l’XML di ogni messaggio ricevuto, nel formato XMPP. Ovviamente chi ha intenzione di approfondire ulteriormente questo protocollo, farà bene a studiare il formato di tali pacchetti:
1 2 3 4 5 6 7 8 9 10 |
<message id="71" to="xxxx@gmail.com/Smack497E864B" from="user@gmail.com/Talk.v1045A8484A7" type="chat"> <body>Ciao!</body> <active xmlns="http://jabber.org/protocol/chatstates"> </active> <x xmlns="google:nosave"> </x> <record xmlns="http://jabber.org/protocol/archive"> </record> </message> |
Il nostro bot ha già la parola! Basta un po’ di fantasia per trovargli dei compiti da eseguire, in modo da comandarlo da remoto!
Potete scaricare la libreria e la relativa documentazione dal sito:
igniterealtime.org