Le calepin du geek
Geek : Personne s’intéressant à des domaines pointus, avec une once de créativité.

Ceci est un site perso, dans le pur esprit web 1.0, compilant des notes diverses sur des thèmes d’intérêt. (Informatique, programmation, voyage à vélo, réflexions)

Automatisation d’internet explorer pour télécharger des fichiers dans une arborescence

autoit, automatisation internet explorer, télécharger sur plusieurs pages

Article mis en ligne le 13 juillet 2014
par aldoniel
Imprimer cet article logo imprimer

Ceci est une étude de cas de programmation (qui illustre mon niveau lamentable, mais néanmoins opérationnel).

 Utilité

Avec l’avènement des gestionnaires de contenu (SPIP...) de nombreux site proposent de télécharger des fichiers, en mettant chaque lien sur une page différente, en appelant chaque fichier par le même nom par défaut.

Par exemple certaines revues en ligne proposent de télécharger la copie numérique aux abonnés, mais découpent la revue en plusieurs dizaines de pdf (20,40, 50...), avec un lien accessible après plusieurs clics pour télécharger le pdf, qui doit ensuite être renommé à la main. Cette manoeuvre fastidieuse occupant au moins 1 mn par fichier semble être là pour empêcher le piratage... (allez télécharger 400 fichiers ainsi sans erreur alors même que vous les avez payés...)

 Exemple choisi

  • Je présente un exemple d’automatisation sur Deutsch – Warum nicht ?, cours en ligne d’allemand commentés en anglais sur Deutsche Welle. Cours gratuits assez complet de très bonne qualité pour les anglophones au passage.

(Évidemment, exemple facilement transposable sur EMC consult par ex.)

Les pdf des cours sont sur 4 pages ( http://www.dw.de/learn-german/deutsch-warum-nicht-series-1/s-2549 ) et suivantes. Par commodité, je fais 4 copier-coller dans 4 html pour économiser du code inutile. (cf zip ci-joint)

Zip - 6.5 ko
4 fichiers html des liens de DW
  • Autoit est le langage de script. C’est juste le meilleur script windows. Puissant, gratuit, peu verbeux, s’apprend en plus ou moins deux jours, inspiré du basic puis du c, s’interface avec à peu près tout ce qui existe sous windows. Là, on pilote internet explorer en 42 lignes de code seulement. En c, 4 pages n’y suffiraient pas.

Les fonctions de ce script utilisent l’UDF (User defined functions) IE.au3 qui a pour but d’automatiser IE en se branchant sur son interface COM.

L’aide de cet UDF s’affiche avec le code suivant

#include <IE.au3>
_IE_Introduction([$s_module = "basic"])

(extrait de l’aide générale d’autoit index _IE_Introduction)

 Avant de commencer

  • apprendre à programmer avec autoit...
  • comprendre un peu le fonctionnement de l’UDF IE.au3 en jouant avec l’outil IE builder conseillé dans l’aide et conçu pour cet UDF (même si je ne m’en suis pas servi ici).
  • contourner un bug introduit par les nouvelles sécurités d’IE qui casse les anciennes interfaces COM.

Documentation d’autoit :

New security in Windows Vista [and Windows 8] causes a new browser window to be created when a browser is instructed to navigate to a URL in a different security zone. This occurs as well with the initial creation and navigation initiated with _IECreate. The new window is a new browser instance and the previous browser object variable no longer points to it. There are several workarounds : 1) add #RequireAdmin to your code (this is required even if the account is part of the Administrator’s Group and will propmt for credentials if necessary), 2) use _IEAttach to connect to the new browser window 3) add the target website to the Trusted Sites security zone in IE, 4) turn off "Protected Mode" in IE, or 5) disable UAC. Care must be taken to understand the implications of disabling IE security features when accessing untrusted sites.

En pratique, on obtient des erreurs "run time" incompréhensibles vers les sources de l’UDF.
Le mieux à mon avis est de désactiver le mode protégé dans les options d’IE temporairement.

 Code commenté

Bon, hem... à peu près toutes les mauvaises habitudes de programmation (écrire en vrac sans fonctions, tester une erreur sur deux, aucune optimisation), sont là... mais ce code n’a pas vocation à être maintenu ni à être rapide.

(code Autoit v3.3.8.1)

#include <IE.au3>
#include <Array.au3>

For $i = 1 To 4
    DirCreate(@ScriptDir & "\" & $i) ;créer des sous répertoires dans le répertoire du script pour stocker les pdf
    Local $oIE = _IECreate(@ScriptDir & "\" & $i & ".html") ; créer un objet IE et naviger
    $oLinks = _IELinkGetCollection($oIE) ; obtenir la liste des liens dans une collection d'objets
    If @error Then MsgBox(0, "err", "_IELinkGetCollection")
    Local $iNumLinks = @extended
    Local $liens1[1]
    For $oLink In $oLinks
        _ArrayAdd($liens1, $oLink.href) ; extraction des liens en texte depuis les objets vers un tableau (un problème indéterminé fait que mes objets ont l'air de mourir après la navigation)
    Next
    For $k = 1 To $iNumLinks
        _IENavigate($oIE, $liens1[$k]) ; naviger vers chaque lien obtenu dans une boucle

        $oLinks2 = _IELinkGetCollection($oIE)
        Local $array[1]
        For $oLink2 In $oLinks2
            _ArrayAdd($array, $oLink2.href) ; obtenir une liste complète des liens de la page
        Next
        $pdflink = ""
        For $j = 1 To UBound($array) ; et en isoler le lien vers le pdf
            If StringInStr($array[$j], ".pdf") Then
                $pdflink = $array[$j]
                ExitLoop
            EndIf
        Next
        If $pdflink <> "" Then
            $title = _IEPropertyGet($oIE, "title") ; obtenir un nom intelligent pour le pdf à partir du titre de la page
            $title = StringSplit($title, " | ", 1)
            If @error Then
                ConsoleWriteError("StringSplit error" & @CR)
                ExitLoop
            EndIf
            $title = $title[1]
            $title = StringRegExpReplace($title, "[\\/:*?«<>|]", "") ; enlever les éventuels caractères interdits dans un nom de fichier
            ;MsgBox(0,$title,$pdflink)
            InetGet($pdflink, @ScriptDir & "\" & $i & "\" & $title & ".pdf") ; téléchargement direct du lien par autoit sans passer par IE
        EndIf
    Next
    _IEQuit($oIE) ;fermer la fenêtre IE
Next

 Résultats

Pour ceux qui voulaient juste les pdf de Deusche Welle ils sont en miroir là

Juste pour info, je récupère les mp3 via la liste RSS et winamp qui fait ça très bien (oui, je sais que je suis un dino de l’informatique et que ce logiciel n’existe plus !)

A télécharger

  • 4 fichiers html des liens de DW
  • 6.5 ko / Zip

Dans la même rubrique



Site réalisé sous SPIP
avec le squelette ESCAL-V3
Version : 3.70.61