Sélectionner une page

Dans le cadre de notre hébergement dédié administré, nous sommes parfois amenés à développer de petits outils pour nos clients…

L’un des derniers outils que nous avons mis au point est un script de capture de l’image d’une page web.

Nous avons tout d’abord cherché des solutions hébergées, mais devant le volume requis, nous avons ensuite cherché un logiciel libre capable de faire cela.

Faute d’avoir trouvé un outil libre satisfaisant, nous avons fini par mettre au point notre propre solution, et cela n’est, finalement, pas si compliqué…

Octopuce ayant pris l’habitude de libérer ses outils chaque fois que cela est possible, voici donc notre outil de capture d’image de site, et quelques explications sur son fonctionnement.

Fonctionnement du script Shots

Ce script est distribué sous licence GPL v3, ainsi que ses explications. Voici les instructions d’installation et de configuration :

  • installezMozilla Firefox (ou Iceweasel pour Debian…) VNCServer, VNCSnapshot, et les polices X11 sur votre serveur (oui, c’est inhabituel…),
  • installez si besoin les polices de caractères spéciales souhaitées (kanji, farsi, etc.) ainsi que les plugins pour Firefox souhaités (flash, java, acroread…),
  • éventuellement (je vous le conseille) installez le plugin Firefox AdBlock, qui permet de bloquer la plupart des publicités, et rend, finalement, les sites plus beaux, puisque seul leur contenu efficace reste affiché (…),
  • configurez VNCServer et le lancer,
  • modifiez le script shots.sh pour qu’il corresponde à vos besoins (voir dans la suite de ce billet).

Sous Debian, on obtient les logiciels requis en installant les packages :

aptitude install vncserver vncsnapshot iceweasel

aptitude install xfonts-base xfonts-base-transcoded ttf-freefont xfonts-100dpi xfonts-75dpi xfonts-scalable ttf-sjfonts msttcorefonts gsfonts gsfonts-x11

aptitude install imagemagick wget wput

(Les paquets imagemagick, wget et wput sont utilisés dans notre version de shots.sh, mais vous pouvez peut-être vous en passer)

Ensuite, il faut préparer le terrain :

Configuration de VNCServer :

Modifiez le fichier /etc/vnc.conf pour mettre une géométrie d’écran et une profondeur de couleur intéressante : Typiquement :

$depth="16";
$geometry="1024x768";

Lancez VNCServer (il vous demande un mot de passe la première fois, qui sera le mot de passe permettant de se connecter à l’écran virtuel)

Une fois VNCServer lancé, il vous donne l’écran utilisé, normalement le 1 (en notation X11 c’est « :1 »)

Vous pouvez donc vous connecter à X11 en utilisant un client VNC (sous Linux il y a xvnc4viewer, sous Windows UltraVNC, bref, chaque système d’exploitation a sa version de VNC, y compris mac, sparc…). Connectez-vous à l’écran sur l’IP de votre serveur (typiquement monserveur:1) et entrez le mot de passe

Vous êtes alors sur l’écran virtuel. Lancez-y Firefox une première fois, configurez si besoin votre adblock, les plugins flash et java, vérifiez que les polices passent bien, passez Firefox en plein écran, et fermez-le.

A partir de là, votre configuration serveur est prête, il ne vous reste plus qu’à personnaliser shots.sh

Personnalisation de shots.sh

Le script shots.sh est chargé d’effectuer les captures et de les envoyer au bon endroit. Il utilise Firefox et VNCsnapshot pour effectuer la capture.

Les seules lignes vraiment efficace du script proposé sont :

 # soit $URL l'url à capturer. On choisit l'écran VNC (:1)
export DISPLAY=:1
# On lance Firefox (en arrière-plan d'où le &) en lui demandant d'aller voir l'url :
Firefox "$URL" &
# On stocke dans FFPID le numéro de processus de Firefox
FFPID=$!
# On attend 1 minute, cela laisse le temps à Firefox de charger l'url
sleep 60
# On effectue le snapshot, pour cela, on précise bien le mot de passe, l'écran, et le rectangle à capturer
VNCsnapshot -passwd ~/.vnc/passwd -rect 997x602+6+112 localhost:1 /tmp/capture.jpg
# On termine Firefox
kill -15 "$FFPID"
# On attend (laissons-lui le temps de se terminer...)
sleep 3
# On efface les fichiers de lock de Firefox, qui auraient pour effet de déclencher un popup d'alerte au prochain lancement de Firefox.
rm  -f ~/.mozilla/firefox/d9no4um1.b2/.parentlock ~/.mozilla/firefox/d9no4um1.b2/sessionstore.js ~/.mozilla/firefox/d9no4um1.b2/lock
# On attend encore un peu avant de se lancer dans la prochaine capture.
sleep 3 

Que faut-il adapter à ce script ?

  • l’url doit être obtenue d’une façon ou d’une autre (dans l’exemple du zip joint, on la récupère via un script php utilisé avec wget, qui nous retourne une URL et son NUMERO D’ID en base)
  • le rectangle de capture ( -rect 997×602+6+112 ce qui correspond à ’largeur’ x ’hauteur’ + ’décalage x’ + ’décalage y’) doit être adapté à votre Firefox et à son écran virtuel
  • le nom du profile Firefox dans le dossier utilisateur peut varier (dans notre cas c’est d9no4um1.b2). Remplacez-le par votre dossier à vous, généralement situé dans /.mozilla/firefox/
  • le fichier jpeg est stocké sous /tmp/capture.jpg dans cet exemple, à vous de stocker l’image ailleurs si besoin.

Dans l’exemple fourni (shots.sh) l’url est obtenue en appelant un script php (avec wget), et le fichier est uploadé via FTP sur un serveur (avec wput). Ainsi, on peut faire tourner shots.sh sur une machine simplement reliée à internet, même pas forcément un serveur en datacenter…

Enfin, la capture est réalisée en jpeg haute qualité, et sera souvent trop grande pour votre usage souhaité. Vous pouvez alors installer Imagemagick (aptitude install imagemagick) pour, à l’aide de l’outil convert , pouvoir générer une version plus petite de l’image jpeg, à la qualité souhaitée.

Conclusions

Il est donc entendu qu’un tel système est fort pratique, mais il faut prendre note de ses prérequis :

  • il faut un geek sous la main pour l’installer et le déployer,
  • il faut adapter le script à sa situation,
  • il faut un serveur dédié (pas forcément dédié à cette tâche, hein… mais cela n’est pas vraiment envisageable sur une machine mutualisée…), ou à minima une station Linux,
  • les captures ne marcheront pas dans certains cas particuliers (sites avec authentification, sites en SSL avec un certificat non reconnu par une autorité de confiance, pages web dans des formats exotiques (pdf, popups, etc.).

Dans tous les cas, si vous avez modifié ce script d’une manière que vous jugez intéressante, n’hésitez pas à nous le signaler, nous en parlerons ici avec joie.

Enfin, si vous avez besoin de déployer ce script dans votre environnement, mais que vous n’avez pas le bon geek sous la main, appelez-nous, c’est notre métier que de déployer et mettre au point ces outils originaux…

Téléchargement

L’ensemble de ces explications ainsi que le script shots.sh d’origine sont distribués sous licence GPLv3 dans le zip ci-dessous. Enjoy !

GZ - 3.6 ko