[R] Enregistrer une page web en .mht avec Objet IE

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Morphee
Niveau 2
Niveau 2
Messages : 28
Enregistré le : mar. 16 févr. 2010 19:43
Status : Hors ligne

[R] Enregistrer une page web en .mht avec Objet IE

#1

Message par Morphee »

Voila un exemple que j'ai trouvé dans le Forum Anglophone Autoit qui me permet d'enregistrer une page web en .mht :

Code : Tout sélectionner

_INetGetMHT( "http://www.autoitscript.com/autoit3/index.shtml", "C:\test.MHT" )
Func _INetGetMHT( $url, $file )
    Local $msg = ObjCreate("CDO.Message")
    If @error Then Return False
    Local $ado = ObjCreate("ADODB.Stream")
    If @error Then Return False

    With $ado
        .Type = 2
        .Charset = "US-ASCII"
        .Open
    EndWith
    $msg.CreateMHTMLBody($url, 0)
    $msg.DataSource.SaveToObject($ado, "_Stream")
    FileDelete($file)
    $ado.SaveToFile($file, 1)
    $msg = ""
    $ado = ""
    Return True
EndFunc
Seulement voilà, je ne sais pas comment adapter cet exemple à mon script, je ne suis pas familiarisé avec la création d'objet comme ObjCreate("CDO.message") ou ObjCreate("ADODB.stream") (Mis à part, si quelqu'un sait par quoi il faut commencer pour se renseigner à ce sujet je suis preneur)

En fait, dans mon script j'utilise un objet IE que je créer comme ceci :

Code : Tout sélectionner

$oIE = _IECreate($sUrl,0,1)
Et je lui fait subir tout un tas d'opérations de navigation en le manipulant directement.

Et j'aimerais ensuite l'enregistrer en .mht bien sûr.
Mais je ne peux pas me baser sur l'URL comme dans l'exemple car celle-ci reste figé, elle n'évolue pas avec les opérations de navigation accomplies sur le site. (En manipulant $oIE)
D'où la nécessité d'utiliser directement l'objet $oIE pour enregistrer le fichier .mht ...

Mais comment faire ?

Merci.
Modifié en dernier par Morphee le mar. 23 févr. 2010 12:22, modifié 1 fois.
Morphee
Niveau 2
Niveau 2
Messages : 28
Enregistré le : mar. 16 févr. 2010 19:43
Status : Hors ligne

Re: [..] Enregistrer une page web en .mht avec Objet IE

#2

Message par Morphee »

Une petite piste à me donner au moins ?

J'ai vraiment besoin de faire ça, c'est important pour le travail que je fais :?

la Méthode .createMHTMLBody c'est quoi comme script au juste ? et DataSource.saveToObject ? c'est du VB ? Ou est-ce que l'on se renseigne à ce sujet ?
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Enregistrer une page web en .mht avec Objet IE

#3

Message par Tlem »

Pourquoi ne pas enregistrer votre objet IE dans un fichier html pour d'utiliser cette fonction pour le convertir ?
Certes, cela peut paraitre lourd, mais si ca fonctionne, au moins vous ferez ce dont vous avez besoin. ;)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
timmalos
Niveau 11
Niveau 11
Messages : 1970
Enregistré le : dim. 18 mai 2008 15:16
Status : Hors ligne

Re: [..] Enregistrer une page web en .mht avec Objet IE

#4

Message par timmalos »

En effet, sans connaitre mieux l'objet CDO.Message la solution de Tlem parait la meilleure.

Quand vous avez fini vos opérations, vous faites un _IEBodyReadHTML()
Puis FileWrite("fichier.html") puis vous appliquez votre fonction sur le fichier.html
Morphee
Niveau 2
Niveau 2
Messages : 28
Enregistré le : mar. 16 févr. 2010 19:43
Status : Hors ligne

Re: [..] Enregistrer une page web en .mht avec Objet IE

#5

Message par Morphee »

Oui mais la difficulté serait de pouvoir importer le contenu avec le fichier html (images, CSS...) (d'où l'intérêt du .mht)

En tout cas vous m'avez mis sur la bonne piste, et je pense avoir trouvé une solution. Merci a vous deux pour votre réponse ça me fait bien plaisir et me débloque d'une situation vraiment handicapante ! :wink:

Je posterais la solution que j'ai trouvé si ça peut aider quelqu'un d'autre.

Vu que c'est toujours le même site que j'enregistre, j'ai pré-téléchargé le squelette (images, CSS...)
Je vais enregistrer le fichier HTML dans ce squelette avec la fonction _IEBodyReadHTML() puis appliquer la fonction qui converti en .mht depuis le disque dur.

J'ai déjà fait quelques essai et on dirais que tout fonctionne bien :D

Merci !
Morphee
Niveau 2
Niveau 2
Messages : 28
Enregistré le : mar. 16 févr. 2010 19:43
Status : Hors ligne

Re: [R] Enregistrer une page web en .mht avec Objet IE

#6

Message par Morphee »

Voilà le script que j'ai fait en ayant au préalable enregistré le squelette, comme expliqué juste au dessus :

Pour faire le squelette, il suffit de regarder dans le code source de la page html. Généralement pour les images c’est : « /images/nom_image.gif » il faut donc créer un dossier « images », même chose avec css etc...
Une fois l’arborescence construite il ne manque plus qu’à sauver le fichier html du site :

Code : Tout sélectionner

$oIE = _IECreate("http://adresse_du_site.com",0,1)
_IELoadWait($oIE)
...
ici je manipule l'objet $oIE
...
Pour sauvegarder le site :

Code : Tout sélectionner

$fileHTML = _IEDocReadHTML($oIE)
If @error = 0 Then
   $fileHTML = "<!-- saved from url=(0027)http://adresse_du_site.com -->" & @CRLF & $fileHTML
   FileDelete("fichier.html")
   FileWrite("fichier.html",$fileHTML)
   ConsoleWrite($fileHTML)
EndIf

Local $msg = ObjCreate("CDO.Message")
If @error Then Exit
Local $ado = ObjCreate("ADODB.Stream")
If @error Then Exit
     With $ado
     .Type = 2
     .Charset = "US-ASCII"
     .Open
EndWith
$msg.CreateMHTMLBody(@ScriptDir & "\fichier.html", 0)
$msg.DataSource.SaveToObject($ado, "_Stream")
FileDelete("fichier.mht")
$ado.SaveToFile("fichier.mht", 1)
$msg = ""
$ado = ""
 

La ligne de code qui contient "<!-- saved from url=(0027)http://adresse_du_site.com -->" sert en faite à ne pas faire apparaitre le message de sécurité d’internet explorer quand on exécute un fichier local qui contient du Javascript.
Ca fonctionne bien sur le fichier html mais pas avec le mht !! :(
Je cherche toujours pourquoi car j’ai besoin que ça fonctionne sans avoir à modifier les paramètres de sécurité d’internet explorer. Si quelqu’un connait l’astuce ?

Pour plus d’infos :
https://www.adobe.com/fr/support/dreamw ... w_motw.htm
http://msdn.microsoft.com/en-us/library ... _Documents


D’autre part, j’ai des symboles bizarre à la place des lettres ponctué quand j’utilise la fonction _IEDocReadHTML($oIE)

Genre = Ã ¨ ©

Quelqu’un sait pourquoi ?
Avatar du membre
timmalos
Niveau 11
Niveau 11
Messages : 1970
Enregistré le : dim. 18 mai 2008 15:16
Status : Hors ligne

Re: [R] Enregistrer une page web en .mht avec Objet IE

#7

Message par timmalos »

Ca vient de l'encodage, regarde si tu peux encoder en ISO quelque chose
Morphee
Niveau 2
Niveau 2
Messages : 28
Enregistré le : mar. 16 févr. 2010 19:43
Status : Hors ligne

Re: [R] Enregistrer une page web en .mht avec Objet IE

#8

Message par Morphee »

j'ai trouvé la solution pour la ponctuation ici :

http://www.autoitscript.com/forum/index ... opic=92061

Ces fonctions servent a convertir un texte, j'utilise la première fonction et ça marche.

Code : Tout sélectionner

; string conversion: ANSI (default or given code page) --> UTF-8
Func _AnsiToUtf8($AnsiString, $CodePage = 0)
Local $struct = _WinAPI_MultiByteToWideChar($AnsiString, $CodePage)
Return(_WinAPI_WideCharToMultiByte(DllStructGetPtr($struct), 65001))
EndFunc

; string conversion: ANSI (default or given code page) --> UTF-16
Func _AnsiToUtf16($AnsiString, $CodePage = 0)
Local $struct = _WinAPI_MultiByteToWideChar($AnsiString, $CodePage)
Return($struct)
EndFunc

; string conversion: UTF-8 --> ANSI (default or given code page)
Func _Utf8ToAnsi($Utf8String, $CodePage = 0)
Local $struct = _WinAPI_MultiByteToWideChar($Utf8String, 65001)
Return(_WinAPI_WideCharToMultiByte(DllStructGetPtr($struct), $CodePage))
EndFunc
Répondre