IP PUBBLICO DINAMICO ver. 1.2
08.02.2016 11:05
Per poter sempre sapere il proprio ip dinamico ci sono vari sistemi.
Tempo fa alcuni siti come dyndns permettevano gratuitamente di registrarsi e di sapere sempre il proprio ip, ma ad oggi i migliori sono a pagamento.
Altri sono gratuiti, ma i router non permettono la parametrizzazione di questi siti all'interno dell'interfaccia.
Per ovviare a questo problema, in collaborazione con un amico, pubbichiamo di seguito uno script in Vbs, che lanciato su un pc e lasciato girare in background, permette di ricevere una mail con il proprio indirizzo ip pubblico. Inoltre ad ogni variazione di quell'ip, una nuova mail aggiornata sarà spedita.
Il batch gestisce anche l'errore dovuto a una perdita di connessione internet e al ripristinarsi, se l'indirizzo ip è cambiato, sarà inviata una nuova mail.
Ogni controllo che fa lo script, viene tracciato in un file di log.
Lo script funziona con un account gmail, di seguito la procedura:
e permettere allo script di utilizzare il proprio indirizzo gmail per mandare la mail a se stessi.
Sarà sufficiente consentire "si" all' "Accesso per app meno sicure".
Vi arriverà da google una mail di notifica dopo aver confermato questa opzione.
2. Copiare in un file di testo il seguente codice e chiamarlo sendIP.vbs
--------------------------------------------------
'****SendIP v1.2
'****Configura posta - SOLO GMAIL per il mittente (altrimenti cambia anche smtp.gmail.com)
'****abilita su GMAIL https://www.google.com/settings/security/lesssecureapps
Const fromEmail = "xxxxxxxxxxx@gmail.com"
Const password = "xxxxxxxxxx"
Const toEmail = "xxxxxxxxxxxxx@gmail.com"
Const checkmin = 1 'intervallo di controllo in minuti
'****fine configura posta
'variabili
Dim strresponse
Dim strIP
Dim strIPprevious
Dim emailObj, emailConfig, content, i
Dim http : Set http = CreateObject( "MSXML2.ServerXmlHttp" )
Set oWSH = CreateObject("WScript.Shell")
vbsInterpreter = "cscript.exe"
i = 1
'inizio
Call ForceConsole()
printf "SendIP v1.2"
strIP=""
strIPprevious=""
Do
prdata
printf "Check numero: " & i
'cerco IP
On Error Resume Next
http.Open "GET", "https://icanhazip.com", False
'http.Open "GET", "https://localhost/", False
http.Send
'Gestisco l'errore
If Err.Number <> 0 then
'errore
Messaggio = GestisciErrore(Err.Number, Err.Description)
prdata
printf Messaggio
'sendthemail Messaggio,"warning"
Else
'nessun errore
strresponse = http.responsetext
If IsValidIPAddress(strresponse) then
prdata
printf "risposta: " & strresponse
strIP = strresponse
'check If the IP is changed after the first time before to send the email
'If strIP <> "" and strIP <> strIPprevious then
if strIP <> strIPprevious then
'yes, IP is changed
'reset del flag
prdata
printf "invio IP " & strIP
sendthemail strIP,"IP"
Else
'warning IP is not changed with timestamp
prdata
printf "L'IP è sempre " & strIP & ", nessuna mail spedita"
End If
Else
'problems with https://icanhazip.com
prdata
printf "https://icanhazip.com non è disponibile"
'sendthemail "https://icanhazip.com non è disponibile","warning"
End If
End If
Err.Clear
'Wscript.Echo strIP
prdata
printf "In attesa nuovo check"
wait(checkmin)
i = i + 1
Loop
Set http = Nothing
Set strresponse = nothing
'fine
Sub sendthemail (content,tipo)
Set emailObj = CreateObject("CDO.Message")
emailObj.From = fromEmail
emailObj.To = toEmail
emailObj.Subject = "myIPaddress"
emailObj.TextBody = content
Set emailConfig = emailObj.Configuration
emailConfig.Fields("https://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.gmail.com"
emailConfig.Fields("https://schemas.microsoft.com/cdo/configuration/smtpserverport") = 465
emailConfig.Fields("https://schemas.microsoft.com/cdo/configuration/sendusing") = 2
emailConfig.Fields("https://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
emailConfig.Fields("https://schemas.microsoft.com/cdo/configuration/smtpusessl") = true
emailConfig.Fields("https://schemas.microsoft.com/cdo/configuration/sendusername") = fromEmail
emailConfig.Fields("https://schemas.microsoft.com/cdo/configuration/sendpassword") = password
emailConfig.Fields.Update
On Error Resume Next
emailObj.Send
'Gestisco l'errore
If Err.Number <> 0 then
prdata
printf "Non è stato possibile inviare la email"
Call GestisciErrore(Err.Number, Err.Description)
Else
if tipo = "IP" then
prdata
printf "Nuovo IP "&strIP&" spedito"
strIPprevious=strIP
End If
End If
Err.Clear
'Wscript.Echo "Invio email"
Set emailobj = nothing
Set emailConfig = nothing
End Sub
Function ForceConsole()
If InStr(LCase(WScript.FullName), vbsInterpreter) = 0 Then
oWSH.Run vbsInterpreter & " //NoLogo " & Chr(34) & WScript.ScriptFullName & Chr(34)
WScript.Quit
End If
End Function
Function printf(txt)
WScript.StdOut.WriteLine txt
End Function
Function printl(txt)
WScript.StdOut.Write txt
End Function
'funzione pausa
Function wait(n)
WScript.Sleep Int(n * 60000) 'minuti
End Function
'stampa data
Function prdata()
strSafeDate = Right("0" & DatePart("d",Date), 2) &"-"& Right("0" & DatePart("m",Date), 2) &"-"& DatePart("yyyy",Date)
strSafeTime = Right("0" & Hour(Now), 2) &":"& Right("0" & Minute(Now), 2) &":"& Right("0" & Second(Now), 2)
printl strSafeDate & " " & strSafeTime & " "
End Function
'La procedura per la gestione dell'errore, stampa data e messaggio
Sub GestisciErrore(NumeroErrore, DescrizioneErrore)
'compongo il messaggio
Messaggio = "Errore nell'applicazione" & vbCrLf
Messaggio = Messaggio & "Numero errore: " & NumeroErrore & vbCrLf
Messaggio = Messaggio & "Descrizione Errore: " & DescrizioneErrore
prdata
printf Messaggio
GestisciErrore = Messaggio
End Sub
Function IsValidIPAddress (strIPAddress)
On Error Resume Next
Dim varAddress, n , lCount
if strIPAddress is not null and strIPAddress<>"" then
varAddress = Split(strIPAddress, ".",-1, 1)
'//
If IsArray(varAddress) Then
For n = LBound(varAddress) To UBound(varAddress)
lCount = lCount + 1
varAddress(n) = CByte(varAddress(n))
Next
'//
IsValidIPAddress = (lCount = 4)
End If
else
IsValidIPAddress=False
end if
'//
On Error GoTo 0
End Function
--------------------------------------------------
3. Modificare indirizzo e-mail e password di accesso a gmail, ovviamente l'indirizzo email di spedizione dovrà essere quello che avete autorizzato all'accesso ad "Accesso per app meno sicure"
4. Creare un file run.bat con scritto:
------------------------------
cscript sendIP.vbs > sendIP.log
------------------------------
5. depositare entrambi i file nella stessa cartella
6. Lanciare run.bat
7. il log verrà generato nello stesso percorso dei due file creati con il nome di sendIP.log e verrà sovrascritto ad ogni riavvio dello script.