IJenko: reverse engineering avec JSoup

Suite aux dernières infos du support (ils doivent me maudir avec mes questions) l’API qui devait être dispo en Janvier 2011 devrait en fait être disponible courant 2012…

Du coup, j’ai repris mon petit hack WebHarvest pour cette fois commencer une mini API avec JSoup. L’objectif est d’interroger programmatiquement le boitier IJenko via son API JSON

Initialisation

Tout d’abord il faut initialiser le client:

HttpClient client = new HttpClient();
client.getParams().setParameter("http.useragent","Mozilla/5.0 (Windows; U; Windows NT 6.0; fr; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10 (.NET CLR 3.5.30729)");
client.getParams().setCookiePolicy(CookiePolicy.RFC_2109);

Login

Ensuite, s’authentifier afin de créer une session et stocker un cookie:

PostMethod login = new PostMethod("https://www.ijenko.net/ijiko/user.login");
login.addParameter("ijiko_login", "login");
login.addParameter("ijiko_password", "password");
login.addParameter("ijiko_remember", "true");
login.addParameter("__token", "0.1234");
login.addRequestHeader("X-KWO-Referer","https://www.ijenko.net/");
login.addRequestHeader("X-KWO-Request","exec");
login.addRequestHeader("Accept","text/javascript, text/html, application/xml, text/xml, */*");
login.addRequestHeader("X-Requested-With", "XMLHttpRequest");
login.addRequestHeader("X-Prototype-Version", "1.6.0.3");

int code = client.executeMethod(login);
if (code != 200){
  logger.warn("Can't' login to IJenko box: " + login.getResponseBodyAsString());
  return;
}

Notes:

  • Le paramètre « token » doit certainement être unique
  • C’est étrange mais il faut fournir le « X-Prototype-Version » le « X-Requested-With » ne suffit pas pour avoir une réponse JSON
  • Le header « accept » avec « text/javascript » en premier est aussi requis pour indiquer que l’on souhaite un flux JSON

Sensor

Enfin, il faut requêter l’URL sensor.infos pour obtenir des infos sur le sensor

PostMethod post = new PostMethod("https://www.ijenko.net/sensor.infos");
post.addParameter("sensor_id","123456");
post.addParameter("__token", "0.1234");
post.addRequestHeader("X-KWO-Referer", "https://www.ijenko.net/#topic=confort/-/sensor_id/123456/tag/200");
post.addRequestHeader("X-KWO-Request", "exec");
post.addRequestHeader("Accept","text/javascript, text/html, application/xml, text/xml, */*");
post.addRequestHeader("X-Requested-With", "XMLHttpRequest");
post.addRequestHeader("X-Prototype-Version", "1.6.0.3");

code = client.executeMethod(post);
if (code == 200){ ... }

Note: Le retour JSON est un peu étrange, typiquement pour le capteur de température l’information se trouver dans un attribut écrit en HTML et correspondant a ce qu’il faut injecter dans l’intranet.

Conclusion

Cela marche très bien et l’info est très réactive. Pour des soucis de perf je vais faire une mécanique qui requête tous les capteurs et les met en cache ce qui réduira le nombre de session.

Par contre pour le push c’est une autre histoire: Comment savoir si un détecteur de mouvement ou d’ouverture a été activé ?

Je pense qu’en attendant une véritable API je vais requêter la box toutes les 5s afin de voir si l’état a changé (2.5s pour commencer a faire quelque chose c’est déjà énorme). C’est très très crade mais c’est le seul moyen de réagir à une ouverture de porte (en espérant qu’il n’y ai pas de cache server side).

Materiel

  • Je n’ai toujours pas eu le temps d’installer le machin qui contrôle la chaudière honte sur moi !
  • Toujours pas d’actionneur dans les cartons (je rêve de simplement pouvoir réagir a un presse bouton: sonnette, lampe, meteo, …)
  • Toujours rien côté programmes (mais bon avec ces briques je vais enfin pouvoir connecter Sarah et Karotz)

2 réflexions sur “IJenko: reverse engineering avec JSoup

  • 2 septembre 2011 à 13 h 51 min
    Permalien

    Prochaine étape: prendre une photo avec le Karotz quand la porte est ouverte 🙂

    Répondre
  • 13 septembre 2011 à 0 h 11 min
    Permalien

    Je viens de creuser un peu plus l’API JSON on reste vraiment dans le gros « Hack ».
    En effet:
    – Le retour des requêtes JSON est ultra spécifique (mappé sur l’IHM)
    – Le format JSON n’est pas du tout cohérent d’un concept à l’autre (parfois du html, parfois id comme clef, parfois un libellé, …)

    Bon par contre, point positif, la réponse est super rapide (ce qui n’était pas le cas l’année dernière).

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.