Phantomjs : faire un screenshot d’un site en https

J’utilise phantomjs pour faire des captures d’écran régulièrement de pages d’un site pour voir l’évolution de la page ou tout simplement créer des archives sans avoir à y penser.

screenshots avec phantomjs en javascript

Phantomjs permet de manipuler en javascript le moteur de rendu webkit afin de simuler un navigateur en ligne de commande.

Problème de rendu avec phantomjs et le https

En prenant des screenshots de notre site de coaching,  je me suis aperçu que les fichiers png générés étaient vides.

Après investigation, il s’avère que par défaut, phantomjs peut avoir des problèmes avec les sites en https.

Pour résoudre la situation, il faut utiliser le switch –ssl-protocol=any ou –ssl-protocol=TLSv1. Par défaut phantomjs utilise SSLv3 qui ne fonctionne pas dans mon cas.

phantomjs --ssl-protocol=any fitnext.js

Script pour faire le rendu phantomjs

Le javascript final qui permet de faire le screenshot ressemble à ceci :

var page = new WebPage();
page.settings.userAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.65 Safari/537.36';
page.viewportSize = { width: 1280, height: 800 };
page.open('https://www.fitnext.com', function (status) {
    var now = new Date();
    var month = now.getMonth()+1; if (month < 10) month = '0'+month;
    var day = now.getDate(); if (day < 10) day = '0'+day;
    var filename = 'homepage/' + now.getFullYear() +'-'+month+'-'+day+ '_homepage_fitnext.png';
    page.render(filename);
    phantom.exit();
});

Dans ce script, j’utilise les fonctions javascript de date pour créer un nom de fichier qui correspond à la date du jour.

Ici, le nom de fichier de la capture effectuée par phantomjs ressemblera à : 2016-02-20_homepage_fitnext.png

Automatisation des captures d’écran phantomjs

Pour prendre des screenshots quotidiens de la homepage, je configure une tâche cron pour cela :

40 12 * * *     cd /chemin/de/votre/script && phantomjs --ssl-protocol=tlsv1 fitnext.js > /dev/null

Je redirige la sortie standard vers /dev/null pour ne pas recevoir d’email contenant les erreurs javascript de la console.

 

Postfix: envoyer des emails à travers un tunnel ssh

postfix-ssh

 

Dans le cadre de la création d’emails de reporting, je dois envoyer des emails en local pour mes tests.

Ma machine de développement est un mac. J’ai toujours eu des problèmes pour envoyer des mails en local, donc une des solutions est d’envoyer les emails via un serveur qui est déjà correctement configuré.

Pour cela, on peut tout simplement utiliser un tunnel ssh et configurer postfix pour passer par ce tunnel pour envoyer les emails.

Configuration du tunnel

Pour créer le tunnel, utiliser la commande suivante avec monserveur.com correspondant à votre machine de relais :

$ ssh -f -o ServerAliveInterval=10 -L 54321:localhost:25 monserveur.com sleep 31622400

 

Configuration de postfix

Pour router tous les emails arrivant dans postfix vers votre relais, configurer le fichier transport, généralement /etc/postfix/transport en ajoutant la ligne suivante :

*             smtp:[127.0.0.1]:54321

Pour les détails sur la configuration de ce fichier, se reporter à la page man correspondante.

Ici, avec l’astérisque, on indique que tous les emails passeront via la passerelle 127.0.0.1 sur le port 54321 correspondant au point d’entrée de notre tunnel vers notre relais.

Enfin dans la configuration principale de postfix, /etc/postfix/main.cf il faut indiquer que l’on a un fichier de configuration de mapping pour la distribution des emails :

transport_maps = hash:/etc/postfix/transport

 

Pour prendre en compte la nouvelle configuration, sous osx :

$ sudo postmap /etc/postfix/transport
$ sudo launchctl stop org.postfix.master
$ sudo launchctl start org.postfix.master

Lors de l’émission d’un email en local, on peut observer la livraison via notre tunnel dans les logs (/var/log/mail.log) :

Feb 11 12:10:42 MacBook-Pro-de-Charles-ADG-2.local postfix/pickup[60932]: A8A7025D17CE: uid=502 from=<charles>
Feb 11 12:10:42 MacBook-Pro-de-Charles-ADG-2.local postfix/cleanup[60934]: A8A7025D17CE: message-id=<20160211111042.A8A7025D17CE@fitnext.com>
Feb 11 12:10:42 MacBook-Pro-de-Charles-ADG-2.local postfix/qmgr[60933]: A8A7025D17CE: from=<charles@fitnext.com>, size=304, nrcpt=1 (queue active)
Feb 11 12:10:42 MacBook-Pro-de-Charles-ADG-2.local postfix/smtp[60936]: A8A7025D17CE: to=<charles@fitnext.com>, relay=127.0.0.1[127.0.0.1]:54321, delay=0.78, delays=0.7/0.02/0.02/0.04, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as B75763701063)
Feb 11 12:10:42 MacBook-Pro-de-Charles-ADG-2.local postfix/qmgr[60933]: A8A7025D17CE: removed

 

Et dans les logs de notre relais :

Feb 11 12:10:42 localhost postfix/smtpd[43921]: connect from localhost[127.0.0.1]
Feb 11 12:10:42 localhost postfix/smtpd[43921]: B75763701063: client=localhost[127.0.0.1]
Feb 11 12:10:42 localhost postfix/cleanup[43924]: B75763701063: message-id=<20160211111042.A8A7025D17CE@fitnext.com>
Feb 11 12:10:42 localhost postfix/smtpd[43921]: disconnect from localhost[127.0.0.1]
Feb 11 12:10:42 localhost postfix/qmgr[1673]: B75763701063: from=<charles@fitnext.com>, size=484, nrcpt=1 (queue active)
Feb 11 12:10:44 localhost postfix/smtp[43925]: B75763701063: to=<charles@fitnext.com>, relay=aspmx.l.google.com[64.233.184.27]:25, delay=1.4, delays=0.03/0/1.2/0.2, dsn=2.0.0, status=sent (250 2.0.0 OK 1455189044 wg3si11321364wjb.162 - gsmtp)
Feb 11 12:10:44 localhost postfix/qmgr[1673]: B75763701063: removed