2009-02-15 21 views
7

Escribió una pequeña aplicación que accede a un grupo de sitios web de búsqueda y coloca los resultados en un documento de Word, que se ejecuta unos cientos de veces al día.Verificar conexión a internet activa

Guarda los resultados de búsqueda individuales en varias carpetas locales para que la próxima vez que se busquen esas palabras, las capture localmente en lugar de cargar el sitio web nuevamente.

Esto funciona bien, aunque no es rápido. La gente está impresionada porque hasta hace unas semanas lo hacían manualmente al cargar literalmente seis sitios web de búsqueda diferentes, buscar y luego copiar y pegar los resultados en un documento de Word.

Sin embargo, el Internet de nuestra oficina no es confiable y ha estado inactivo el último medio día. Esto ha significado que se hayan guardado unas 400 búsquedas incorrectas en las carpetas locales y se hayan insertado en los documentos finales.

Cuando una persona estaba buscando, podían darse cuenta si Internet se había roto y harían sus búsquedas más tarde. Obviamente, sin embargo, esta aplicación no puede decirlo, y como no estoy usando APIs ni nada, y porque estoy limitado a usar el entorno VBA (ni siquiera tengo acceso a las herramientas MZ), necesito encontrar la manera de compruebe que Internet esté funcionando antes de continuar con el flujo del programa, sin depender de demasiadas referencias, y preferiblemente sin screencraping para la frase "404 Page Not Found".

No estoy muy familiarizado con VB, y VBA me está arruinando de muchas maneras, por lo que es probable que haya alguna manera fácil de hacerlo, por lo que estoy preguntando aquí.

Agradecer cualquier ayuda.

Respuesta

6

Se puede usar la biblioteca & su uso en clase XMLHttpRequest MSXML para comprobar si hay cosas

por ejemplo,

On Error Resume Next 
Dim request As MSXML2.XMLHTTP60 
request.Open "http://www.google.com" 
request.Send 
Msgbox request.Status 

El estado le dará el código de estado HTTP de lo que sucedió con la solicitud. Es posible que tenga que hacer más comprobaciones, según su situación.

Espero que ayude.

+1

No estoy seguro de cómo OP está obteniendo los resultados de búsqueda en Word, pero debería usar este método y request.responseText. –

+1

Necesito definir el parámetro Método abierto antes de la URL –

+0

dkusleika - Leí un poco sobre eso y tuve una obra de teatro, pero no tuve tiempo de aprender a analizar/manipular XML. La aplicación usa documents.open en su lugar. Es horrible, pero pasó de sugerencia a distribuida en una tarde, y no tiene mi nombre. Desafortunadamente no soy un programador :) – user51498

2

Por desgracia, esto es un poco de una pregunta difícil de responder por un par de razones:

  1. ¿Cómo se define una conexión a Internet que no funciona? ¿Verifica si hay una dirección IP válida? ¿Lanzas un ping? ¿Cómo sabes que tienes permisos para verificar estas cosas? ¿Cómo sabes que el cortafuegos/antivirus de la computadora no está causando un comportamiento inestable?
  2. Una vez que haya establecido que la conexión funciona, ¿qué debe hacer si la conexión se interrumpe durante la operación?

Probablemente haya maneras de hacer lo que quiera hacer, pero muchas cosas del tipo "el diablo en los detalles" tienden a aparecer. ¿Tiene alguna forma de verificar que la búsqueda guardada sea válida? Si es así, esa sería probablemente la mejor manera de hacer esto.

21

Obviamente, su problema tiene muchos niveles. Debería comenzar definiendo "conectado a Internet" y continuar desarrollando estrategias de respaldo que incluyan no escribir archivos no válidos en caso de falla.

En cuanto a la "Estoy conectado" pregunta, puede intentar aprovechar la API de Win32:

Private Declare Function InternetGetConnectedState Lib "wininet.dll" _ 
(ByRef dwflags As Long, ByVal dwReserved As Long) As Long 

Public Function GetInternetConnectedState() As Boolean 
    GetInternetConnectedState = InternetGetConnectedState(0&,0&) 
End Function 

Aunque (restricciones proxy/NAT/firewall, etc.) en función de la configuración de red, Windows podría tener una opinión diferente sobre esto que tú.

Tratando de OBTENER las páginas que le interesan, verificar el estado de devolución en los encabezados HTTP (tiempo de espera de puerta de enlace, 404, lo que sea que espere que suceda cuando "no funciona") también puede ser un camino por recorrer.

+0

recibo una excepción a esta divertida cuando se conecta a través de VPN, pero no en realidad en línea. Preguntándose si podría ser reforzado de alguna manera, pero en general es una solución genial y simple. – seegoon

2

Sobre la base de la respuesta de shakalpesh y los comentarios a la misma, hay (al menos) dos formas de obtener la página web en Word sin analizar el XML devuelto por el objeto XMLHTTP60.

(Nota: el código de estado HTTP 200 indica que "la solicitud ha tenido éxito" - ver here)

  • escribir la XMLHTTP60.ResponseText a un archivo de texto y luego llamar a Documents.Open en ese archivo de texto
If (xhr.Status = 200) Then 
    hOutFile = FreeFile 
    Open "C:\foo.html" For Output As #hOutFile 
    Print #hOutFile, xhr.responseText 
    Close #hOutFile 
End If 

// ... 

Documents.Open "C:\foo.html" 

Esto tiene la desventaja de que algunos elementos vinculados se pueden perder y se le obtener un cuadro de mensaje cuando el archivo se abre

  • comprobación del estado de las URL con el objeto XMLHTTP60 y luego usar Documents.Open para abrir la URL como antes:
If (xhr.Status = 200) Then 
    Documents.Open "http://foo.bar.com/index.html" 
End If 

que se presente una posibilidad de que la solicitud XMLHTTP60 podría tener éxito y el Documents.Open falla (o viceversa). Espero que esto debe ser un acontecimiento poco común, aunque

3

utilizar el siguiente código para comprobar si hay conexión a Internet primera v6.0 XML anable en sus referencias

Function checkInternetConnection() As Integer 
'code to check for internet connection 
'by Daniel Isoje 
On Error Resume Next 
checkInternetConnection = False 
Dim objSvrHTTP As ServerXMLHTTP 
Dim varProjectID, varCatID, strT As String 
Set objSvrHTTP = New ServerXMLHTTP 
objSvrHTTP.Open "GET", "http://www.google.com" 
objSvrHTTP.setRequestHeader "Accept", "application/xml" 
objSvrHTTP.setRequestHeader "Content-Type", "application/xml" 
objSvrHTTP.Send strT 
If err = 0 Then 
checkInternetConnection = True 
Else 
    MsgBox "Internet connection not estableshed: " & err.Description & "", 64, "Additt !" 
End If 
End Function 
Cuestiones relacionadas