http://digilander.libero.it/Cenati

Batch Browser

home | e-mail e contatti | Introduzione al sito | Cosa e' e come imparare VbScript

 

 

 

 

 

Batch Browser

Questo è uno degli script che ho utilizzato di più da quando l'ho scritto. Fin dalla prima versione. Il tutto nasce dal fatto che ho una connessione dial-up e poco tempo libero.
Sono iscritto a diverse newsletter e frequento diversi gruppi di discussione. Spesso mi imbatto in messaggi del tipo "vedi questa pagina: http…".
Un esempio è la newsletter di UBC Fumetti, con le recensioni degli albi Bonelli. Ma anche alcune pagine di notizie aggiornate, oppure una home page da controllare periodicamente in attesa della pubblicazione di nuovi articoli (GuerreStellari.net, Star Trek, ecc).
Ho pensato allora di automatizzare l'apertura in Internet Explorer di diverse pagine in successione, contando di rivederle poi con calma dopo la disconnessione. Nella cronologia rimane infatti traccia di questi documenti, che possono essere navigati off-line.
Il funzionamento è semplice: nel file BatchBrowser2.txt vanno elencati, uno per riga, gli indirizzi da navigare. Con o senza http://, tanto se manca viene aggiunto dal programma.
Il file txt deve essere contenuto nella stessa directory dello script.


Semplicemente viene creata una istanza di Internet Explorer e, leggendo dalla lista contenuta nel file di testo, carica il primo indirizzo. Quando IE segnala di essere pronto (operazione completata), passa al secondo indirizzo, e così via.
Ho tentato diverse vie per cercare di salvare la pagina visualizzata, ma da uno script pare che sia molto difficile. E' possibile chiedere a IE di mostrare una finestra di "Salva con nome", ma questo interrompe il funzionamento in background dello script, nato invece per essere trasparente per l'utente. Inoltre questo metodo salva solo come htm e non come mht (htm con immagini incluse nello stesso file, ma più avanti in questa pagina vediamo come salvare in mht usando word).
Allora ho cambiato approccio ed ho usato l'oggetto xmlhttp unitamente ad ADODB.
XMLHTTP permette di recuperare un oggetto su internet senza passare da Internet Explorer. Dato che il documento potrebbe essere binario e non di puro testo, con ADODB intercetto il flusso di dati e lo salvo su un file. Questo permette di salvare anche documenti pdf, sempre a patto di conoscerne l'esatto indirizzo.
Il tutto viene fatto dalla funzione DownloadWithXMLHTTP (sSource, sDest) che può essere riutilizzata tale e quale per accedere ad un dato oggetto in rete.

Ecco alcuni esempi di righe valide nel file BatchBrowser2.txt:

www.ubcfumetti.com/nn/157_r.htm
http://www.ubcfumetti.com/nn/157.htm http://www.ubcfumetti.com/nn/157_personaggi.htm personaggi.htm http://www.ubcfumetti.com/nn/157_guerrachenonce.pdf Guerra.pdf

Nei primi due casi ritroverò nella cronologia (history) le pagina htm specificate con le immagini che contengono, esattamente come se avessimo utilizzato Internet Explorer per visitarle.

Nel terzo caso troverò il file personaggi.htm nella stessa cartella dello script, ma senza immagini in quanto la subroutine DownloadWithXMLHTTP scarica solo l'oggetto specificato. Avrò quindi il solo file html.

Analogamente l'ultimo esempio scarica il PDF e lo salva con un nome diverso nella cartella che contiene lo script. Lo stesso può essere fatto con qualsiasi file, binario o di testo, con qualsiasi estensione.

Perchè funzioni, questo programma necessita che sia registrata la libreria dinamica MSXML3.dll oppure MSXML4.dll (Microsoft XML Parser). Molto facilmente questa libreria è già presente nel vostro sistema, ma potrebbe essere stata rimossa da alcuni programmi di pulitura del registro. Perchè non si accorgono che questo script la usa.

Prima di passare allo script voglio illustrare queste poche righe che permettono di usare Word per salvare in formato mht (in un solo file ci sono sia il codice html che le immagini).

Il funzionamento è semplice. Mentre IE non permette di salvare in mht (tramite comandi esterni di uno script), Word riesce a farlo. Basta usare Word per aprire una pagina web e salvare il documento indicando il parametro corretto (wdFormatWebArchive) per forzare il formato di scrittura.

url = "http://www.yahoo.com"
path = "c:\yahoo.mht"
Const wdFormatWebArchive = 9
set word = createobject("Word.Application")
set doc = word.documents.open(url)
doc.saveas path, wdFormatWebArchive
doc.close
word.quit

Torniamo invece ora allo script oggetto di questo articolo, che non necessita di word.

Copia il programma riportato qui sotto in un file con estensione ".vbs" oppure scarica l'archivio zip contentente lo script.


         'BatchBrowser.vbs
         'Richiede le pagine web specificate in un file chiamato "BatchBrowser2.txt".
         'Apre il file, legge tutte le righe e le mette in un array.
         'Poi lancia Internet Explorer e richiede le singole pagine,
         'aggiungendo http se manca prima del nome del sito.
         'Le pagine caricate resteranno poi nella cronologia e potranno
         'essere visualizzate off-line. Non funziona con alcune pagine
         'create dinamicamente, a meno che siano l'ultima pagina caricata,
         'nel qual caso rimangono visualizzate al termine dello script.
         '[c] Cenati Giovanni 12.03.02 http://digilander.libero.it/Cenati
         'Codice vbs liberamente utilizzabile citando il sito.
         Dim oIE
         file = "BatchBrowser2.txt"
         title = "BatchBrowser - Cenati"
         set fso= createobject("Scripting.FileSystemObject")
         If fso.FileExists(file) Then
         Set txtStream = fso.OpenTextFile(file) ' Apre file di testo.
         txt = txtStream.ReadAll 'legge tutto il file
         txtStream.Close 'lo chiude
         lines = Split(txt, vbCrLf) 'Crea un array delle linee del file
         Else ' Termina.
         MsgBox "File '" & file & "' non trovato", vbOKOnly + vbCritical, Title 
         WScript.Quit 1 ' Termina con error code 1.
         End If
         ' Crea un oggetto Internet Explorer
         Set oIE = WScript.CreateObject("InternetExplorer.Application")
         ' Setta le proprietà della finestra del browser
         oIE.left = 20 ' La finestra 
         oIE.top = 50 ' in alto a sinistra,
         oIE.height = 380 ' piccola...
         oIE.width = 580
         oIE.menubar = 0 ' Senza menu
         oIE.toolbar = 0 ' né barra degli strumenti 
         oIE.statusbar = 0 ' né barra di stato per essere più riconoscibile.
         oIE.navigate("about:blank") ' Crea un documento HTML vuoto.
         oIE.visible = 1
         for i = 0 to ubound(lines)
           if trim(lines(i))<>"" then 'Se non è una riga vuota...
             URL=EstraiUrl( lines(i))
             Filename=EstraiFileName (lines(i))
             if FileName<>"" then 
               DownloadWithXMLHTTP URL, Filename
             else
               DownloadWithIE URL
             end if 'Filename non vuoto
           end if 'Riga non vuota
         next 'Passa alla prossima pagina
         set oIE=nothing
         '*** End
         msgbox "Fine Programma",VbInformation,Title
         wscript.quit
         Function EstraiUrl (riga)
         'Da una riga composta da URL[blank]FileName estrae la prima parte.
         'Se non c'é, aggiunge http prima del testo.
         if ucase(left(riga,7))<>"HTTP://" then 
           riga="HTTP://" & trim(riga) 'aggiunge "http://" se manca
         end if
         Separa = inStr(1,riga," ") 'Trova il primo spazio
         EstraiUrl=riga
         if Separa=0 then exit function 'Se non c'è lo spazio restituisce "riga"
         URL= left(lines(i),Separa-1) 'Prima dello spazio c'è l'URL
         EstraiUrl=URL
         end function
Function EstraiFileName(riga)
         Separa = inStr(1,riga," ") 'Trova il primo spazio
         EstraiFilename=""
         if Separa=0 then exit function 
         EstraiFileName= right(riga, len(riga)-Separa) 
         'Dopo lo spazio c'è il nome del file
         end function
Sub DownloadWithXMLHTTP (sSource,sDest)
         'Download a file using activeX Object XMLHTTP
         'and save to sDest using ADO Stream
         set oHTTP = WScript.CreateObject("Microsoft.XMLHTTP")
         oHTTP.open "GET", sSource, False
         oHTTP.send
         set oStream = createobject("adodb.stream")
         Const adTypeBinary = 1
         Const adSaveCreateNotExist = 1
         Const adSaveCreateOverWrite = 2
         oStream.type = adTypeBinary
         oStream.open
         oStream.write oHTTP.responseBody
         oStream.savetofile sDest, adSaveCreateOverWrite
         set oStream = nothing
         set oHTTP = nothing
         end sub
Sub DownloadWithIE(sURL)
         oIE.navigate(sURL) 'Richiede la pagina in internet
         Do While(oIE.Busy): WScript.Sleep 1000 :Loop 
         WScript.Sleep 1000
         Do While(oIE.Busy): WScript.Sleep 1000 :Loop 
         ' Aspetta che IE abbia caricato la pagina. Sleep libera risorse al sistema.
         ' Serve anche per aspettare le pagine che caricano altre pagine automaticamente.
         end sub

Giovanni Cenati.

 

 
 

© Cenati Giovanni 2004/2010 - http://digilander.libero.it/Cenati - Reventlov at Katamail com

home | e-mail e contatti | Introduzione al sito | Cosa e' e come imparare VbScript