WinHttp no se que estoy haciendo mal

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
tomas33
Mensajes: 14
Registrado: 21 Oct 2010, 14:09
Ubicación: alicante
Contactar:

WinHttp no se que estoy haciendo mal

Mensaje por tomas33 »

hola a todos la cuestion que estoy tratando de logearme usando las funciones de WinHttp he intentado de dotas las formas incluso los ejemplos que hay en las ayudas no me funcionan(parece que en las webs ha cambiado) he intentado adaptarlo en mi localhost pero no consigo logearme el codigo es muy simple

Código: Seleccionar todo

<html>
<body>
	<form action="login" method="post">
		<table>
			<tr>
				<td>User</td>
				<td><input name="user" /></td>
			</tr>
			<tr>
				<td>password</td>
				<td><input name="password" /></td>
			</tr>
		</table>
		<input type="submit" />
	</form>
</body>
</html>
y el codigo que he intentado adaptar para logearme lo he cogido de los ejemplos y lo he modificado para que se adapte a mi web

Código: Seleccionar todo

#include "WinHttp.au3"


;; Example 3:
; 1. Open cs.tut.fi forms page (http://www.cs.tut.fi/~jkorpela/forms/testing.html)
; 2. Fill form on that page with these values/conditins:
; - form is to be identifide by its index, It's first form on the page, i.e. index is 0
; - set "Johnny B. Goode" data to textarea. Locate it by its name "Comments".
; - check the checkbox. Locate it by name "box". Checked value is "yes".
; - set "This is hidden, so what?" data to input field identified by name "hidden field".
; - gather data

; Initialize and get session handle
$hOpen = _WinHttpOpen()
; Get connection handle
$hConnect = _WinHttpConnect($hOpen, "localhost")
; Fill form on this page
$sRead = _WinHttpSimpleFormFill($hConnect,Default, "tomas1/login.html", "name:user", "tomas", "name:password", "tomas")
; Close connection handle
_WinHttpCloseHandle($hConnect)
; Close session handle now that's no longer needed
_WinHttpCloseHandle($hOpen)

If $sRead Then
    MsgBox(64 + 262144, "Done!", "Will open returned page in your default browser now." & @CRLF & _
            "It should show sent data.")
    $hFileHTM = FileOpen($sFileHTM, 2)
    FileWrite($hFileHTM, $sRead)
    FileClose($hFileHTM)
    ShellExecuteWait($sFileHTM)
EndIf

¿que es lo que falla?¿que es lo que estoy haciendo mal? muchas gracias
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2085
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: WinHttp no se que estoy haciendo mal

Mensaje por BasicOs »

Has probado las funciones _IE para empezar (aunque tambien funciona en funciones directas winhttp)?
Te pongo algunos ejemplos de IE y de winhttp para que los reutilices y luego nos cuentas :smt014 :smt014 :

Código: Seleccionar todo

#include <WinHttp.au3>

Func _Check_RapidShare($sUsername, $sPassword)

	Local $sGET = "cgi-bin/rsapi.cgi?sub=getaccountdetails&login=" & $sUsername & "&password=" & $sPassword
	Local $sType = "GET"
	Local $sHost = "api.rapidshare.com"

	Local $hSession = _WinHttpOpen()
	Local $hConnection = _WinHttpConnect($hSession, $sHost)

	Local $sHTML = _WinhttpSimpleRequest($hConnection, $sType, $sGET)

	_WinHttpCloseHandle($hConnection)
	_WinHttpCloseHandle($hSession)

	If StringInStr($sHTML, "ERROR: Login failed.") Then
		Return False
	Else
		Return True
	EndIf
EndFunc   ;==>_Check_RapidShare
Con un video (en alemán pero se ve el código): http://www.youtube.com/watch?v=XC8stwAWH4c

O usa este:

Código: Seleccionar todo

#include <IE.au3>

Local $oUser, $oPass, $oSubmit
Local $sUser = "testUsername"
Local $sPass = "testPassword"
Local $url = "https://secure.williams-int.com/customers/login.asp"
Local $oIE = _IECreate($url, 1)

_IELoadWait($oIE)

$oInputs = _IETagNameGetCollection($oIE, "input")
for $oInput in $oInputs
    if $oInput.type = "text" And $oInput.name = "userid" And $oInput.size = "12" Then $oUser = $oInput
    if $oInput.type = "password" And $oInput.name = "password" And $oInput.size = "12" Then $oPass = $oInput
    if $oInput.type = "submit" And $oInput.value = "   SIGN IN   " Then $oSubmit = $oInput
    if isObj($oUser) And isObj($oPass) And isObj($oSubmit) then exitloop
Next

$oUser.value = $sUser
$oPass.value = $sPass
_IEAction($oSubmit, "click")

_IELoadWait($oIE)
o este:
#include <ie.au3>
$oIE = _IECreate ("http://yoursitename.com")
$oForm = _IEFormGetObjByName ($oIE, "form id or name")
$oQuery1 = _IEFormElementGetObjByName ($oForm, "uname textfield id or name")
$oQuery2 = _IEFormElementGetObjByName ($oForm, "pwd text field id or name")
$uname="Yourusername"
$pwd="yourpassword"
_IEFormElementSetValue ($oQuery1,$uname)
_IEFormElementSetValue ($oQuery2,$pwd)
$oButton=_IEGetObjById($oIE,"")
_IEAction ($oButton, "click")
_IELoadWait($oIE,0)

The code above opens internet explorer finds the text-fields for username and password further it sets the string using </ie.au3>_IEFormElementSetValue() fuction and finally simulates the click on the form button to submit the form
http://solubletech.blogspot.com.es/2011 ... cript.html

Aquí hay una usando el winhttp:

Código: Seleccionar todo

Func _SendPing()
    Local $servername = "MyServer"
    Local $serverport = 80
    Local $ipconnection = -1
    Local $i, $r, $s, $t

    $t = ""
    For $i = 0 To (UBound($SysInfo, 1) - 1)
        $t &= "&" & $SysInfo[$i][0] & "=" & _UnicodeURLEncode($SysInfo[$i][1])
    Next
    $s = "POST /feedback/callhome.php HTTP/1.1" & @CRLF
    $s &= "Host: " & $servername & ":" & $serverport & @CRLF
    $s &= "From: " & @UserName & "@" & @ComputerName & @CRLF
    $s &= "User-Agent: DataPull/2.0" & @CRLF
    $s &= "Content-Type: application/x-www-form-urlencoded" & @CRLF
    $s &= "Content-Length: " & StringLen($t) & @CRLF & @CRLF
    $s &= $t
    TCPStartup()
    $ipconnection = TCPConnect(TCPNameToIP($servername), $serverport)
    $r = TCPSend($ipconnection, $s)
    Sleep(100)
    TCPShutdown()
EndFunc   ;==>_SendPing
Más info sobre winhttp: http://brugbart.com/Tutorials/http-post-request-autoit
Salu22:)
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: WinHttp no se que estoy haciendo mal

Mensaje por Chefito »

Creo que te has confundido y has cambiado los parámetros. Puebalo así:

Código: Seleccionar todo

$sRead = _WinHttpSimpleFormFill($hConnect, "tomas1/login.html", Default, "name:user", "tomas", "name:password", "tomas")
Si no se soluciona, mira a ver que error te devuelven las funciones.

Saludos y ya nos comentaras como te fue.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
tomas33
Mensajes: 14
Registrado: 21 Oct 2010, 14:09
Ubicación: alicante
Contactar:

Re: WinHttp no se que estoy haciendo mal

Mensaje por tomas33 »

muchas gracias basicos por la ayuda,por ie se logearme el tema es que quiero profundizar mas y hacerlo de una forma mas directo es por ello que estoy tratando de usar winhttp mi idea es logearme y hacer peticiones al servidor sin tener que usar mingun navegador y las respuestas que me genera el seridor web volcarlas en un documento...bueno ya veria que haria con las respuestas jeeejeje.Lo que me ha propuesto chefito ya lo he modificado y parece que no me sale ningun error te pego lo que me sale en la consola

Código: Seleccionar todo

C:\Archivos de programa\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "E:\dolar\borrar.au3"    
>Exit code: 0    Time: 1.157
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: WinHttp no se que estoy haciendo mal

Mensaje por Chefito »

Tienes que ver los errores que te devuelve cada función. Éstos te indican que es lo que puede fallar. Mira por ejemplo los errores que puede lanzar la función WinHttpSimpleFormFill según la ayuda:
Return Value

Success - Returns HTML source of the page returned by the server on submited form.
Failure - Returns empty string and sets @error:
1 - No forms on the page
2 - Invalid form
3 - No forms with specified attributes on the page
4 - Connection problems
5 - form's "action" is invalid
6 - invalid session handle passed
En este caso, si falla también devuelve una cadena vacía, que es lo que no haría que saltase el msgbox que has puesto dentro del último if.

Esto suele pasar con todas las funciones. Revisa todas las funciones Winhttp....... .

Como se hace? Pues por ejemplo:

Código: Seleccionar todo

$sRead = _WinHttpSimpleFormFill($hConnect, "tomas1/login.html", Default, "name:user", "tomas", "name:password", "tomas")
If @error then
msgbox(0,"Error",@error)
endif
También puedes hacerlo de otra forma. Sustituye la función _WinHttpSimpleFormFill por:

Código: Seleccionar todo

$sRead=_WinHttpSimpleRequest($hConnect, "POST", "tomas1/login.html", Default, "user=tomas&password=tomas")
No creo que sea por esto que te voy a decir, pero puedes poner la propiedad id además de la name a los objetos de la página. Ejemplo:

Código: Seleccionar todo

<input name="user" id="user" />
Hay otras formas de hacer esto si ves que no te aclaras. Por ejemplo puedes mirar ejemplos del objeto winhttp.winhttprequest.5.1.

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
tomas33
Mensajes: 14
Registrado: 21 Oct 2010, 14:09
Ubicación: alicante
Contactar:

Re: WinHttp no se que estoy haciendo mal

Mensaje por tomas33 »

gracias chefito ya tengo el codigo de error el problema es que no encuentra el formulario
$sRead = _WinHttpSimpleRequest($hConnect, "POST", "tomas1/login.html", Default, "user=tomas&password=tomas")

Código: Seleccionar todo

1 - could not open request
y como lo tenia antes
$sRead = _WinHttpSimpleFormFill($hConnect, "tomas1/login.html","name:user", "tomas", "name:password", "tomas")

Código: Seleccionar todo

 1 - No forms on the page
asi es que tengo que investigar por que no lo encuentra como informacion adicional el puerto es 8080 lo que se me ocurre que nisiquiera apunte por alguna razon al localhost
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: WinHttp no se que estoy haciendo mal

Mensaje por Chefito »

tomas33 escribió:asi es que tengo que investigar por que no lo encuentra como informacion adicional el puerto es 8080 lo que se me ocurre que nisiquiera apunte por alguna razon al localhost
Pues ahí está el meollo de la cuestión. Me entendiste a medias. Te dije que buscases los errores, no solamente un error. Te puse esa función como ejemplo, pero debes ver el @error de las anteriores a ver si te fallan (por ejemplo _WinHttpConnect, _WinHttpOpen).
Una vez que localices el comienzo de la función que te da el error, ya se puede tener más claro que es lo que falla.

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
tomas33
Mensajes: 14
Registrado: 21 Oct 2010, 14:09
Ubicación: alicante
Contactar:

Re: WinHttp no se que estoy haciendo mal

Mensaje por tomas33 »

Bueno ya he resuleto el problema ,lo he echo creando el objeto winhttp.winhttprequest.5.1,pero aun me queda la espinita clavada de hacerlo con las funciones winhttp(se que es igual o parecido pero soy asi de maniatico)he comprovado los errores y me da error 1 que corresponde con la llamada al api:
DllCall failed

ahora bien se me plantea unas dudas no se si es que no puedo abrir la dll o esta mal el llamamiento a la funcion o bien por que la version es distinta y va montada de otra forma o por otros motivos ¿como poduria saver cual es el fallo para ir descartando? hay alguna manera de saver que es lo que esta pasando dentro de la dll o algo asi estoy un poco perdido en estas cosas estoy seguro que es mas sencillo de lo ques pero necesito unas pistas para poder abanzar y segir aprendiendo muchas gracias por adelantado por las respuestas me has sido de gran utilidad
Responder