YouTube desde PowerShell

Actualizado: 11 de Abril de 2018

Hoy en Stackoverflow en español, dentro del tag PowerShell encontré una consulta sobre la posibilidad de realizar búsquedas en YouTube desde la consola y allí poder comenzar a mirar videos relacionados a lo que interesaba buscar, simplemente ejecutando una única función desde la consola.

De lo anterior surgió este post para compartirlo con más detalles y cómo llegué a la función final (que por cierto va a estar al final del post).

Lo primero de lo que voy a hablar es sobre como trabajar directamente con Internet Explorer, u otro navegador (para el post se utilizó IE). Para ello tenemos un cmdlet llamado New-Object, que permite generar objectos como indica el nombre. Puntualmente utilizamos esta función para crear una instancia del objecto COM que representa la aplicación Internet Explorer. Adicional a esto, es posible utilizar el método Navigate2 para definir la URL a la que queremos navegar y definimos el valor de la propiedad Visible en $True para que la aplicación sea visible:

$ie = New-Object -ComObject "InternetExplorer.Application"
  $ie.navigate2("https://www.youtube.com/?hl=es&gl=ES")
  $ie.visible = $True

Resultado de ejecutar cl código anterior

A pesar de tener ya el navegador junto con el acceso a la web que nos interesa, debemos implementar un mecanismo que nos permita esperar a que termine de cargar la página antes de seguir trabajando. Lo anterior podemos resolverlo utilizando un simple while y Start-Sleep mientras se encuentre el estado Busy:

while($ie.Busy) {Start-Sleep -Milliseconds 100}

Ahora que tenemos este gran avance, debemos conocer como hay que hacer para interactuar con los campos de búsqueda; el campo donde ingresamos el valor de la búsqueda y el botón para realizarla. Esto lo vamos a realizar por medio de las herramientas de desarrollador. Accedemos a ellas desde el navegador con la tecla F12:

Herramientas de desarrollador

Usando las Dev Tools vamos a poder encontrar la información que necesitamos sobre los elementos con los que debemos interactuar. Para ello vamos a seleccionar la barra de búsqueda y hacemos clic derecho sobre ella para seleccionar la opción Inspect element. Como resultado de lo anterior, dentro de las Dev Tools vamos a ver resaltado un bloque de código, que corresponde al elemento de la web (barra de búsqueda). En la siguiente imagen se resalta con verde el valor que nos interesa para trabajar:

Inspect element

Ese valor resaltado en verde es el Id del elemento, el cuál es único. Nos sirve para poder identificarlo dentro de la página web, de la siguiente manera:

$doc = $ie.Document
  $searchBarId = "masthead-search-term"
  $doc.getElementById($searchBarId)

Ahora vamos a hacer lo mismo para el botón de búsqueda y adicionamos, al bloque anterior, el valor que nos interesa buscar en Youtube:

$doc = $ie.Document
  $searchBarId = "masthead-search-term"
  $doc.getElementById($searchBarId).value = "PowerShell"
  $buttonId = "search-btn"
  $doc.getElementById($buttonId)

Y listo! Resta sumar todo en una función e invocar el método click() como se detalla en el siguiente bloque para que todo funcione correctamente:

function Search-Youtube {
    param(
      [string]$Search
    )
    $searchBarId = "masthead-search-term"
    $buttonId = "search-btn"
    $ie = new-object -com "InternetExplorer.Application"
    $ie.navigate2("https://www.youtube.com/?hl=es&gl=ES")
    $ie.visible = $true
    while($ie.Busy) { Start-Sleep -Milliseconds 100 }
    $doc = $ie.Document
    $doc.getElementById($searchBarId).value = $Search
    $doc.getElementById($buttonId).click()
  }

Al ejecutar la función e invocarla de la siguiente manera:

Search-Youtube -Search "Trailer de la casa de papel"

Vamos a obtener lo siguiente:

Resultado de la búsqueda del trailer de la casa de papel

Happy scripting!

Comments