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:
<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://web2do 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
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
, nos vamos a
http://elhacker.net/sneak.phpEn este caso vemos un codigo diferente al anterior:
<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...
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