Page 1 sur 1

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

Posté : dim. 21 févr. 2010 01:25
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.

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

Posté : mar. 23 févr. 2010 00:03
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 ?

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

Posté : mar. 23 févr. 2010 00:29
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. ;)

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

Posté : mar. 23 févr. 2010 11:56
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

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

Posté : mar. 23 févr. 2010 12:21
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 !

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

Posté : mar. 23 févr. 2010 20:38
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 ?

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

Posté : mar. 23 févr. 2010 21:13
par timmalos
Ca vient de l'encodage, regarde si tu peux encoder en ISO quelque chose

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

Posté : mar. 23 févr. 2010 22:51
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