Pour les besoins d’une conférence sur Apache Camel, je trouvais sympa d’afficher les live-tweets sous forme de notification Ubuntu pendant le déroulement des slides. (J’avais trouvé l’idée du Tweet-wall du DevoXX sympa)
En creusant un peu, je suis tombé sur la librairie GTK.jar fournie par java-gnome.
1 – Pré-requis
Tout d’abord, il vous faudra installer le paquet libjava-gnome-java :
sudo apt-get install libjava-gnome-java
2 – Twitter API
Les recherche de hashtags, de mots clefs ou de compte se fait assez simplement grâce à l’API Twitter. Par exemple :
http://search.twitter.com/search.json?q=%23java (Pour info %23 = # et %40 = @)
La réponse est produite en Json dans notre cas.
{ "completed_in":0.031, "max_id":312144570609721344, "max_id_str":"312144570609721344", "next_page":"?page=2&max_id=312144570609721344&q=%23java", "page":1, "query":"%23java", "refresh_url":"?since_id=312144570609721344&q=%23java", "results":[ { "created_at":"Thu, 14 Mar 2013 10:13:59 +0000", "from_user":"p2pWebMobileIt", "from_user_id":551581457, "from_user_id_str":"551581457", "from_user_name":"p2p WebMobileIT", "geo":null, "id":312144570609721344, "id_str":"312144570609721344", "iso_language_code":"en", "metadata":{ "result_type":"recent" }, "profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2099631495\/p2people_logo_48x48_normal.png", "profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2099631495\/p2people_logo_48x48_normal.png", "source":"<a href="http:\/\/www.p2people.co.uk">p2people<\/a>", "text":"Java Developer - Norwegian\/Danish\/Swedish speaker w\/ #Developer #Java skills Oslo @p2people http:\/\/t.co\/ETi1qRMz5k" }, [...] ], "results_per_page":15, "since_id":0, "since_id_str":"0" }
Une fois la requête effectuée, nous pouvons mapper cette structure Json sur un MOO java avec GSon par exemple.
Il s’agit de la première requête. On observe un attribut intéressant : « refresh_url », ça va nous donner la requête suivante pour n’avoir que le delta :
http://search.twitter.com/search.json?since_id=312144570609721344&q=%23java
3 – La notification
Voici une version simplifiée :
import org.gnome.gdk.Pixbuf; import org.gnome.gtk.Gtk; import org.gnome.notify.Notification; import org.gnome.notify.Notify; import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang.WordUtils; import org.apache.commons.lang.time.DateFormatUtils; public class FeedShow { public static void main(final String[] args) { Gtk.init(null); Notify.init("Ubuntu TweetFeed"); TwittBean twitt = ... // récupération du Tweet à partir du Json final String imgurl = URLDecoder.decode(twitt.getProfile_image_url(), "UTF-8"); final Notification notif = new Notification( DateFormatUtils.format( SDF.parse(twitt.getCreated_at()), "EEE, d MMM yyyy HH:mm:ss", Locale.FRENCH), twitt.getFrom_user_name() + " (@" + twitt.getFrom_user() + ") :\n" + WordUtils.wrap(twitt.getText(), 50), ""); try { p = getIcon(imgurl); notif.setIcon(p); } catch (final IOException e) { e.printStackTrace(); } notif.show(); Thread.sleep(1000); notif.close(); } private static Pixbuf getIcon(final String imgurl) throws IOException { final String fileName = FilenameUtils.getName(imgurl); final File local = new File(System.getProperty("java.io.tmpdir") + File.separator + fileName); if (!local.exists()) { final URL url = new URL(imgurl); FileUtils.copyURLToFile(url, local); } final Pixbuf pic = new Pixbuf(local.getAbsolutePath()); return pic; } }
4 – Conclusion
Trop facile 🙂
Les sources sont disponibles ici : https://giwi.free.fr/docs/Ubuntu-tweedFeed/.