enviar datos de visual basic a una pagina web

Iniciado por TheWarrior, 29 Agosto 2007, 23:27 PM

0 Miembros y 3 Visitantes están viendo este tema.

TheWarrior

quisiera saber como puedo enviar datos de vb a una pagina web X ejem. tengo caja de texto (Nombre) y que el contenido de esa caja de texto pase www.cualquierpagina.com a una de las casillas de esa pagina.

no se si me explique bien cualquier ayuda sera bienvenida de antemano muchas gracias ;D
Errar es de humanos rectificar es de Sabios

HaDeS, -

Queres que los datos se envien al servidor? o simplemente poner los datos en las cajas de texto :P?
Si es la primera me se la respuesta, si es la segunda tendre que buscarla..
saludos ;)

TheWarrior

Errar es de humanos rectificar es de Sabios

HaDeS, -

ya te doy la respuesta :P estoy elaborando manualcillo xD

HaDeS, -

#4
Ya esta:
Bueno, es un rollo interesante, tenemos que conocer muy bien la estructura de una peticion HTTP
primero miremos con el metodo GET y luego con el POST

Metodo GET.
1er paso: Identificar Variables
Entremos a mirar cualquier pagina, en este caso la pagina que valida los html (http://validator.w3.org/) y en esta localizamos en el codigo fuente la parte de los datos del formulario:
Código (html) [Seleccionar]

<form method="get" action="check">
...
<label title="Address of page to Validate" for="uri">Address:</label>
<input type="text" name="uri" id="uri" size="45" /> <!-- Variable1 -->
...
<input type="submit" title="Submit for validation" value="Check" />
</form>

Las variables en este caso usadas para la peticion es unicamente una: "uri", y el contenido es la web que queremos validar.
El "Action" define a que pagina se le pasan los parametros, y el "Method" el metodo usado, puede ser GET o POST. En este caso GET.
Cuando hacemos click al boton de Check, lo que pasa es que estas variables son enviadas usando la URL. Queda entonces asi:
http://validator.w3.org/check?uri=http://web

2do paso: Metodo GET en peticiones http
La estructura para enviar datos por metodo get es el siguiente:


GET /pagina?var1=xxx&var2=xxx HTTP/1.1
Host: Servidor
Connection: close[enter]
[enter]


3er paso: Armando el codigo en visual
Vamos a poner un componente Winsock, dos cajas de texto, dos botones y un timer:
Winsock: Para enviar datos al servidor
Caja1: Contiene variable 1 que se va a pasar por el GET = Multiline a true, para soportar varias lineas
Caja2: Recibe la respuesta del servidor = Propiedad enabled a False
Boton1: Conecta
Boton2: Envia datos
Timer: Para vigilar el estado del winsock = Intervalo a 500 milisegundos

Código (vb) [Seleccionar]

Const Host As String = "validator.w3.org" 'Constante del host
Private Sub Command1_Click()
Winsock1.Connect Host, 80 'Conectamos al host
End Sub

Private Sub Command2_Click()
Dim Peticion$
Peticion = "GET /check?uri=http://" & Text2.Text & " HTTP/1.1" & vbCrLf & _ 'Text2.text = A la web que queremos validar .. /check?uri=http://...
            "Host: " & Host & vbCrLf & _
            "Connection: close" & vbCrLf & vbCrLf 'Armamos la peticion segun la estructura que te di
Winsock1.SendData Peticion 'Mandamos la peticion
End Sub

Private Sub Timer1_Timer()
If Winsock1.State = sckConnected Then 'Checamos si la conexion es activa o no
    Command1.Enabled = False
    Command2.Enabled = True
Else
    Command1.Enabled = True
    Command2.Enabled = False
End If
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim Datos$
Winsock1.GetData Datos, vbString, bytesTotal 'Obtenemos los datos
Text1.Text = Datos
End Sub

'Si queres grabar la respuesta en un html podes reemplazar lo anterior a
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim Datos$, Cabecera, Html$, Canal% 'Declaramos variables
Winsock1.GetData Datos 'Obtenemos datos
Text1.Text = Datos 'Ponemos contenido en la caja de texto
If InStr(1, Datos, vbCrLf & vbCrLf, vbTextCompare) <> 0 And InStr(1, Datos, "HTTP/1.1 200 OK", vbTextCompare) Then 'Si es cabecera de servidor entonces..
    Cabecera = Split(Datos, vbCrLf & vbCrLf, 2) 'Dividimos la respuesta en dos partes, la cabecera y el html
    Html = Cabecera(1) 'El html es la segunda parte, la que es luego de los dos vbCrLf
Else
    Html = Datos 'Sino es cabecera entonces el html son los datos recibidos
End If
Canal = FreeFile
Open App.Path & "\Respuesta.html" For Binary Access Write As Canal 'Abrimos el archivo de respuesta.html en modo binario
Put #Canal, LOF(Canal) + 1, Html 'Escribimos al final del archivo
Close #Canal 'Cerramos canal
End Sub


Metodo POST:
1er paso: Identificar variables
Al igual que el anterior caso, vamos a ver una pagina para poder enviar el post, en este caso quiero hacerle post a elhacker.net en un script php que tiene para cifrar cosas :P, nos vamos a http://elhacker.net/sneak.php
En este caso vemos un codigo diferente al anterior:
Código (html) [Seleccionar]

<form action="/sneak.php" method="post">
...
<textarea name="text" ... ></textarea>
<select name="cryptmethod">
...
<option value="md5">MD5 Crypt (one way)</option>
...
</select>
<input type="submit" name="submit" value="Codificar" />
...
</form>

Ahora, lo enviado es lo que vamos a codificar, probemos con "HaDeS", text=HaDeS
El name cryptmethod es el metodo que vamos a elegir para cifrar el contenido, cryptmethod=md5
Y enviamos igualmente el valor del submit, submit=Codificar
La peticion entonces seria: text=HaDeS&cryptmethod=md5&submit=Codificar

2do paso: Metodo Post en peticiones http
La estructura del metodo post va asi:


POST /pagina HTTP/1.1
Host: Servidor
Connection: close
Content-Length: Longitud de lo que enviamos[enter]
[enter]
Lo que enviamos


3er paso: Armando el codigo en visual
Vamos a poner el mismo codigo anterior, pero modificando la peticion...
Código (vb) [Seleccionar]

Const Host As String = "validator.w3.org" 'Constante del host
Private Sub Command1_Click()
Winsock1.Connect Host, 80 'Conectamos al host
End Sub

Private Sub Command2_Click()
Dim Peticion$, Datos$
Datos = "text=" & Text2.Text & "&cryptmethod=md5&submit=Codificar"
Peticion = "POST /sneak.php HTTP/1.1" & vbCrLf & _
            "Host: " & Host & vbCrLf & _
            "Connection: close" & vbCrLf & _
            "Content-Type: application/x-www-form-urlencoded" & vbCrLf & _
            "Content-Length: " & Len(Datos) & vbCrLf & vbCrLf & _
            Datos
Winsock1.SendData Peticion
End Sub

Private Sub Timer1_Timer()
If Winsock1.State = sckConnected Then 'Checamos si la conexion es activa o no
    Command1.Enabled = False
    Command2.Enabled = True
Else
    Command1.Enabled = True
    Command2.Enabled = False
End If
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim Datos$
Winsock1.GetData Datos, vbString, bytesTotal 'Obtenemos los datos
Text1.Text = Datos
End Sub

'Si queres grabar la respuesta en un html podes reemplazar lo anterior a
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim Datos$, Cabecera, Html$, Canal% 'Declaramos variables
Winsock1.GetData Datos 'Obtenemos datos
Text1.Text = Datos 'Ponemos contenido en la caja de texto
If InStr(1, Datos, vbCrLf & vbCrLf, vbTextCompare) <> 0 And InStr(1, Datos, "HTTP/1.1 200 OK", vbTextCompare) Then 'Si es cabecera de servidor entonces..
    Cabecera = Split(Datos, vbCrLf & vbCrLf, 2) 'Dividimos la respuesta en dos partes, la cabecera y el html
    Html = Cabecera(1) 'El html es la segunda parte, la que es luego de los dos vbCrLf
Else
    Html = Datos 'Sino es cabecera entonces el html son los datos recibidos
End If
Canal = FreeFile
Open App.Path & "\Respuesta.html" For Binary Access Write As Canal 'Abrimos el archivo de respuesta.html en modo binario
Put #Canal, LOF(Canal) + 1, Html 'Escribimos al final del archivo
Close #Canal 'Cerramos canal
End Sub


Y listo, creo que eso es, ya si queres hacer todo automatico con el winsock, podes dividir la respuesta en lineas, analizando cada linea, sacas las variables y el metodo, y aplicas lo de arriba
saludos :P

Kizar

Es bastante interesante el protocolo html, las cabeceras y demas, pero sino se quiere complicar que use el control de IE con el que puede rellenar formularios y mandarlos en dos lineas. Busca en este subforo que e puesto algun code.

HaDeS, -

Cita de: KiZaR en 30 Agosto 2007, 03:36 AM
Es bastante interesante el protocolo html, las cabeceras y demas, pero sino se quiere complicar que use el control de IE con el que puede rellenar formularios y mandarlos en dos lineas. Busca en este subforo que e puesto algun code.
No es por nada, pero eso que escribiste sono muy mediocre, me parece que la mejor forma de aprender algo es exprimiendolo hasta el fondo, no se trata de coger componentes que ya estan hechos y hacer una simple linea de codigo e indicarle que use tal evento de tal componente. Y no creo tampoco que TheWarrior se interese por cosas simples. Entonces mejor me dicen no vuelvo a hacer manualcillos, porque no voy a estar botando el tiempo como lo hice haciendo eso por personas que solo se interesan por lo facil.

Saludos ;)

LeandroA

Estoy completamente deacuerdo con HaDeS, la forma mas profesional de hacer estas cosas es de esta forma, porque? al utilizar las librerias del IE tanto sea por apis wininet o el mismo control webbrowser o el Inet (MSInet.ocx), quizas estas nos puedan simplificar un poco las cosas, pero  estamos perdiendo mucha informacion como ser las cabeseras y  el control de las cosas que pasan de por medio, otra es que quedamos parado hasta que estos controles o apis nos devuelvan una respuesta, tomen como ejemplo un cliente ftp echo con las apis del wininet, como veran nuestro programa se va a ir colgando por cada peticion que se envie, y porque con los programas ftp profecionales no pasa esto? pues por la sencilla razón de que utilizan este metodo (obio no en el protocolo fpt).
y bien muchas otras rasones mas, y si bien muchos dirian pero el control winsock no esta en todas las pc. y los demas si, pues si quieren hacer algo mas profesional aun no dependan de este ocx y utilizen las apis ws2_32.dll



Felizitaciones HaDeS por el Manual

una observacion
creo que esta linea seria mejor asi

If InStr(1, Datos, vbCrLf & vbCrLf) <> 0 And Flag = False Then
Flag =true

puse Flag en el general como una variable boolean porque me a pasado en ocasiones que la cabesera termina de llegar en el segundo paquete entonces esta condicion no se cumpliria And InStr(1, Datos, "HTTP/1.1 200 OK"

Saludos

Carloswaldo

Totalmente de acuerdo con HaDeS, - y LeandroA, lo mejor es aprender desde el fondo, yo ya toy analizando el codigo haber que puedo aprender (si apreciamos tu trabajo HaDeS no te preocupes  :P)

c-ya  :P

Kizar

Para aprender desde el fondo, no useis el winsock que es un ocx mas prefabricado.
Para hacer peticiones http usar las apis que os permiten mandar cabeceras, elegir el metodo, cookies, recibir la pagina y demas...

Private Declare Function InternetOpen Lib "wininet" Alias "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
Private Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" (ByVal hInternetSession As Long, ByVal sServerName As String, ByVal nServerPort As Integer, ByVal sUserName As String, ByVal sPassword As String, ByVal lService As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long
Private Declare Function HttpOpenRequest Lib "wininet.dll" Alias "HttpOpenRequestA" (ByVal hHttpSession As Long, ByVal sVerb As String, ByVal sObjectName As String, ByVal sVersion As String, ByVal sReferer As String, ByVal something As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long
Private Declare Function HttpSendRequest Lib "wininet.dll" Alias "HttpSendRequestA" (ByVal hHttpRequest As Long, ByVal sHeaders As String, ByVal lHeadersLength As Long, ByVal sOptional As String, ByVal lOptionalLength As Long) As Long
Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Integer


http://articulos.conclase.net/jm/prog/cpp/wininethttp_2.html