Journal Naviguer sans tête dans un coquillage !

Posté par  (site web personnel) . Licence CC By‑SA.
18
24
avr.
2020

Sommaire

Naviguer headless consiste à surfer sur la toile d'araignée sans gui. Dans ce journal, on ne s'intéressera pas à des outils tels que Selenium WebDriver (https://www.selenium.dev/) qui permet à partir de différents langages d'interagir avec les navigateurs les plus courants, ou Weboob (WEB Outside Of Browsers, http://weboob.org/) qui permet de se connecter à différents sites depuis Python, mais plutôt à quelques outils accessibles depuis le shell : curl, Wget, Lynx, Chromium et Firefox. On abordera en particulier le problème de la récupération d'informations accessibles uniquement quand on est identifié sur un site à l'aide d'un biscuit.

Les deux grandes parties de ce journal concerneront la récupération en ligne de commandes d'une page web soit sous sa forme HTML ou textuelle, ce qui permettra en particulier d'y chercher des informations avec grep, soit sous forme d'une copie d'écran.

Il s'agit juste de faire le bilan de quelques compétences acquises durant le Grand Confinement, sans viser l'exhaustivité. Je compte bien sûr sur vous pour corriger et compléter le sujet dans vos commentaires.

Récupérer une page web

curl

curl va récupérer la page indiquée et l'envoyer sur la sortie standard :

$ curl https://linuxfr.org/tableau-de-bord
<html><body>You are being <a href="https://linuxfr.org/compte/connexion">redirected</a>.</body></html>

En n'étant pas connecté à son compte, le résultat n'est pas intéressant. Comment récupérer votre tableau de bord ? Les navigateurs tels que Firefox et Chromium proposent des outils de développement qui vont nous aider énormément. Connectez-vous et affichez votre tableau de bord LinuxFr.org. Dans Firefox, allez dans le menu Développement web > Réseau, puis rechargez la page. Dans la liste des éléments téléchargés, revenez à la racine du site et avec le bouton droit de la souris, allez dans Copier > Copier comme cURL. Vous obtenez ainsi la commande curl permettant de récupérer la page telle qu'elle apparaît dans votre navigateur (j'ai remplacé certaines données par blablabla) :

$ curl https://linuxfr.org/tableau-de-bord -H 'User-Agent: Mozilla/5.0 blablabla' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'Accept-Language: fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3' --compressed -H 'Referer: https://linuxfr.org/' -H 'DNT: 1' -H 'Connection: keep-alive' -H 'Cookie: remember_account_token=blablabla; linuxfr.org_session=blablabla' -H 'Upgrade-Insecure-Requests: 1' -H 'Cache-Control: max-age=0' -H 'TE: Trailers' -H 'If-None-Match: W/"blablabla"'

Ca fait du monde, mais on peut ne conserver que le cookie d'identification :

$ curl https://linuxfr.org/tableau-de-bord -H 'Cookie: remember_account_token=blablabla'

Si je veux savoir si j'ai reçu une réponse à un commentaire, puisque curl envoie la page sur la sortie standard, il suffit d'ajouter un grep :

$ curl https://linuxfr.org/tableau-de-bord -H 'Cookie: remember_account_token=blablabla' | grep ''Nouveaux commentaires !'

Dans un script, il peut être intéressant de faire taire curl avec l'option -s (silent).

Références :

Wget

On peut également utiliser Wget qui va quant à lui enregistrer la page web dans un fichier :

$ wget https://linuxfr.org/tableau-de-bord

Vous constaterez en passant que Wget ne télécharge pas une page de redirection comme l'a fait curl. Mais pour récupérer du contenu intéressant, il faut comme avec curl utiliser notre cookie :

$ wget --header 'Cookie: remember_account_token=blablabla' https://linuxfr.org/tableau-de-bord

Pour faire taire Wget dans un script, on utilisera l'option -q (quiet).

Référence :

Lynx

Lynx est intéressant avec son option -dump qui permet d'envoyer le texte de la page (et non pas le code HTML) sur la sortie standard. Mais il faut d'abord activer les cookies permanents, en se créant par exemple un fichier de configuration perso :

$ cp /etc/lynx/lynx.cfg mon_lynx.cfg

Cherchez dans ce fichier PERSISTENT_COOKIES:FALSE et remplacez par PERSISTENT_COOKIES:TRUE (ligne 1428 dans mon cas). Ensuite connectez-vous sur votre compte avec Lynx :

$ lynx -cfg=mon_lynx.cfg -accept_all_cookies https://linuxfr.org/tableau-de-bord

Vous pouvez maintenant déverser le texte de la page sur la sortie standard :

$ lynx -dump -cfg=mon_lynx.cfg -accept_all_cookies https://linuxfr.org/tableau-de-bord

Références :

Chromium

Sous Ubuntu, Chromium doit être installé par snap :

$ sudo snap install chromium

Pour connaître le chemin d'accès de votre profil, lancez Chromium et tapez dans la barre de navigation : chrome://version/

Connectez-vous en mode graphique au site voulu et identifiez-vous :

$ chromium --user-data-dir='/home/monlogin/snap/chromium/blabla' https://linuxfr.org/tableau-de-bord

Vous pouvez maintenant envoyer la page HTML sur la sortie standard :

$ chromium --user-data-dir='/home/monlogin/snap/chromium/blabla' --headless --dump-dom https://linuxfr.org/tableau-de-bord

Chromium m'a été bien utile avant que je n'arrive à utiliser les autres outils, mais je lui ai trouvé deux défauts. Premièrement, l'installation dans Ubuntu via snap fait que Chromium ne peut pas écrire dans n'importe quel répertoire de votre compte, à cause des mécanismes d'isolation de snap. Deuxièmement, j'ai été obligé de recréer de nouveaux profils régulièrement : au début tout va bien, puis des avertissements comme quoi Chromium n'arrive pas à écrire dans tel ou tel fichier s'accumulent.

Référence :

Firefox

Avec Firefox, prise de tête avec --headless, je n'ai jamais réussi à récupérer une page HTML. Et vous ?

Référence :

Faire une copie d'écran

Chromium

L'option --screenshot permet d'effectuer une copie d'écran d'une page web :

chromium --user-data-dir='/home/monlogin/snap/chromium/blabla' --headless  --screenshot=linuxfr.png https://linuxfr.org/

On peut indiquer la résolution de cet écran virtuel, par exemple --window-size=1280,1024, et on peut cacher les ascenseurs avec --hide-scrollbars.

Firefox

Ca marche en créant au préalable un nouveau profil dédié, que j'ai nommé "screenshots", en lançant :

$ firefox --ProfileManager

Ce qui est intéressant avec Firefox, c'est qu'on n'obtient pas une copie de ce qui apparaîtrait à l'écran, mais une copie de la page sur toute sa longueur ! L'exemple ci-dessous me donne ainsi une image de 1 366 x 8 142 pixels :

$ firefox --screenshot -P screenshots https://linuxfr.org/

Avec Firefox, l'option --screenshot implique --headless.

Exploitation des copies d'écran

On pourrait par exemple détecter la fin du Grand Confinement en surveillant le logo de LinuxFr.org. On découpe la zone de l'image qui nous intéresse avec mogrify (ImageMagick) et on calcule sa somme MD5 :

$ mogrify -crop 193x201+90+48 linuxfr.png
$ md5sum linuxfr.png | cut -f 1 -d " "
09372763060163c12ea2e204727253b0

Il suffit alors de comparer cette somme avec celle d'une copie d'écran de référence pour détecter le changement de logo.

Référence :

Conclusion

Pour ma part, j'ai jeté mon dévolu sur curl pour son insoutenable légèreté et son affinité avec grep, et sur Firefox pour ce qui est de tirer sur l'écran. Je retiens également Lynx pour sa capacité à fournir le texte et non pas le code HTML de la page. Quant à vous, adorateurs du noyau finlandais, vénérables druides sans gui, vous arrive-t-il de naviguer sans tête dans un coquillage ? Quelles commandes et options gratinées mettez-vous dans vos marmites ?

  • # browsh

    Posté par  . Évalué à 8.

    Browsh reprend le même principe, mais en plus interactif.

    • [^] # Re: browsh

      Posté par  (site web personnel) . Évalué à 3.

      Trèèès intéressant

      it's backed by a real browser, namely headless Firefox, to create a purely text-based version of web pages and web apps

      "La liberté est à l'homme ce que les ailes sont à l'oiseau" Jean-Pierre Rosnay

  • # wkhtmltopdf

    Posté par  (site web personnel) . Évalué à 2.

    Juste pour dire que, dans le même registre, wkhtmltopdf et wkhtmltoimage rendent bien des services également.

    Avec notamment des options pour la mise en page, la numérotation de page, l'intégration de pied de page, etc.

    • [^] # Re: wkhtmltopdf

      Posté par  (site web personnel) . Évalué à 2.

      Merci je connaissais pas et c'est bluffant

    • [^] # Re: wkhtmltopdf

      Posté par  (site web personnel) . Évalué à 4.

      Merci, le résultat est vraiment bon. Son seul défaut semble un nom imprononçable !

      Ca doit pouvoir servir à imprimer certaines pages sans fioriture quand le navigateur ne donne pas un résultat satisfaisant, ou quand le mode "Lecture" de Firefox n'arrive pas à récupérer le texte. Impeccable par exemple pour lire The New York Times :

      $ wkhtmltopdf https://www.nytimes.com/2020/04/24/health/sunlight-coronavirus-trump.html essai.pdf
      

      Qu'est-ce qu'on pourrait faire d'autre avec ? Des idées ?

      • [^] # Re: wkhtmltopdf

        Posté par  (site web personnel) . Évalué à 6.

        Odoo s'en sert pour générer des documents PDF (factures, bons de commande etc) à partir de vues web.

        • [^] # Re: wkhtmltopdf

          Posté par  (site web personnel) . Évalué à 2.

          Donc techniquement c'est jouable

          Car ce qu'il manque dans le monde libre , par rapport au monde propriétaire, dans le domaine de l'informatique de gestion c'est un système de générateur d'état comme Crystal Report.

          Je connais odoo depuis longtemps (quand il était une fourmi …) et il me semble un bon challenger pour certain produit que je connais bien comme Sage X3.

          Quand je vois la vitesse d'évolution d'odoo, c'est bluffant, il existe de gros site en France ?

          • [^] # Re: wkhtmltopdf

            Posté par  (site web personnel) . Évalué à 2.

            Note: je travaillez chez eux.

            Il y a un gros chantier pour améliorer les rapports et produire de chouettes choses toutes intégrées. La V14 sortira en octobre. N'hésite pas à aller voir la liste des nouveautés à ce moment. Je n'en dis pas plus car ce n'est pas mon équipe et je n'ai pas les détails.

            Qu'entends-tu par grand site? Il y a des projets chez de grands comptes mais ce n'est pas le marché visé. La majorité des clients ont moins de 10 utilisateurs (je n'ai plus le chiffre exact en tête).

            • [^] # Re: wkhtmltopdf

              Posté par  (site web personnel) . Évalué à 3.

              Note : je travaille pour la concurrence :)

              Grand site : > 80-100 sessions des qu'il vaut mieux basculer en archi multi tiers

              je ne parle plus en terme d'utilisateurs car maintenant (même chez nous;) ) chaque utilisateur peut ouvrir plusieurs sessions et donc cela multiplie les besoins en ressources.

              Donc pour l'instant la "cible" serait les PME de 10 à 50 utilisateurs, ce que l'on faisait il ya 10 ans (ce n'est pas péjoratif)

              des que vous aurez l'expérience de vous attaquer à la gamme du dessus 50-500 utilisateurs on sera coincé entre les produits comme le tien et les très gros (Baan, JD-Edwards SAP …), et honnêtement je sais pas comment cela va se passer.

            • [^] # Re: wkhtmltopdf

              Posté par  (site web personnel) . Évalué à 3.

              Vrai question : en 2020, à quoi sert une sortie "papier" ?

              "La première sécurité est la liberté"

              • [^] # Re: wkhtmltopdf

                Posté par  (site web personnel) . Évalué à 3.

                Dans l'état actuel de l'art de l'info de gestion :

                On dématérialise soit, mais cela n'empeche pas que les documents doivent ressembler à ce qu'il devrait être
                Facture / Avoir / Bon de livraison etc …

                Pour l'instant c'est ce qu'il se fait, et il y en a encore beaucoup qui aime les traces papiers, ce n'est qu'a partir d'un certain volume que la dématérialisation est nécessaire.

                je crois qu'il est encore nécessaire de transmettre une forme papier dans certains colis

                Cela peut faire rire mais il y en a encore qui transmette des commandes par fax … parce qu'il fonctionne comme cela depuis des années et qu'on ne change pas une équipe qui gagne

                L'informatique de gestion, met tres longtemps a évoluer, c'est normal il faut des mois pour mettre en place un ERP, cela va de plus en plus vite, mais c'est l'humain qui limite pas la technologie.
                En moyenne un ERP c'est en place pour 7 ans, a valider ce chiffre je le repete depuis longtemps, mais je le vérifie aussi.

                Peut être qu'un nouvelle génération dERP comme odoo peut changer les choses, mais attention plus il y a d'utilisateurs et plus il y a un risque d'avoir des technophobes ou des personnes qui ne veulent pas changer.

                IL fut un temps on éditait un Bon de préparation pour déstocker le matériel, on corrigeait sur le bon le déstockage réel et on posait le tout dans un casier pour que cela soit saisie.

                Maintenant c'est pris en charge par un logiciel qui optimise le déplacement des magasiniers ou pire le magasin automatique se chargent de déposer sur un tapis le articles demandés

                Bref tout le monde ne va pas à la même vitesse …

                Et donc

                un générateur d'état se doit de générer plusieurs formats en fonction de la destination :
                => pdf / mail / HTML / csv / bureautique etc … et pour l'instant encore imprimante papier

                • [^] # Re: wkhtmltopdf

                  Posté par  (site web personnel) . Évalué à 3.

                  Ce n'est donc, même pas le besoin d'avoir un "état figé cloturé", qui pourrait être un simple fichier JSON signé, par exemple.

                  "La première sécurité est la liberté"

                  • [^] # Re: wkhtmltopdf

                    Posté par  (site web personnel) . Évalué à 2.

                    "état figé cloturé" : si cela n'a pas bougé depuis … le siècle dernier

                    il s'agit tout simplement d'un flag validé Oui/Non

                    Bon avec l'imbrication de quelques centaines de tables cela devient difficile de revenir en arrière
                    mais cela doit être possible.

                    Les seules fichiers JSON signé que je connaisse c'est les licences vendues par l'éditeur :)

              • [^] # Re: wkhtmltopdf

                Posté par  (site web personnel) . Évalué à 3.

                Le document généré n'est pas systématiquement imprimé. Il est en général envoyé par mail.

                • [^] # Re: wkhtmltopdf

                  Posté par  (site web personnel) . Évalué à 2. Dernière modification le 27 avril 2020 à 15:57.

                  ça cela doit venir de votre type de client

                  Existe t il une table un log dans odoo qui permet de savoir qui a fait quoi et quand ?

                  Sous X3 il s'agit de la table AESPION

                  Pour une migration, dans les années 90, j'ai voulu traiter les états par ordre d'utilisation et donc j'ai fait mes petites stats pour savoir quel était l'état le plus lancé / jour.
                  Et oh surprise c'était l'état des DEVIS avec (dans le années 90) plus de 40 fois/jour en moyenne pour une vingtaine d'utilisateurs je crois.

                  Juste pour dire que entre la perception que l'on a de l'utilisation d'un logiciel et la réalité
                  il peut y avoir de GROSSES différences

                  J'ai eu a étudier certain cas particulier ou il y a avait des milliers d'éditions quotidiennes
                  pour répartir la charge il fallait 40 imprimantes environ, mais le problème c'est que si l'état met 30 secondes pour sortir , mulitplié par 1000 = 30000 secondes = 8h donc il ne fallait pas prendre ce type d'édition à la légère.

                  • [^] # Re: wkhtmltopdf

                    Posté par  (site web personnel) . Évalué à 2.

                    Comme je le dis souvent : il faut se poser 2 questions quand on code :
                    Fréquence d'utilisation et volume de données

                    • [^] # Re: wkhtmltopdf

                      Posté par  (site web personnel) . Évalué à 3.

                      Cela me rappelle aussi l'histoire du client qui voulait une sortie papier pour un programme pour pouvoir recopier les valeurs sur une autre machine…

                      Parfois, la connaissance du client permet de lui faire éviter un tas de taches inutiles (intitulé "mais on a toujours fais comme ça" ou encore pire, dans la fonction hospitalière "ils sont payé pour ça").

                      "La première sécurité est la liberté"

                      • [^] # Re: wkhtmltopdf

                        Posté par  (site web personnel) . Évalué à 3.

                        J'ai arrêtée de faire du "projet" avec des utilisateurs
                        pour faire du "système" et me rapprocher des machines

                        En gros quand je parle avec des machines … au moins elles ont des réactions logiques et compréhensibles
                        c'est pas toujours le cas avec des utilisateurs "humains"

  • # Window size

    Posté par  . Évalué à 7.

    Ce qui est intéressant avec Firefox, c'est qu'on n'obtient pas une copie de ce qui apparaîtrait à l'écran, mais une copie de la page sur toute sa longueur !

    Il y a l'option --window-size:

    --window-size width[,height] Width and optionally height of screenshot.
    
    ./firefox -P screenshot --screenshot /tmp/test.png --window-size 800,600 https://linuxfr.org
    

    « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

  • # apt install chromium-browser

    Posté par  . Évalué à 1.

    Sous Ubuntu, Chromium doit être installé par snap

    Je suis sous Ubuntu 19.10 et j'ai chromium dans le dépôt universe. Il s'appelle chromium-browser.

  • # Un autre ;)

    Posté par  . Évalué à 3.

    Salut,

    Un petit autre dans la série : avant j'utilisais lynx, maintenant je suis passé à links quand je n'ai pas d'accès X "facile".

    C'était juste pour compléter la collec' des outils, rien de plus. ;)

    Matricule 23415

    • [^] # Re: Un autre ;)

      Posté par  (site web personnel) . Évalué à 2.

      Merci,

      voici la page de Links : http://links.twibright.com/

      Peux-tu nous dire pourquoi tu es passé de lynx à Links ? Quelles sont les différences principales ?

      • [^] # Re: Un autre ;)

        Posté par  . Évalué à 3.

        Salut,

        Peux-tu nous dire pourquoi tu es passé de lynx à Links ? Quelles sont les différences principales ?

        Euh, oula, ça va être compliqué ça, parce que ça fait un bon bout de temps que j'ai fait la "bascule" :)

        De mémoire (mais faut remonter un certain nombre d'années) : parce que links était plus agréable à utiliser sur certains sites et supportait mieux ncurses.

        En fait du coup, je viens de réinstaller lynx et ça a l'air d'avoir super progressé (dans le bon sens, je veux dire).

        Donc je ne saurais pas trop dire mis à part qu'il y a environ 20 ans je trouvais links plus… hmm… "ergonomique", si on peut dire ça d'un butineur en CLI.

        N'ayant du coup pas refait de lynx depuis un bout de temps, je vais éviter une comparaison hasardeuse, peut-être mal venue vu que je ne l'utilise plus, et biaisée.

        Mon petit commentaire c'était juste pour donner un outil de plus dans le genre ;)

        Matricule 23415

  • # Quelques autres brothers...

    Posté par  (site web personnel) . Évalué à 3.

    Dans Synaptic, je trouve aussi :

    Si vous les avez déjà utilisés, quels sont vos avis ?

    • [^] # Re: Quelques autres brothers...

      Posté par  (site web personnel) . Évalué à 1.

      Dans les options de w3m, je vois qu'il y a du choix en terme de dump :

      -dump dump formatted page into stdout
      -dump_head dump response of HEAD request into stdout
      -dump_source dump page source into stdout
      -dump_both dump HEAD and source into stdout
      -dump_extra dump HEAD, source, and extra information into stdout

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.