VB.NET redirect obtener todos los enlaces

Iniciado por PotatoWith, 10 Agosto 2019, 21:36 PM

0 Miembros y 1 Visitante están viendo este tema.

PotatoWith

Hola que tal amigos espero que estén muy bien    ::)
Hoy me encuentro con un problema para mi ya que estoy tratando de chequear con VISUAL BASIC los enlaces(Links) por los cuales pasa mi Webbrowser después de enviar un formulario.
Al hacer click mi webbrowser pasa por un redireccionamiento de  3 enlaces ejemplo
Hago click en submit luego pasa esto  navega a  ( Google1.com .. redirecciona a Google2.com y termina en Google3.com ) .
No logro identificar el enlace Google2.com con el siguiente codigo


Código (csharp) [Seleccionar]
If WebBrowser1.Url.ToString.Contains("PARTE DE MI ENLACE WEB") Then
probando y probando solo esta validación puede recolectar   el inicio : Google1.com  y el final  Google3.com .

Pero el enlace Google2.com no lo logra detectar

Quisiera saber si existe alguna manera de como detectar 1 o todos los enlaces con una validacion parecida a esta



Desde ya muchas gracias  ;-)

Eleкtro

#1
Prueba añadiendo un controlador para el evento WebBrowser.Navigating...

Código (vbnet) [Seleccionar]
Public Class Form1

   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
       Dim urls As String() = {"google.co.jp", "google.co.uk", "google.es", "google.com"}
       For Each url As String In urls
           Me.WebBrowser1.Navigate(url)
       Next
   End Sub

   Private Sub WebBrowser1_Navigating(sender As Object, e As WebBrowserNavigatingEventArgs) Handles WebBrowser1.Navigating
       Console.WriteLine($"Starting navigation: {e.Url}")
       Me.ValidateUri(e.Url)
   End Sub

   Private Sub WebBrowser1_Navigated(sender As Object, e As WebBrowserNavigatedEventArgs) Handles WebBrowser1.Navigated
       Console.WriteLine($"Completed navigation: {e.Url}")
   End Sub

   Private Sub ValidateUri(uri As Uri)
       If uri.AbsoluteUri.Contains("PARTE DE MI ENLACE WEB") Then
           ' ...
       End If
   End Sub

End Class




Saludos.








PotatoWith

Hola Eleкtro el codigo funciona a la perfección ahora puedo detectar los redirect en mi webbrowser  :D
Con esta validacion + tu codigo!
Código (csharp) [Seleccionar]
If uri.AbsoluteUri.Contains("PARTE DE MI ENLACE WEB") Then

Lo unico malo, es que creo que esta validación  duplica o agarra 2 veces el enlance (Links) ya que me manda  2 MenssageBox  :xD no se si sera eso o algún desastre en mi código
Código (csharp) [Seleccionar]
        If uri.AbsoluteUri.Contains("PARTE DE MI ENLACE WEB") Then
MessageBox.Show("Entrando a la web.")
        End If


Aunque en la consola veo que se duplican muchas veces los enlaces(links) ni idea porque sera


Igual pasa con los Completed navigation: hasta 4 veces se duplican  :silbar:

Muchas gracias la verdad por tomarte tu tiempo para darme un buen ejemplo ! es digno de admirar  ;-)

@XSStringManolo


PotatoWith

Hola string Manolo gracias por responder resulta que el código
Código (csharp) [Seleccionar]
If uri.AbsoluteUri.Contains("PARTE DE MI ENLACE WEB") Then
Siempre esta a la escucha eso esta bien por una parte y por otra no ya que como muestro en la imagen la pagina hay veces que carga el mismo link 3 o 4 veces



Cuando pasa mi link por este codigo
Código (csharp) [Seleccionar]
If uri.AbsoluteUri.Contains("PARTE DE MI ENLACE WEB") Then
Valida el
Código (csharp) [Seleccionar]
MessageBox.Show("Entrando a la web.") 3 o 4 tantas veces logre aparecer

Ya probe un WebBrowser.DocumentCompleted y sigue apareciendo muchas veces el link en mi consola

Eleкtro

#5
Según la documentación de Microsoft:

   WebBrowser.Navigating event:
       Occurs before the WebBrowser control navigates to a new document

   WebBrowser.Navigated event:
       Occurs when the WebBrowser control has navigated to a new document and has begun loading it.
       ...
       Handle the DocumentCompleted event to receive notification when the WebBrowser control finishes loading the new document.

   WebBrowser.DocumentCompleted event:
       Occurs when the WebBrowser control finishes loading a document
       ...
       Handle the DocumentCompleted event to receive notification when the new document finishes loading. When the DocumentCompleted event occurs, the new document is fully loaded

En resumen, el orden de desencadenamiento de eventos es el sigueinte:

1. WebBrowser.Navigating: cuando comienza la navegación a "X" url.
2. WebBrowser.Navigated: cuando comienza la carga del documento html en la página a navegar.
3. WebBrowser.DocumentCompleted: cuando finaliza la carga del documento html en la página a navegar.

Como no hay tiempo suficiente para que comience la carga del documento html en el ejemplo de código que compartí más arriba, el evento Navigating se dispara para todas las urls, mientras que el evento Navigated se dispara solamente para la última url como puedes comprobar en la imagen que compartí. Si quieres obtener la url de todas las redirecciones antes de que comience la carga del documento para validar/filtrar la url y poder cancelar la navegación o lo que pretendas hacer, entonces deberías seguir usando el evento Navigating como en el ejemplo de código que mostré.




Cita de: PotatoWith en 12 Agosto 2019, 01:05 AMYa probe un WebBrowser.DocumentCompleted y sigue apareciendo muchas veces el link en mi consola

Para serte sincero, no tengo un gran domino en cosas relacionadas con la programación a nivel web, cosas de html y de páginas web en general, de hecho, de vez en cuando a mi también me surjen algunas dudas con ciertos aspectos del componente WebBrowser. Lo que puedo decirte es que el evento DocumentCompleted puede dispararse múltiples veces, ya que una página puede contener iframes que desencadenen el evento, pero por otro lado el evento Navigating y Navigated solamente debería dispararse una vez por cada url... ¿pero tu dices que no es así?.

De cualquier manera, siempre existe la solución rudimentaria de declarar una variable booleana para evitar, o mejor dicho ignorar múltiples desencadenamientos del mismo evento. Es decir, la primera vez que se dispare el evento DocumentCompleted, le asignarías un valor True a dicha variable, y si se vuelve a disparar el evento solo tienes que comprobar si el valor de la variable es True o False; de esta forma evitas la repetición de tu "validación de url" por así decirlo donde usas esa condicional para comprobar si la url contiene cierta cadena de texto.

Saludos.








@XSStringManolo

En el for se hace el navigating a todas las url. En tu caso son 4. Entonces te muestra los 4 about:blank, en la propia salida del programa te dice starting navigating. Empezó la navegación a las 4 url.
Si lo único que te molesta es que aparezca la salida del programa repetida, elimina la línea Console.WriteLine($"Starting navigation: {e.Url}")
Que es la que imprime los about:blank. Igual te interesa empezar la navegación a cada url una por una. En ese caso mete los strings en un array y cuando quieras llamas al siguiente. Por ejemplo cuando se termine de cargar el documento sumas +1 al índice del array y lo imprimes, asi automatizas el proceso y cada vez que se finalice el load del documento se pasará a pedir el siguiente. Usa el método de la clase array con .getupperbound() para obtener una variable índice con el número total de elementos.
Deberías hacerlo de esta forma si vas a manejar un gran número de dominios, porque si no dependiendo del número de dominios y la propia implementación del navigate podría darse el caso de ir acomulándose más page:blank y documentos cargándose de los que se liberan. También deberías procesar el documento cargado nada más finalice la descarga para poder eliminar el documento cargado de memoria cuanto antes. Así optimizas el uso de memoria del programa. Aunque si la aplicación no va a hacer mucha locura tipo descargar documentos de 400 dominios, y procesarlos heavy da un poco igual xD

PotatoWith

Hola a todos y gracias nuevamente por estar al tanto sobre mi problema..
Eleкtro si eso me di cuenta sobre Navigating  Navigated

Para las redirecciones me funciona perfecto : Navigating las coje todas sin perder ni 1  ;-)

También pude observar que es problema del sitio web , que al momento de hacer la redireccion  envía varias veces  el mismo url  de redireccion (Probe con otro sitio web y no pasa)

Como pudieron observar soy muy pero muy nuevo con el tema de vb.net pero finalmente para este sitio web le encontre una solucion (Muy penosa y Vaga la verdad  :-[ ) Por falta de mis conocimientos sobre este tema ..

Lo que hice fue detener la navegacion al momento de que mi Webbrowser llegara al url de reddireccion y ahora solamente me aparece 1 Solo MenssageBox
Código (csharp) [Seleccionar]
MessageBox.Show("Entrando a la web.") Y solamente lo vuelvo a activar en otra parte de mi codigo mediante que el bucle hace su trabajo
Aca el codigo que use para que no aparecieran mas redirecciones

Código (csharp) [Seleccionar]
        If uri.AbsoluteUri.Contains("PARTE DE MI ENLACE WEB") Then
MessageBox.Show("Entrando a la web.")
                    WebBrowser1.AllowNavigation = False
                    '' aca sigo con mas codigo para continuar el bucle y vuelvo a activar WebBrowser1.AllowNavigation = True
        End If


Se que esta no es la mejor manera tal vez.. pero mientras valla adquiriendo mas conocimientos seguro que lo acomodare . Creo que seria bueno dejar este tema abierto para que otras personas puedan aportar soluciones sobre sitios web como este.. (Solo digo )  :P !

Muy agradecido por su soporte  :D