Página 1 de 1

Problema con InetGet

Publicado: 19 Nov 2013, 16:00
por chelo32
Estoy teniendo problema con InetGet.
Quiero bajar el Silverlight.exe con InetGet de esta pagina ---http://www.microsoft.com/getsilverlight ... light.ashx
pero no lo logro ya que la pagina no termina en el archivo .exe y por lo tanto no me baja nada.
La idea de mi script es que baje e instale la ultima vercion del Silverlight.exe
Este es parte de my codigo:

Código: Seleccionar todo

 #include <Math.au3>
#include <GUIConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
TraySetState (2)
 $_FinalUrl = 'http://www.microsoft.com/getsilverlight/handlers/getsilverlight.ashx'
 $_TempPath = @TempDir & '\Silverlight_Instaler.exe'
 $_FileSize = InetGetSize ( $_FinalUrl )
 $_Gui = GUICreate ("DOWNLOAD...", 359, 114, 260, 138)
 GUISetIcon("@TempDir & '\Silverlight.ico", -1)
 GUICtrlCreateLabel("MICROSOFT SILVERLIGHT", 32, 16, 300, 25, $SS_CENTER)
 GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
 $_ProgressBar = GUICtrlCreateProgress (48, 40, 254, 33, $PBS_SMOOTH)
 GUISetState ( @SW_SHOW )
 $_Download = InetGet ( $_FinalUrl, $_TempPath, 1, 1)
 Local $_InfoData
 Do
	 $_InfoData = InetGetInfo ( $_Download )
	 If Not @error Then
		 $_InetGet = $_InfoData[0]
		 $_DownloadPercent = Round ( ( 100 * $_InetGet ) / $_FileSize )
		 $_DownloadPercent = _Min ( _Max ( 1, $_DownloadPercent ), 99 )
		 GUICtrlSetData ( $_ProgressBar, $_DownloadPercent )
		 $_Label = GUICtrlCreateLabel ( 'PROGRESS : ' & $_DownloadPercent & ' %', 32, 88, 308, 17, $SS_CENTER )
		 GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
	 EndIf
	 Sleep ( 100 )
 Until $_InfoData[2] = True
 $_Label = GUICtrlCreateLabel ( 'DOWNLOAD SUCCESSFULL !', 32, 88, 308, 17 , $SS_CENTER)
 GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
 Sleep ( 2000 )
 $_Label = GUICtrlCreateLabel ( 'INSTALANDO ESPERE... !', 32, 88, 308, 17 , $SS_CENTER)
 GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
 Sleep ( 2000 )

 ShellExecuteWait(@TempDir & '\Silverlight_Instaler.exe' , '/q /doNotRequireDRMPrompt /ignorewarnings')
Si alguien tiene una solucion agradesco mucho ,ya que queme todas las neuronas sin resultado alguno.

Re: Problema con InetGet

Publicado: 21 Nov 2013, 16:12
por BasicOs
Hola, te recomiendo que lo subas a un alojamiento tuyo, también porque pueden cambiar la url en cualquier momento. También puedes buscar hacer comandos con http directamente con
_HTTPConnect($host, $port = 80)
_HTTPGet($host, $page, $socket = -1)
_HTTPRead([$socket], [$flag])

Pero es igual también porque si lo quieres hacer de la pagina original, vas a tener que usar la automatización del navegador para bajar el fichero (_IExx)

Mejor ponerlo en un ftp bajo tu control,
Salu22)

Re: Problema con InetGet

Publicado: 23 Nov 2013, 03:06
por Chefito
Mmmmmm....esto no es tan fácil como te crees. Esta página que nos das tiene mucho código y llama a muchos scripts que habría que analizar. Piensa que la dirección web que nos das no es una dirección de descarga del fichero, sino que con el código que contiene esta página, te acaba resolviendo la dirección final del fichero que deseas bajar.

Viéndolo por encima, se podría hacer de dos formas. La que más me gustaría a mí, sería enviando peticiones y respuestas por código autoit hasta que te respondiese dándote la dirección web del fichero de descarga. Eso puede ser algo complicado. Yo analizaría el form y los datos que manda a ver por donde te sale la cosa. Por lo que he visto, también puede que tuvieses que mandarle una cabecera con datos específicos que puede que necesite para que la respuesta no sea erronea, como por ejemplo el explorador web desde el que haces la petición? :smt017 .

Ya te digo, todo esto habría que ir analizándolo tranquilamente hasta dar con la tecla. Se podria utilizar varias formas, desde las funciones nativas de autoit, hasta la udf inet o winhttp. Esta última es de las que más me gustan a mí. Busca por el foro y seguro que contraras ayuda de estas udfs. O siempre te queda el foro de habla inglesa :smt003 .

Otra forma algo más rápida, y puede que la entiendas mejor, es con el objeto internetexplorer. Te dejo el ejemplo de como sacar la dirección del archivo de descarga que necesitas para poder trabajar con inetget. Gran parte del código está sacado de la ayuda en Autoit>GUI Reference>Obj/COM Reference. Echale un vistacillo y verás que es muy interesante :smt002 .

Código: Seleccionar todo

$oIE=ObjCreate("InternetExplorer.Application.1")	;creación del objeto
$oIE.Visible=0

$EventObject=ObjEvent($oIE,"IEEvent_","DWebBrowserEvents")	;creación de los eventos del objeto anterior
if @error then	;mensaje de error por si falla la creación anterior
   Msgbox(0,"AutoIt COM Test", _
    "ObjEvent: Can't use event interface 'DWebBrowserEvents'. Error code: " & hex(@error,8))
   exit
endif

; Now starting to load an example Web page.
$URL = "http://www.microsoft.com/getsilverlight/handlers/getsilverlight.ashx"
$oIE.Navigate( $URL )	;navega a la dirección anterior

While 1
   Sleep(100)
Wend

$EventObject.Stop   ; Tell IE we don't want to receive events.
$EventObject=0      ; Kill the Event Object
$oIE=0              ; Remove IE from memory (not really necessary).

; A few Internet Explorer Event Functions
; See also: http://msdn.microsoft.com/workshop/browser/webbrowser/reference/objects/webbrowser.asp

Func IEEvent_StatusTextChange($Text)	;evento del objeto internetexplorer que nos interesa para sacar la dirección de descarga.
    ; busco un trozo fijo de la dirección de descarga. Se que es así porque ya lo he averiguado espiando la navegación ;)=
	$encontrado=StringInStr($Text,"http://silverlight.dlservice.microsoft.com/download")
	If $encontrado<>0 Then	;si encuentro la dirección de descarga entro en la condición
		$oIE.stop		;paro la navegación para que no me salga la ventana de descarga del explorador.
		$EventObject.Stop   ; Tell IE we don't want to receive events.
		$EventObject=0      ; Kill the Event Object
		$oIE=0              ; Remove IE from memory (not really necessary).
		$direccion=StringRight($Text, StringLen($Text)-$encontrado+1)	;saco solamente la dirección de descarga desechando los caracteres del principio que no me interesan.
		msgbox(0,"Direccion de descarga encontrada",$direccion)
		Exit	;salgo del script
	EndIf
EndFunc
Más o menos lo he comentado todo, pero si tienes alguna duda pregunta, que si no soy yo seguro que alguien te la resolverá.

Por cierto, puede que se pueda acortar un poco el proceso de resolución de la dirección de descarga, porque entre consulta-respuesta, entre la primera dirección que nos has proporcionado y la dirección de descarga, hay otra dirección web. Lo que pasa que tiene como dato un ID y puede que cambie (quien sabe....puede que según el sistema operativo, la versión del internet explorer, etc). Por eso no me he arriesgado a hacerlo desde esa dirección y he ido sobre seguro. Si te interesa puedes estudiarlo tú.

Saludos.