Búsqueda de sitios web

Invoke-WebRequest: la navaja suiza web de PowerShell


¿Alguna vez has querido navegar por la web a través de la línea de comandos? Sí. Yo tampoco. Pero, ¿alguna vez ha necesitado extraer información de una página web, monitorear un sitio web o enviar información mediante automatización? ¡Tengo y uso Invoke-Webrequest para hacerlo!

El cmdlet de PowerShell Invoke-WebRequest es la navaja suiza para la web. Este cmdlet puede enviar cualquier verbo HTTP a un servicio web junto con elementos comunes como parámetros HTTP, especificar diferentes encabezados HTTP, etc. Invoke-WebRequest junto con su hermano, Invite-RestMethod son los dos cmdlets de PowerShell con los que querrás familiarizarte si necesitas realizar algún tipo de automatización web.

El cmdlet Invoke-WebRequest es parte del módulo Microsoft.PowerShell.Utility que viene con Windows PowerShell y PowerShell Core. Este cmdlet se incluyó con PowerShell desde la versión 3 y es extremadamente potente pero fácil de usar.

Al utilizar Invoke-WebRequest, PowerShell permite a un desarrollador trabajar con sitios web, servicios web y API REST de muchas maneras diferentes.

Uso básico

En su forma más básica, el cmdlet Invoke-WebRequest envía un método de solicitud HTTP a un punto final, como un URI o una URL. El cmdlet admite todos los métodos de solicitud comunes.

Con diferencia, el método más común es el método GET. Este método lee información como información de un sitio web o tal vez consulta una API REST. El método se define utilizando el parámetro Method. Dado que necesitamos un punto final para realizar la consulta, también necesitaremos un URI. Para que esto sea fácil, elegiré cualquier sitio web. Para promocionar TechSnips descaradamente, elegiré techsnips.io.

Digamos que quiero obtener una lista de todos los últimos videos publicados como se muestra a continuación.

Puedo obtener una representación HTML de esta página ejecutando Invoke-WebRequest -Uri 'https://techsnips.io' -Method GET. Cuando hago esto, Invoke-WebRequest descarga la página web completa y devuelve un resultado con diversa información analizada sobre los elementos de la página.

Para obtener los videos, tendré que investigar un poco. Cuando miro la propiedad de enlaces, veo algo en común: todos los enlaces de vídeo tienen una clase de ng-binding como se muestra a continuación.

Una vez que sepa esto, puedo encontrar todos esos elementos y solo devolver la propiedad innerHTML y ¡listo!

Descarga de archivos con Invoke-WebRequest

También podemos usar Invoke-WebRequest para descargar archivos de la web y ¡es realmente fácil! Podemos descargar archivos simplemente apuntando Invoke-WebRequest a un URI de un archivo y usando el parámetro OutFile para indicarle al cmdlet que guarde el archivo en el disco local.

Como ejemplo, a continuación descargo la utilidad SysInternals Handle y expando el archivo zip una vez descargado. ¡Es realmente así de fácil!

Invoke-WebRequest -Uri 'https://download.sysinternals.com/files/Handle.zip' -OutFile C:\handle.zi Expand-Archive -Path C:\handle.zip

Enviar un formulario y trabajar con sesiones

Podemos usar Invoke-WebRequest para completar también formularios. Sin embargo, para hacer esto, normalmente necesitamos trabajar con sesiones web. HTTP es un protocolo naturalmente sin estado y su navegador (en este caso PowerShell) debe poder crear una sesión que se utilizará para rastrear cosas como cookies, por ejemplo. Un formulario común es un formulario de inicio de sesión/contraseña, ¡así que iniciemos sesión en un sitio web ficticio!

Digamos que nuestro formulario de inicio de sesión ficticio está en la URL http://somewebsite.com. Primero necesitaríamos ejecutar Invoke-WebRequest para descargar la estructura HTML y crear una sesión.

$response = Invoke-WebRequest -Uri 'http://somewebsite.com' -SessionVariable rb

Una vez que hagamos esto, la respuesta tendrá una propiedad Formularios que luego podremos completar con un nombre de usuario y contraseña. En este caso, el nombre de usuario está representado por un campo llamado user y la contraseña debe estar en un campo llamado password. Esto dependerá de la página web.

$form = $response.Forms[0]
$form.Fields["user"] = "username"
$form.Fields["password"] = "password"

Una vez que se ha completado el formulario, podemos usar Invoke-WebRequest nuevamente, pero esta vez reutilizamos la sesión que acabamos de crear y automáticamente determinamos el URI al que enviarlo leyendo la acción . propiedad que se encuentra en el formulario como se muestra a continuación.

$response = Invoke-WebRequest -Uri $form.Action -WebSession $rb -Method POST

Si tiene todos los nombres de campo apropiados correctamente y la página web no es muy elegante, debe iniciar sesión con el nombre de usuario y la contraseña dentro de la sesión web $rb. En este punto, puede leer varias páginas detrás de esa autenticación si usa la variable de sesión web $rb.

Resolución de URI cortos

Finalmente, otro gran uso de Invoke-WebRequest es resolver URI cortos. ¡Quizás necesites saber qué hay detrás de esa URL acortada pero no quieras hacer clic en ella para descubrirlo! Ningún problema. Usando Invoke-WebRequest, podemos leer la propiedad AbsoluteUri a partir de la respuesta analizada que nos proporciona.

Observe a continuación que también estoy usando el parámetro UseBasicParsing. De forma predeterminada, Invoke-WebRequest intenta utilizar Internet Explorer (IE) para analizar el HTML devuelto. Esto no funciona en sistemas sin IE. Para solucionar esto, podemos usar el parámetro UseBasicParsing para seguir descargando el contenido pero solo analizándolo ligeramente.

$Url = 'buff.ly/2sWvPOH'
$Web = Invoke-WebRequest -Uri $Url -UseBasicParsing
$Web.BaseResponse.ResponseUri.AbsoluteUri

Resumen

El cmdlet Invoke-WebRequest es uno de los cmdlets más versátiles que vienen con PowerShell. Si hay una acción que se puede realizar a través de un navegador gráfico típico, el cmdlet Invoke-WebRequest también puede hacerlo. Puede encontrar un ejemplo del uso de este cmdlet consultando este artículo sobre la supervisión de las API REST.

Artículos relacionados