Autor Tema: Ir al final de una web.  (Leído 8192 veces)

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

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Ir al final de una web.
« en: Mayo 23, 2012, 04:07:56 am »
Buenas.
Tengo este inconveniente.
con shellExecute abro una web:

ShellExecute hWnd, vbNullString, "http://www.mipagina.com", vbNullString, vbNullString, SW_SHOWNORMAL

Abro el browser y carga la web, perfecto.

Pero dado que algunas paginas que estoy consultando son extensas necesito ir al final de la pagina ¿como puedo resolverlo?
Probé con mandarle luego de la linea del shellExecute:
SendKeys "{END}" 

pero no me envia al final, no hace nada. Luego puse:
SendKeys "{END}", 1000 para darle tiempo pero nada.

¿Que estoy haciendo mal?

Gracias

Me encuentras en YAcosta.com

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:Ir al final de una web.
« Respuesta #1 en: Mayo 23, 2012, 06:45:44 am »
Hola Yvan mira se me ocurre pero no se si es tu caso, porque no usar las anclas, # , segun la web que pones de ejemplo parece ser tulla http://www.mipagina.com asi que parece que no abria problema ya que se las podes agregar, entonces en el shell execute pones http://www.mipagina.com#articulos donde #articulos es tu ancla

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Ir al final de una web.
« Respuesta #2 en: Mayo 23, 2012, 11:54:00 am »
Hola Lea gracias.

Pero, que pasa si no se cual es el articulo porque este recién se ha creado o porque otro usuario lo ha creado, estoy usando el control ucLabelItem de tu proyecto LectorRSS entonces en el clik tengo esto:

ShellExecute Me.hWnd, vbNullString, ucLblitem2(Index).Tag, vbNullString, "C:\", SW_SHOWNORMAL

Por ejemplo, si en ucLblitem2(Index).Tag tengo:
http://www.forosperu.net/showthread.php?t=322306
donde le pongo la almohadilla? hice pruebas y no me lleva al final ¿que estoy haciendo mal?
« última modificación: Mayo 23, 2012, 12:10:59 pm por YAcosta »
Me encuentras en YAcosta.com

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Ir al final de una web.
« Respuesta #3 en: Mayo 23, 2012, 12:52:03 pm »
lo que podes hacer, es simplemente es un scroll hasta el final.

Código: (vb) [Seleccionar]
Private Sub Command1_Click()
    WebBrowser1.Document.parentWindow.scrollTo 0, 50000
End Sub

Private Sub Form_Load()
    WebBrowser1.Navigate "http://leandroascierto.com/blog/"
End Sub

saludos.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Ir al final de una web.
« Respuesta #4 en: Mayo 23, 2012, 01:06:12 pm »
Hola sebas, estoy escribiendo desde el móvil y quizá me equivoque pero ti cdigo ufá el scontrol webbrowser... Y no estoy usando ese control ya que abro la web en el navegador y no en la aplicación
Me encuentras en YAcosta.com

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Ir al final de una web.
« Respuesta #5 en: Mayo 23, 2012, 03:36:07 pm »
claro, perdon no lei bien, bueno para eso podes usar esto:

Código: (vb) [Seleccionar]
Option Explicit

Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal winHandle As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Private Const EM_SCROLL = &HB5
Private Const SB_BOTTOM = 7
Private Const SB_TOP = 6

Private Sub Command1_Click()
    SendMessage &H4065C, EM_SCROLL, SB_BOTTOM, 0
End Sub

eso lo que hace es scrollar cualquier ventana con scrollbars, para arriba o para abajo, solo tenes que saber el handle de esa ventana, por lo cual yo usaria para ejecutar el explorador, la api CreateProcess asi podes saber el handle con el que se crea la ventana padre, ya que ShellExecute no devuelve el handle de la ventana, probalo con el bloc de notas por ejemplo y vas a ver que funciona. el tema es si tiene pestañas ahi ya no se como actua esto.

saludos.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Ir al final de una web.
« Respuesta #6 en: Mayo 24, 2012, 02:18:49 am »
Me perdí doc, he buscado sobre CreateProcess y me maree con el código de ese tema y no entendí como aplicarlo.

Volveré a insistir con el tema de # a ver si me funca.

Gracias igual

Claro que si tienes un poco de time y me sueltas una explicadita de eso te agradeceria.

Saludos
Me encuentras en YAcosta.com

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:Ir al final de una web.
« Respuesta #7 en: Mayo 25, 2012, 07:52:12 am »
Hola yvan si no tome en cuenta una web dinámica, tal como lo es un foro, y tu problema es que no sabes cual es la ultima ancla, hasta el dia de hoy el ultimo post es el 10 por lo que la url seria http://www.forosperu.net/showthread.php?t=322306#10
pero de no encontrar la forma de averiguar el ancla del ultimo post no se me ocurre otra solución elegante,

no se en que lo vas a usar esto y que tan importante sea pero por tirarte una solución, es que primero descargues el html de la web y parses el contenido y averguies cual fue el ultimo post, con lo que hay consigues el ultimo ancla.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Ir al final de una web.
« Respuesta #8 en: Mayo 25, 2012, 02:26:55 pm »
Correcto Leandro, es ese el problema que tengo de no saber cual es el ultimo post, porque luego seran 12 o 15.

¿Todo esto es porque es un problema del RSS?? porque el aplicativo tuyo si trae el titulo y el ultimo post, entonces revise porque y vi que el rss de tu foro si trae el ultimo post del tema que se trata, tu usas este:

http://www.leandroascierto.com.ar/foro/index.php?type=rss;action=.xml

Cuando reviso en el foro que quiero aplicar (en el del otro ya no lo hare por otros temas) obtengo este rss:

http://www.forum.planetnoize.com/index.php?p=/discussions/feed.rss
y me funciona pero me trae el titulo y el primer post.

Entonces a diferencia del tuyo tu rss ya trae los enlaces con# y por eso que al darle clic nos lleva al ultimo post lo que no sucede en mi caso.

Pregunta
¿Es un problema de la fuente? de que no tenga el rss bien creado o es que yo no estoy invocando el rss correcto porque probe con http://www.forum.planetnoize.com/index.php?type=rss;action=.xml y me da error en el contenido.

Gracias amigo
Me encuentras en YAcosta.com

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:Ir al final de una web.
« Respuesta #9 en: Mayo 25, 2012, 02:58:33 pm »
Hola Yvan bueno, creo que es porque la fuente no te lo permite, pero bueno lleyendo este post entiendo lo que quieres hacer y es mas facil, pero bueno yo hice un ejemplo un poco mas generalizado , es decir no solo para el foro de planetnoize si para algo un poco mas generalizado, claro que si vos queres lo optimizas para tu necesidad.
bien la idea es como te dije obtener el html y ubicar la ultima ancla, aqui el code


Código: (vb6) [Seleccionar]
Option Explicit
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Const SW_SHOWNORMAL = 1


Private Sub Form_Load()

    Dim sUrl As String

    sUrl = "http://www.forum.planetnoize.com/index.php?p=/discussion/155/abrir-planetnoize-para-saber-si-hay-mensajes"
   
    sUrl = sUrl & GetLastAnchor(sUrl)

    ShellExecute Me.hwnd, vbNullString, sUrl, vbNullString, "C:\", SW_SHOWNORMAL

End Sub


Private Function GetLastAnchor(ByVal sUrl As String) As String
    On Error Resume Next
    Dim m_Inet As Object
    Dim HtmlDOC As Object
    Dim iLast As Integer
    Dim i As Long
   
   
    Set m_Inet = CreateObject("MSXML2.ServerXMLHTTP")
    m_Inet.open "GET", sUrl, False

    m_Inet.send
   
    If m_Inet.Status = 200 Then

        Set HtmlDOC = CreateObject("htmlfile_FullWindowEmbed")
        HtmlDOC.body.innerHTML = StrConv(m_Inet.responseBody, vbUnicode)

        iLast = HtmlDOC.anchors.length - 1
       
        For i = iLast To 0 Step -1
            If Left$(HtmlDOC.anchors.Item(i).id, 9) = "postcount" Then
                If Len(HtmlDOC.anchors.Item(i).Name) > 0 Then
                    GetLastAnchor = "#" & HtmlDOC.anchors.Item(i).Name
                End If
                Exit Function
            ElseIf Left$(HtmlDOC.anchors.Item(i).id, 3) = "msg" Then
                GetLastAnchor = "#" & HtmlDOC.anchors.Item(i).id
                Exit Function
            ElseIf Left$(HtmlDOC.anchors.Item(i).Name, 4) = "post" Then
                GetLastAnchor = "#" & HtmlDOC.anchors.Item(i).Name
                Exit Function
            End If
        Next

        For i = iLast To 0 Step -1
            If InStr(HtmlDOC.anchors.Item(i).href, "#") > 0 Then
               GetLastAnchor = Mid$(HtmlDOC.anchors.Item(i).href, InStr(HtmlDOC.anchors.Item(i).href, "#"))
               If GetLastAnchor <> "#" Then Exit Function
            End If
        Next

        If iLast > -1 Then
            If Len(HtmlDOC.anchors.Item(iLast).id) > 0 Then
                GetLastAnchor = "#" & HtmlDOC.anchors.Item(iLast).id
            ElseIf Len(HtmlDOC.anchors.Item(iLast).Name) > 0 Then
                GetLastAnchor = "#" & HtmlDOC.anchors.Item(iLast).Name
            End If
        End If

    End If
     

End Function

Saludos, ahora voy a ver ese programa que estas haciendo.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Ir al final de una web.
« Respuesta #10 en: Mayo 25, 2012, 03:00:13 pm »
Genial amigo, voy a estudiar el tema al toque

Muchas gracias.
Me encuentras en YAcosta.com

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Ir al final de una web.
« Respuesta #11 en: Mayo 25, 2012, 04:03:24 pm »
Bien, al menos ya puedo ir al ultimo post publicado. Lastima no poder lograr que se vea en el programa ese ultimo post pero con esto al menos ya tengo resuelto lo de la web

Muchas gracias Leandro
« última modificación: Mayo 25, 2012, 04:07:54 pm por YAcosta »
Me encuentras en YAcosta.com

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:Ir al final de una web.
« Respuesta #12 en: Mayo 26, 2012, 03:22:39 pm »
Estuve viendo la aplicación, no hay problemas para mostrar el ultimo comentario, pero se van sumando otros inconvenientes, por ejemplo el paginado también hay que saber cuantas paginas se muestran para consultar la ultima que es donde esta el ultimo comentario, yo creo que para que el programa se realmente cumpla una utilidad deverias mostrar una alerta cuando alguien publico un post o alguien hizo un comentario, distingamos un post de un comentario, el post es el hilo principal tal como te lo muestra el rss y el comentario es lo que le sigue hecho por los demás usuarios.
Entonces si el primer ítem del rss cambia es porque alguien hizo un post, hay deverias mostrar un msg o ventana con la información y con un solo click te abra el navegador en dicho post, y si hay un comentario también un msg y con un click abris en dicho post, no se si me entiendes cual es mi pensamiento. pero es un punto de vista.

bueno te dejo el codigo para ver el ultimo comentario del post (Eso si, solo toma en cuenta la primera pagina, después cualquier cosa vemos eso)

Fíjate que modifique la función ahora se llama GetLastComent y tiene cuatro parámetros el primero es la url del post (osea  ucLblitem2(Index).Tag) los otros cuatro parámetros son de tipo ByRef en los que carga el la URL con el ancla, Autor, Fecha, y comentario., si la funcion devuelve true es porque hay almenos hay un comentario, y salio todo bien.



Código: (vb) [Seleccionar]
Option Explicit
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Const SW_SHOWNORMAL = 1


Private Sub Form_Load()

    Dim sUrl As String
    Dim sUrlComentario As String
    Dim sAutor As String
    Dim sFechaComentario As String
    Dim sMensage As String
   
    Me.AutoRedraw = True
   
    sUrl = "http://forum.planetnoize.com/index.php?p=/discussion/62/sigue-caido-peruhardware-y-forosperu/p2"
   
   
    If GetLastComent(sUrl, sUrlComentario, sAutor, sFechaComentario, sMensage) Then
   
        Me.Print "Url: " & sUrlComentario
        Me.Print "Autor: " & sAutor
        Me.Print "Fecha: " & sFechaComentario
        Me.Print "Mensage: " & vbCrLf
        Me.Print sMensage
    Else
        Me.Print "No hay comentarios en el post, solo el mensage original."
   
    End If

    'ShellExecute Me.hwnd, vbNullString, sUrlComentario, vbNullString, "C:\", SW_SHOWNORMAL

End Sub


Private Function GetLastComent(ByVal sUrl As String, ByRef sUrlComment As String, ByRef sAutor As String, ByRef sDateComment As String, ByRef sMessage As String) As Boolean
    On Error Resume Next
    Dim m_Inet As Object
    Dim HtmlDOC As Object
    Dim iLast As Integer
    Dim Element As Variant
    Dim sLastAnchor As String
    Dim i As Integer
   
    Set m_Inet = CreateObject("MSXML2.ServerXMLHTTP")
    m_Inet.open "GET", sUrl, False

    m_Inet.send
   
    If m_Inet.Status = 200 Then

        Set HtmlDOC = CreateObject("htmlfile_FullWindowEmbed")
        HtmlDOC.body.innerhtml = m_Inet.responsetext 'StrConv(m_Inet.responseBody, vbUnicode)

        iLast = HtmlDOC.anchors.length - 1

        For i = iLast To 0 Step -1
            If InStr(HtmlDOC.anchors.Item(i).href, "#") > 0 Then
               sLastAnchor = Mid$(HtmlDOC.anchors.Item(i).href, InStr(HtmlDOC.anchors.Item(i).href, "#") + 1)
               Exit For
            End If
        Next
         
        If sLastAnchor <> "" Then sUrlComment = sUrl & "#" & sLastAnchor
   
        For Each Element In HtmlDOC.getElementById(sLastAnchor).All
            Select Case Element.className
                Case "Message"
                    sMessage = Element.innertext
                Case "DateCreated"
                    sDateComment = Element.innertext
                Case "Author"
                    sAutor = Element.innertext
            End Select
        Next
    End If
   
    GetLastComent = Err.Number = 0
     
End Function




YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Ir al final de una web.
« Respuesta #13 en: Mayo 26, 2012, 05:22:15 pm »
Si funciono Leandro!!! incluso si tiene varias paginas.

El único detallito es el refresco de las ventanas, a las siguientes veces medio que se cuelga por un segundo y luego carga bien, esto de cuando en vez.

Acabo de darme cuenta que donde dice Fecha aparece la hora, voy a revisar la fuente si es otro campo o sino lo cambio por Hora

Aqui publico las fuentes por si a alguien le interese y lo modifique segun su necesidad.

Fuentes


EDITO: Eso de la alerta seria comparando?? comparando lo que se tiene vs lo que llega... o como seria?

EDITO 2: Probando el exe no parpadea nada, solo ejecutando desde el proyecto

EDITO 3: Si, si parpadea muy de cuando en cuando, habrá que hacer algun malabar, y he visto que algunas segundas paginas no esta cargando.  seguire viendo, pero al menos mis amigos del foro estan happys, es un foro peruano y chonguero con bromas locales.

EDITO 4: Si, efectivamente no leet el ultimo comentario de la ultima pagina, lee el ultimo comentario de la primera pagina a pesar de mandarle la ultima página (ejemplo) comment_546. Seguiré jugando a ver si logro hacer que coja la ultima pagina
« última modificación: Mayo 27, 2012, 12:19:38 am por YAcosta »
Me encuentras en YAcosta.com

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Ir al final de una web.
« Respuesta #14 en: Mayo 29, 2012, 12:13:13 am »
Bueno, no la chunto... En el código que publique en el post anterior y basado en lo alcanzo Leandro tengo lo siguiente (es prácticamente el mismo código):
Código: (VB) [Seleccionar]
Set oRssItem = Doc.getElementsByTagName("item")
If Not oRssItem Is Nothing Then
    For i = 0 To ucLabelItem2.Count - 1 '(oRssItem.Length - 1)
        With ucLabelItem2(i)
            .Visible = True
            .Caption = oRssItem(i).getElementsByTagName("title")(0).Text
            HtmlDOC.body.innerhtml = oRssItem(i).getElementsByTagName("description")(0).Text
            .Tag = oRssItem(i).getElementsByTagName("link")(0).Text
           
            sUrl = ucLabelItem2(i).Tag
            If GetLastComent(sUrl, sUrlComentario, sAutor, sFechaComentario, sMensage) Then  '<-- Aqui
                .Note = "Por " & sAutor & "    Fecha: " & sFechaComentario & vbCrLf & vbCrLf & Left(sMensage, 150) & "..."
            End If
            .Refresh
        End With
    Next
End If


Dond edice <-- Aqui tenemos una función que intenta sacar el ultimo comentario del hilo y lo hace siempre que el hilo conste de una pagina, cuando tiene mas de una pagina no me sigue sacando el ultimo comentario de la primera pagina a pesar incluso de indicarle el ultimo comentario.
Dentro de esa función tenemos esto:

Código: (VB) [Seleccionar]
Private Function GetLastComent(ByVal sUrl As String, ByRef sUrlComment As String, ByRef sAutor As String, ByRef sDateComment As String, ByRef sMessage As String) As Boolean
On Error Resume Next
Dim .... declaración de variables...

Set m_Inet = CreateObject("MSXML2.serverXMLHTTP")       '<--- Comentario 1
m_Inet.open "GET", sUrl, False

m_Inet.send                                         '<---- Comentario 2
If m_Inet.Status = 200 Then
    Set HtmlDOC = CreateObject("htmlfile_FullWindowEmbed")
    HtmlDOC.body.innerhtml = m_Inet.responsetext '<-- Comentario 3, creo que aqui es el problema
    iLast = HtmlDOC.anchors.length - 1     '<-- Comentario 4
    For i = iLast To 0 Step -1      '<-- Comentario 5
        If InStr(HtmlDOC.anchors.Item(i).href, "#") > 0 Then
           sLastAnchor = Mid$(HtmlDOC.anchors.Item(i).href, InStr(HtmlDOC.anchors.Item(i).href, "#") + 1)
           Exit For
        End If
    Next
    If sLastAnchor <> "" Then sUrlComment = sUrl & "#" & sLastAnchor 
    For Each Element In HtmlDOC.getElementById(sLastAnchor).All
        Select Case Element.className
            Case "Message"
                sMessage = Element.innertext
            Case "DateCreated"
                sDateComment = Element.innertext
            Case "Author"
                sAutor = Element.innertext
        End Select
    Next
End If

GetLastComent = Err.Number = 0
     
End Function

Comentario 1: Querer entender esto me hizo abrir otro hilo.
Comentario 2: Aquí hace que la aplicación media se cuelgue hasta que termina de leer.
Comentario 3: En esta "variable" no aparece el ultimo post agregado realmente.
Comentario 4: Esto si carga bien la cantidad de comentarios existentes.
Comentario 5: Recorre desde el final de la pagina buscando el comentario pero saca el ultimo de la primera pagina.

Y efectivamente Leandro ya había presagiado este tema y bueno lo comentaba por si alguien mas puede ver alguna luz sobre esto o como orientarme a ver por donde seguir.

Gracias.
« última modificación: Mayo 29, 2012, 12:15:57 am por YAcosta »
Me encuentras en YAcosta.com