Mephisto, un navigateur côté serveur

Par Olivier Meunier, le 22 mars 2011, dans .

Depuis le début de l’année, je travaille sur un projet consistant à disposer d’un navigateur côté serveur. Nous avons besoin, chez Temesis, d’un outil permettant d’obtenir une page web telle que l’utilisateur final l’obtient sur son navigateur. De plus en plus de sites font maintenant appel à JavaScript pour modifier les pages côté client ou ajouter des fonctionnalités, parfois très profondément. Vous imaginez aisément qu’un projet d’analyse qualitative ne peut pas, dans ces conditions, se contenter de travailler sur la source du document telle qu’on l’obtiendrait en la demandant directement au serveur.

Comment obtenir le même document que l’utilisateur (nous l’appellerons le DOM – Document Object Model) mais côté serveur ? Il faut un outil permettant de charger une page web et d’exécuter les scripts qui y sont associés. Cet outil existe, on l’appelle un navigateur. La grande différence réside dans les moyens d’interagir avec le navigateur. Il est question de faire parler des programmes entre eux et vous vous doutez qu’une interface utilisateur n’est pas le moyen le plus simple pour un programme de donner des ordres à un navigateur. Nous avons donc décidé de parler à notre navigateur en http et d’en faire un serveur web.

Nos premiers essais ont consisté à implémenter un serveur HTTP dans une application XUL (le “squelette” des applications Mozilla). Les résultats n’étant pas convaincants, nous avons alors écrit une application Qt utilisant Webkit, fonctionnant assez bien mais s’avérant assez complexe à déployer. Finalement, l’écriture d’une extension Firefox 4 en utilisant le Add-On SDK (Jetpack) s’est avérée être la bonne solution. Inutile de préciser que nous avons besoin d’un navigateur qui soit très performant et stable. Sur ce point, Firefox 4 ne déçoit pas du tout et dépasse même toutes nos attentes. Ainsi est né Mephisto.

Comment tout ceci fonctionne ? C’est très simple. Une fois l’extension installée, votre navigateur va écouter en local sur le port 8000 (configuration par défaut). Vous pouvez alors lui demander une page, par exemple, pour Temesis : http://localhost:8000/?url=http://www.temesis.com/. La réponse sera un contenu texte contenant le DOM de la page (et non sa source). Si vous le faites dans le même navigateur vous verrez un onglet s’ouvrir tout seul et se refermer, c’est amusant.

Utiliser un navigateur nous a permis d’ajouter d’autres fonctionnalités. Par exemple, nous pouvons implémenter un équivalent du moniteur réseau de Firebug. Ainsi la requête http://localhost:8000/dump?url=http://www.temesis.com/ enverra une réponse au format JSON contenant le DOM ainsi qu’une liste de toutes les ressources chargées avec la page. Cette fonctionnalité permet également d’appliquer des scripts externes sur la page pour la modifier et/ou ajouter d’autres informations aux résultats envoyés. Par exemple, nous pouvons, en plus, obtenir la liste des liens et des images dans le document. Par ailleurs, une fonctionnalité de capture d’écran existe mais n’est pas encore tout à fait stable.

Nous avons réalisé Mephisto pour nous permettre d’implémenter une nouvelle fonctionnalité sur Opquast Reporting et nous ne doutons pas que nous allons pouvoir généraliser son usage pour nos outils existants et pour proposer quelques nouveautés très intéressantes.

Temesis a une politique de contribution ouverte déjà reconnue, que ce soit au travers des Bonnes Pratiques Opquast, sous licence Creative Commons, ou de nombreuses contributions actives à des projets tels que Wikipedia, Dotclear ou SPIP. Ainsi, nous avons décidé de libérer le code de Mephisto pour vous permettre de l’utiliser comme bon vous semble et d’y contribuer. C’est notre façon de fêter le lancement de Firefox 4 🙂

Le code de l’extension et un début de documentation est disponible sur GitHub. Vous pouvez télécharger directement l’extension ou l’utiliser avec le Add-On SDK de Mozilla.

7 commentaire(s)

  1. Par Maurice, le 22 mars 2011 à 17 h 01 min :

    Excellente idée, ça ouvre plein de possibilité. Par contre, est-ce que ça marche en headless ?

  2. Par Olivier, le 22 mars 2011 à 17 h 05 min :

    Maurice, il fonctionne dans Xvfb. Pour l’instant aucun navigateur n’est capable de fonctionner dans un vrai mode headless. Un bug est ouvert chez Mozilla à ce sujet ce qui laisse envisager que ça sera faisable un jour 🙂

    Note: il y a un initd qui permet de lancer le navigateur dans xvfb pour debian et ubuntu.

  3. Par Jeremie, le 22 mars 2011 à 21 h 11 min :

    Vous avez essayer de faire tourner ça avec Chromeless ?
    ça devrait permettre de se passer d’interface graphique 😉

    http://mozillalabs.com/chromeless/

  4. Par Olivier, le 22 mars 2011 à 23 h 25 min :

    Jeremie, je ne suis pas sûr que Chromeless puisse se passer d’un serveur X. Il ne supprime que l’interface utilisateur. Je testerai si j’ai un moment.

  5. Par Damien, le 23 mars 2011 à 10 h 02 min :

    Pourquoi ne pas utiliser Selenium ?

    Sinon, c’est pas du Python. Mais il existe des solutions qui permettent d’exécuter du javascript sans embedder de navigateur.
    Johnson ( https://github.com/jbarnette/johnso… ) par exemple qui, combiné à harmony ( https://github.com/mynyml/harmony ) permet de faire ce que vous cherchez à obtenir 🙂

  6. Par Olivier, le 23 mars 2011 à 11 h 20 min :

    Damien, Selenium et WebDriver a été le premier outil évalué. Un peu lourdingue à déployer et quelques limites techniques.

    Harmony est effectivement intéressant. Si notre cahier des charges n’avait pas explosé pendant la phase de r&d on serait peut-être partis là dessus 🙂

  7. Par kliff, le 22 septembre 2015 à 3 h 12 min :

    Bonsoir à tous
    Le navigateur est il compatible avec la dernière version de firefox (la 40) ?
    Faut il faire des mises à jour ?
    Merci de vos retours.

Les commentaires sont fermés.