logo

midulive


Transcribed podcasts: 746
Time transcribed: 15d 5h 20m 39s

This graph shows how many times the word ______ has been mentioned throughout the history of the program.

Voy a crear un scrapper porque me quiero comprar una Xbox Series X y no hay forma.
¿Por qué? Porque duran muy poco, porque aparecen a la venta y muy rápidamente se agotan.
¿Por qué? Porque la gente estará muy atenta, está muy pila, como dicen en Venezuela, está muy pila.
Entonces, lo que voy a hacer es crear un scrapper y para ello voy a utilizar primero Playwright,
que ahora te explicaré que es Playwright.
También quiero intentar a ver si podemos utilizar las Netlify Functions.
Y finalmente, mi objetivo último es que cada vez que aparezca disponible la consola,
me envíe un mensaje y me llegue a mi celular o a mi móvil, si es español o española.
Entonces, ese es mi objetivo. Para ello vamos a empezar primero con Playwright.
Playwright, para el que no sepa lo que es, básicamente Playwright es una alternativa a Papetier.
Y si no sabes lo que es Papetier, no te preocupes que también te explico lo que es.
Entonces, tanto Papetier como Playwright lo que son, son como una API que te permite controlar el navegador
sin necesidad de que veas visualmente el navegador. Esto es lo que se le llama como headless, sin cabeza.
Entonces, tú lo que puedes hacer es controlar el navegador y hacerte pasar por un usuario
y tú con el control de la API le vas diciendo, vale, haz clic aquí, busca este texto, busca este selector, haz esto, haz lo otro.
Entonces, es muy parecido a como antiguamente teníamos cosas como Selenium, pero es muchísimo más potente.
Porque Selenium al final era como simular incluso el navegador.
En este caso es que es un navegador real. Es un navegador real que puedes controlar con Node.
Y eso es lo que vamos a hacer.
¿Por qué no utilizamos Papetier? Papetier está muy bien, pero los creadores de Papetier, por si no lo sabías,
se fueron de Google, se fueron a Microsoft.
Y en Microsoft han creado Playwright, ¿vale?
Es la alternativa a Papetier. Está basada, ya os digo, que los dos creadores de Papetier se fueron a Microsoft
y hicieron Playwright desde cero. Los dos son de código abierto, son súper parecidos.
Pero, en mi opinión, a mí personalmente me gusta mucho más Playwright, ¿vale?
Es menos conocido, pero también os digo que, aunque es menos conocido, tiene mejores decisiones de la API.
No digo que... O sea, esto es mi opinión.
¿Por qué seguramente pasó esto? Bueno, pues porque, claro, los creadores se dieron cuenta de dónde habían cometido los errores.
Y ya está. Así de claro.
Lo bueno de Playwright, por si no lo sabías, es que, aparte de que está disponible para JavaScript,
lo tienes también para Python, Java, .NET, y bueno, o sea, que tienes diferentes runtimes para cada uno de esos lenguajes.
En nuestro caso, vamos a utilizar Node.
Aparte de esto, Playwright es muy interesante porque también sirve como alternativa a Cypress.
Cypress, si no sabes lo que es, lo deberías saber, es un framework para hacer end-to-end, testing end-to-end.
Pues Playwright ya te viene con un montón de utilidades justamente para que puedas hacer también testing end-to-end.
De hecho, fíjate que por aquí Playwright te permite hacer testing end-to-end que sea fiable para aplicaciones web modernas.
Pero bueno, no solo, ya os digo, ya veréis que no solo sirve para esto, sino que sirve para muchas cositas más,
no solo para hacer end-to-end, pero fíjate que tenemos aquí el Playwright Library, lo podemos ver aquí.
Pues aquí es donde... Ah, no, el Playwright Libre es donde están las acertaciones y todo eso, assertions y todo esto.
No, no, pero sí, es aquí, ¿ves? Element Selectors.
Básicamente vamos a controlar nuestro navegador, lo vamos a controlar con JavaScript, lo cual, pues es brutal.
Así que vamos a hacer el Getting Started, vamos a empezar poquito a poco.
¿Ves? Esta sería la librería de testing, pero yo no voy a necesitar la de testing como tal.
Así que, vamos a ver si... ¿Ves? Aquí tenemos la librería más normal.
Estaría la de Playwright Test, que es la que te viene con las assertions, las formas de hacer comparaciones y todo este tipo de cosas, ¿ves?
Assertion Spec. Pues espera que esto exista, espera que no sé qué... Esto sería para dejar de utilizar Cypress y utilizar esto.
Una cosa que tiene muy buena, que no he explicado, de Playwright es que es compatible con Chrome, con Firefox y con WebKit.
Que creo que Puppetier está en beta para Firefox, no sé si ya ha dejado de ser beta, o igual ha dejado de ser beta, pero que yo recuerde no es compatible con WebKit.
Es compatible con Chromium, pero no es compatible con WebKit.
En este caso, Playwright sí lo que sería, y lo cual, pues lo hace que sea más interesante todavía.
Bueno, pues vamos a instalarlo.
Vamos a... ¿Cómo le puedo llamar?
Quiero una Xbox Series X.
Le voy a llamar así al proyecto, ¿vale?
NPM Init y para iniciar mi proyecto rápidamente.
NPM Install.
Vamos a instalar.
Playwright.
Vais a ver...
Bueno, voy a tener que ir revisando la documentación porque hay muchas cosas que yo, de memoria, desde luego, no me sé, ¿eh?
Pero...
Julio Burgo dice, se pudo comprar una Xbox el lunes.
Te odio, Julio.
Te odio.
Te odio.
Qué envidia.
Bueno, no sé si estará petando porque esto estará haciendo un montón de cosas por detrás, ¿eh?
Esto estará haciendo un montón de cosas por detrás.
No sé qué estará haciendo.
¿Cuál funciona mejor en Docker?
En Docker, por mi experiencia, funciona mejor Playwright también.
Por curioso que...
Y en M1, que es mi procesador, también funciona mejor.
Vale.
Pues parece que ya se ha instalado.
Vamos a irnos...
Voy a mover esto también a una...
Lo voy a mover por aquí.
Y así lo tengo disponible al ladito, por si tengo que estar revisándolo.
Vamos a abrir el editor.
Y comienza el partido.
A ver, vamos a empezar con un típico index.js.
Y vamos a...
Primero iniciar aquí.
Recuperamos Chromium.
Efectivamente, de Playwright.
Bueno, ya sabéis que a mí me gusta mucho instalarme Standard como el Inter.
Así que Standard.
Ponemos como modo desarrollo.
Y así, pues, me va avisando.
Me va avisando de las cositas.
Para configurarlo en mi editor, yo solo tengo que hacer Slim Config.
Decirle que esto tiene que salir de Stens.
No sé si con esto de Standard sea suficiente.
Vamos a ver.
Sí.
Qué maravilla.
Ya está.
Ya está, ya lo tengo arreglo.
Stens, Standard.
Y ya tengo el Inter configurado.
Vale.
Pues, para iniciar, lo primero que tenemos que hacer sería iniciar el browser.
Vamos a crear el browser.
Así que hacemos una wait de Chromium.
Y lo lanzamos.
Creo que por defecto es headless.
Pero bueno, no es importante ahora.
Y luego, al final, lo que tenemos que hacer es cerrarlo.
Esto, hasta ahora.
¿Vale?
A ver, ¿qué le dice aquí?
Ah, vale.
Esto es porque me dice, oye, ¿qué pasa aquí?
Que hay una cosa, no sé qué.
Bueno, esto es porque hay que poner un punto y coma.
Ya sabéis, cuando se empiezan con este tipo de cosas.
Y esto lo ejecutamos.
¿Vale?
Por ahora, lo único que voy a hacer es levantar el navegador y cerrarlo.
De golpe.
Pim, pam.
Esto, obviamente, no es muy útil.
Así que lo que vamos a hacer es que esto tenga más gracia.
Vamos a ir a una página.
¿Vale?
Así que para ir a una página, ¿qué harías en un navegador?
Pues tú, para crear una página, tendrías que hacer esperar que el navegador crea una nueva página.
Pum, ya está.
Fácil, ¿no?
Es así de sencillo.
Y luego le dirías a la página dónde tiene que ir.
Page, go to.
Y en este caso, vamos a ir ya a Microsoft, Xbox, Series X.
Creo que la propia página de Microsoft la vende.
Pero de vez en cuando está agotada, obviamente.
De hecho, mira.
Comprobar disponibilidad.
Comprobar disponibilidad.
Selecciona un distribuidor.
Agotado, agotado, agotado.
Todo agotado.
Vale.
Nos sale aquí el...
A ver, agotado.
En algún momento, en algún sitio he visto de la...
A ver, Xbox, Microsoft, Series X, comprar.
A ver si soy capaz de encontrar la página de compra.
Porque yo la he llegado a ver.
La página de compra de la...
De Xbox.
Y aparece...
No aparece esto.
Sino que aparece comprar y pone agotado.
No lo voy a encontrar, vaya.
Ahora me lo voy a encontrar.
Cago en la leche.
Bueno, ya encontraremos por ahí...
A ver, tenía por aquí lo del otro lado.
A ver si alguien había dejado el enlace de...
Microsoft.
Mira, esta es una.
Bueno, podemos hacer esta o esta.
Mira, imposible pillar una.
Esta tiene buena pinta.
Esta de aquí tiene buena pinta.
A ver.
Esta.
Mira, ¿ves?
Sin existencias.
Esta es la página que yo quería encontrar.
A ver si me peto todo esto.
O sea, si yo dejo esto y lo pongo aquí.
Vale.
Con esta URL ya tengo suficiente para el sin existencias.
Bueno, pues vamos a ir a esta página, por ejemplo.
¿No?
Y vamos a ver qué podemos hacer en esta página.
Page2.
Y, bueno, solo para...
Este es el típico ejemplo, pero para que lo veáis.
¿Vale?
Vamos a hacer aquí un screenshot.
Y ya está.
Bueno, y esto es nuestro primer script.
Gracias por venir al directo...
No, hombre.
Vamos a probarlo a ver si funciona.
Index.js.
Vale.
Vale, parece que no ha hecho nada, ¿verdad?
Pues mira, fíjate.
¡Anda!
Ya hemos visitado la página y le hemos hecho una captura de pantalla.
¡Ajá!
Esto significa que ya vamos a poder hacer cositas aquí.
Vamos a poder...
Es increíble esto porque puedes incluso hacer vídeos.
O sea, tiene un montón de historias.
Podrías hacer el vídeo de la navegación.
Se pueden hacer cosas muy, muy, muy, muy chulas.
Vale.
Entonces, ahora que tenemos esto, voy a buscar en la documentación porque...
También, obviamente, lo que queremos es selectores.
Por ejemplo, podríamos llegar a hacer clics a algún sitio.
Podríamos buscar un selector de texto.
Así que...
A ver...
Element Selectors.
Podríamos hacer una assertion.
La verdad es que está guay lo de la assertion porque en realidad podríamos buscar si tiene
un contenido en concreto.
Page Text Content.
O sea, podríamos hacer, por ejemplo, sin existencias.
Vale.
A ver dónde me ha dejado esto.
Espérate que tengo aquí otro editor abierto.
Cierro este y abro este.
¿Dónde estás?
El otro.
Ah, claro.
Es que esto es...
Este es el editor.
Bueno, pues eso.
Que me ha hecho un screenshot, ¿no?
Pero bueno, ahora mismo no es muy útil.
Pero lo que sí que puedo hacer, por ejemplo, ahora que sé cómo no estaría disponible...
O sea, podría decir recuperar el contenido content y haga page.textcontent y le podría
decir...
A ver, podría intentar buscarlo de muchas formas, ¿no?
Pero podría decirle este botoncito.
A ver si tiene un...
Mira, con area label, type button...
A ver, yo creo que tiene más sentido intentar utilizar el area label.
Porque todo lo demás es un poco raro, ¿no?
Type button...
Yo creo que tiene más sentido el area label porque, hombre, finalizar la compra del pack
yo no creo que la cambien.
Lo que pasa es que no sé si por area label...
Yo me imagino que sí.
O sea, yo creo que podríamos hacer area label...
Yo creo que podríamos hacer esto.
Y entonces, aquí lo que podríamos hacer es que esperaríamos que el content...
A ver...
¡No te autocomplete!
¡No!
¿Cómo podemos conseguir autocomplete de esto?
¿Cómo podemos conseguir autocomplete?
Yo quiero autocomplete.
¡Ah, qué rollo!
Es que este spec...
Ah, bueno, claro.
Igual es que me lo tengo que traer, ¿no?
El spec...
A ver...
Spec...
A ver si lo tengo aquí.
Spec...
No.
Igual es que me tengo que instalar el de las aserciones, ¿no?
Spec...
Mira, ya que estamos, vamos a meterle el TypeScript Check.
Para que se me queje de cosas.
Vale...
Ahora mismo no se me queja de nada.
Eso está bien.
Ah, ah, ah...
Es que este spec no sé...
Bueno, vamos a probarlo y ahora veremos si peta o no peta o lo que sea, ¿vale?
O sea, a ver si este spec de aquí es global o es que hay que importarlo o lo que sea.
A ver qué pasa.
¿Ves?
Petar no peta.
Ah, sí.
Petar sí peta.
Spec is not defined.
Vale, pues venga, vamos a ver dónde tenemos que instalarlo.
Al final me parece a mí que vamos a tener que instalar el spec library.
Aquí tienes started, spec...
Claro, al final sí que vamos a instalar lo del playwright test este, ¿eh?
Al final sí que vamos a instalarlo.
Porque yo creo que nos va a simplificar bastante.
Al final como son test, ¿qué más da?
A ver, que también podríamos hacerlo como si fuese un true.
O sea, content, include, ¿sabes?
Podríamos hacer esto, que tampoco es importante...
Sin existencias.
Vale.
Vamos a probar esto.
Luego ya nos peleamos con lo del expect y todo esto.
True.
¿Ves?
Ahora ya nos ha dicho que no tiene.
O sea, sin existencia significa que ya sabemos que no tiene.
O sea, que efectivamente no tenemos stock.
De esta forma lo que podríamos estar haciendo constantemente es revisar si tenemos o no tenemos stock.
¿Vale?
O sea, lo que podemos decir es...
Vale, pues esto quiere decir...
Has stock.
Pues quiere decir que content.includes.
Sin existencias.
Es igual a false.
Tiene stock en el caso de que el sin existencias no esté en este botoncito.
Ya está.
Ese sería el tema.
Bueno, a ver, espérate.
Vamos a ver qué tiene el content.
Pero yo creo que este content debería tener el sin existencias.
Content, sin existencias, has stock.
Mira, vamos a hacer esto por aquí.
Pa, pa, pa, pa.
Y vamos a poner has stock.
Y ya está.
Oye, pero ¿cuánto hemos tardado?
Si no hemos tardado ni 15 minutos en hacer...
Mira, ¿ves?
El contenido del botón es sin existencias.
Por lo tanto, has stock false.
Ya está.
Pinto pelota.
Ya sabemos que esta página, la de Microsoft, pues no tiene stock.
Esto lo podríamos hacer aquí.
Ya tendríamos el primero.
Ahora podríamos seguir yendo, ¿vale?
Podríamos hacer URL.
Vamos a poner esto.
No.
O Vendor o Shop.
Microsoft.
¿Vale?
Content.
Pues es que podríamos seguir haciendo esto.
Por ejemplo, ahora nos podríamos ir a...
De hecho...
¿Cómo podríamos hacer esto?
¿Sabes?
¿Cómo podríamos...
¿Cómo...
Podríamos pasar la página o podríamos crear una página para cada una?
Yo creo que podríamos hacer eso, ¿no?
O sea...
Shops.
Podríamos tener...
Podríamos tener...
Podríamos tener...
Eh...
Shop.
Microsoft.
URL.
Pues esta sería la URL.
Eh...
Check stock.
Y tendríamos que pasarle.
En todo caso, le podríamos pasar el browser para que cree una nueva página.
¿No?
Browser.
El browser crea una nueva página, porque no hace falta que lo haga...
¿Sabes?
Que lo haga en la misma página, exactamente.
Eh...
Entonces, esto tenía que ser una sync.
Check stock.
Y hacemos así un return.
Has stock.
Para hacer esto, podríamos primero ver el contenido.
Una vez que crea la nueva página, miramos si tiene contenido.
Eh...
Tendrá stock si hace esto.
Y devolvemos el has stock.
Este...
Caso.
Shops.
Para hacer esto, podríamos hacer shops.
Eh...
Map.
Shop.
Y de este shop, haríamos shop.checkstock.
Return.
Y lo tenemos que pasar el browser.
Estoy pensando un poco ya en escalarlo, ¿vale?
O sea, básicamente.
Y en este caso, a ver, podríamos hacer un promisol.
Esto lo veremos...
Por ahora no es muy importante.
Luego lo escalaremos otra vez.
Pero por ahora vamos a hacer esto así.
Vale.
Y esto que devuelva esto...
A ver.
Es que esto me lo ha cerrado ahí porque le ha dado la gana.
Y este page ya no sirve para nada porque cada tienda nos va a crear una.
Y aquí tendríamos todas las tiendas, ¿vale?
Vamos a ver si esto funciona.
Ahora no me va a salir tanta información como antes.
Vale, vale, vale.
A ver qué le ha pasado aquí.
Ah, porque este promisol no le he puesto una wait.
Y ha cerrado ahí...
Creo que es esto.
New page browser club.
Claro, ha sido eso.
No he hecho una wait del promisol.
Y ya está.
Aquí no estoy yendo a la página, ¿no?
Goto.
A ver, le podría pasar la URL como parámetro o podría utilizar list, pero entonces tendría
que cambiar unas cuantas cosas.
Así que vamos a pasarle la URL por parámetro.
Otro, porque total la tenemos aquí.
Y ya está.
Esperte a string y got object.
Ay.
Perdón.
Le he pasado un objeto.
Vale.
Navigation fail because page was closed.
Es porque no he puesto la wait en algún sitio.
Aquí.
Vale.
Siempre todas las acciones que hacéis del navegador, todas las acciones, todas son asíncronas.
Todas.
Vale.
Hostia.
Pues no me ha puesto el console.log.
Ah, no me ha puesto el console.log porque básicamente aquí yo tendría que poner...
Tendría que poner...
Claro, es que una cosa que estoy pensando es que en lugar de devolver esto, vamos a devolver
aquí el hash stock, obviamente.
Y por otro lado, el shop, que sea shop, shop, shop, shop.
Vamos a poner info en lugar de shop.
Shop info.
Vamos a ponerle aquí name.
Bueno, vamos a poner shop.
No pasa nada.
Shop name.
Esto lo cerramos aquí.
Token await.
Token await.
Aquí es que me ha faltado un...
Aquí.
Para cerrar.
Bueno.
Vendor tiene más sentido.
Bueno, igualmente me está petando.
Vendor.
Vendor.
En lugar de name.
Vendor.
Vendor.
A ver, al final...
Tenemos que llamarle de alguna forma al tema este.
Shop.vendor.
Vale, espérate porque ahora todavía esto no le ha terminado de gustar.
Results.
Results.
A ver, ¿qué es lo que no me gusta?
Users bigger to...
Ah, es que hash stock este.
Esto hay que hacerle una wait.
Hay que hacerle una wait también.
La madre que me parió.
Claro, por eso había puesto yo el promisor.
En realidad aquí.
Porque quería esperar todos los hash stocks.
Y ya está.
Entonces...
A ver, es que si los hago así a cholón y me pongo a abrir páginas, puede ser un poco...
¿Sabes?
No sé si hacerlo uno por uno.
Y ya está.
Tampoco hace falta que sea en miga...
¿Sabes?
De hacer tres páginas en paralelo.
Porque al final incluso puede tener problemas a la hora de gestionar la memoria.
Porque esto lo vamos a intentar ejecutar en una lambda function.
Así que no sé si hacerle más bien un for await o algo así.
Para evitar...
Para hacer...
Para evitar esto.
A ver...
A ver si tengo por aquí.
Podría hacer un for of.
Y ya está.
Y hacer una wait.
O sea, hacemos aquí en for.
const.
Shop of shops.
Y vamos una a una.
Y ya está.
Que no pasa nada.
Hostia.
Qué grande, ¿no?
Pero joder.
Con el hack of pilot.
Es la hostia.
A ver.
No está del...
No, sí, sí.
O sea, está bastante bien.
Has stock.
El browser.
Joder.
Check stock.
Vamos a sacar todo del shop.
El vendor y el url.
Así es mucho más fácil.
Y lo vamos a entender mejor.
Y aquí vamos a hacer el console log.
Es que me gusta hasta más.
Me gusta más incluso lo que ha hecho él.
Que lo que iba a hacer yo de poner el objeto.
Vale.
Así.
Lo hará uno a uno.
E iremos viendo los resultados de cada uno.
Vale.
Microsoft.
Vale.
Está bien.
Off stock.
Vamos a poner la cara triste.
Y aquí una...
Súper contento.
Esta.
Bueno.
Ya le hemos cambiado un poco el tema.
Y ahí iremos viendo uno a uno.
Vale.
Pues ahora ya podemos añadir el siguiente.
Vendor.
Game.
Url.
Vamos a por el game.
Producto no disponible.
Venga.
Xbox Series Controller X.
Hostia.
¿Qué pasa que solo lo venden con controlador esta gente?
¿Qué ratas son?
Dios mío.
Lo venden con controlador a posta.
La venden con...
¿Sabes?
O sea, no la venden pelada.
¿Qué ratas?
¿Será verdad?
¿Qué ratas?
¿Será verdad?
A ver.
¿Dónde están las cosas?
Consolas.
Xbox Series X.
¿Qué?
O sea, no existe.
O sea, no existe sin mando.
Te lo tienes que comer con mando obligatorio.
Vale.
Muy bien.
¿Qué hacen los emojis?
Hombre.
Pues, claro.
Punto pelota.
No hacen nada más los emojis.
Check stock.
Bueno.
Lo bueno de lo que hemos hecho aquí es que a partir de ahora lo que podemos ir haciendo
aquí todo el rato es ir añadiendo y ya está.
¿Vale?
Y si creas una función fuera del array con check stock y simplemente le pasas los parámetros.
¿Fuera del array?
Que se llama check stock.
Simplemente.
Y para no repetir código.
No entiendo muy bien qué quiere decir de que saque la función fuera del array con check stock.
No sé qué quiere decir exactamente.
A ver.
Seguro que no me importa en este caso repetir un método que tenga el mismo...
O contrato.
No me importa mucho, la verdad.
Por mi experiencia, si lo vas a lanzar a una lambda, mejor subirle la reserva de memoria
aunque no haga falta.
Sí, no te preocupes.
FJ de la rubia.
Sí hay...
Mira.
Te voy a explicar una cosa.
En Fotocasa creamos el critical CSS.
Si miramos aquí...
Bueno, no.
Porque solo lo hacemos para móvil.
Vale.
Pues aquí este critical CSS lo generamos con lambda functions también.
Y lo hacemos...
Y sí, le subimos la reserva de memoria aunque no haga falta porque va más rápido y tal.
De hecho, es un truquillo que le comentaba a la gente de GitHub en GitHub Stars porque
estaban haciendo con ella OKImage y estaban teniendo un montón de problemas.
Y me dijeron que sí, que también lo sabían.
O sea que...
Pero gracias por avisarme, ¿eh?
Muchas gracias.
Vale.
Este caso...
Vale.
Lo que sí que podríamos hacer a lo mejor lo del new page y todo esto, esto sí que lo
podríamos sacar fuera para no repetirlo.
¿No?
O sea, podríamos crearle aquí la página y en lugar de pasarle el page...
En lugar de pasarle el browser, le pasamos el page.
¿Vale?
Y así, pues más fácil.
Page.
Y aquí, pues, el page.
Y le podemos quitar esto.
Esto igual tiene más sentido.
El goto...
También se podría repetir.
Entonces, a lo mejor también le podríamos poner más bien aquí.
Pero...
No me preocup...
A ver.
Tiene sentido.
Lo que pasa es que, bueno, luego se pasa el page y cada uno hace una cosa.
Pero bueno.
Así no repetimos tanto.
¿Vale?
Y así no le tenemos que pasarle la URL y ya está.
Page.
Y el URL.
Pues le pasamos el page para que haga todos los chequeos y ya está.
Y ya está.
Esto por aquí.
Y...
En el...
Vale.
Ahora hacemos un poco...
En este caso...
Aquí podríamos devolver un retorno aquí directamente.
No hace falta que hagamos eso.
Eso era para que lo leyeseis mejor.
Ahora sí, con el await.
Del Xbox Series X.
Pam.
Vamos a ver.
Producto no disponible.
Product Quick Actions.
Vale.
Vamos a ver este Product Quick Actions.
Vale.
Solo hay uno.
Perfecto.
Solo hay uno.
Voy a asegurarme, porque como esta página tampoco nos la conocemos muy bien.
Voy a asegurarme.
Voy a ir a otro producto que sí que esté disponible un poco para ver cómo sería el...
Bueno, PlayStation 5 seguro que no está disponible, pero bueno.
También está agotadísima.
¿Vale?
Aquí saldría Comprar.
Vamos a ver este Quick Actions.
To View By Price.
De hecho, mira, eso es una cosa que podríamos hacer.
Luego lo pienso esto.
Vale.
Product Actions.
Vale.
A ver, vamos a quitar esto.
Vamos a hacer esto.
Vale.
Solo uno punto inner...
Vale.
Como solo tiene uno, pillamos uno y punto inner text.
Text content.
What?
Vamos a ver.
A ver, aquí estoy flipando.
¿Por qué?
Comprar.
Avísame.
Vale, vale.
Text content.
Vale.
Perfecto.
O sea, que en este caso, hacemos el page punto text content.
Y esto, a ver, me gustaría mejor tirar de un área.
Pero como no puede ser, porque nosotros no controlamos esto, pues lo vamos a tirar del
Product Quick Actions.
Este de aquí.
¿Vale?
Y ¡pum!
Pillamos de aquí.
Pillamos el text content.
Y nada, miramos el text content.
Pensad que ahora miramos texto, pero en alguna puede ser que tengamos que mirar una imagen.
O cosas así, ¿vale?
Entonces, aunque parezca que sean muy similares, yo prefiero repetir, en este caso, métodos.
Porque las páginas pueden ser muy diferentes.
Y entonces, intentar hacer...
Intentar hacer, a veces, desde el principio, una abstracción.
Porque, ostras, es que aquí solo cambian los dos textos.
Puede ser un poco peligroso, porque luego puede cambiar bastante.
Pero bueno, si luego te das cuenta después de hacer 20, que es así, pues entonces sí,
no pasa nada.
Pero por ahora prefiero hacerlo así, porque vamos más seguros.
¿Vale?
Entonces, producto no disponible.
En este caso...
Hacemos punto cero...
Text content...
Producto no disponible.
Producto no disponible.
False.
Venga, vamos a ver si no funciona de nuevo.
Ya tenemos el Microsoft.
Y Game.
Out of stock.
Para asegurarnos que realmente esto hace lo que tiene que hacer,
podríamos aquí cambiar esto y poner el de...
El de una...
Uno que sí que está.
Vamos a ver si en Game, ahora me dice que hay stock.
¿Ves?
Ahora me dice, eh, que el Game tiene stock.
Pero es mentira.
Esto es porque estaba mirando la camiseta del FIFA 22.
Bueno, ¿cómo estáis?
Mejor hacer mal y después refactorizar que intentaré hacer todo bien de primeras.
Estoy totalmente, totalmente de acuerdo.
Totalmente de acuerdo, eh.
Bueno, os enseño la casilla.
Hacemos un recap, ¿vale?
Hacemos un recap rápido.
Estamos haciendo un scrapper que me va a decir cuándo está la Xbox Series X disponible de una puñetera vez.
Entonces, ¿qué es un scrapper?
A ver, un scrapper, básicamente lo que es, es una técnica...
Es que scrapper, scrapper sería el que hace la técnica.
El web scrapping, ¿vale?
Es como una técnica que se utiliza para, pues nada, mirar o extraer información o datos de una página web
y normalmente lo que hace es simular la navegación de un usuario real para conseguirlo.
Puede ser cualquier cosa.
Por ejemplo, en realidad lo que hace Google a la hora de tener sus resultados en su buscador
es básicamente, le llama crawler, pero un crawler al final lo que hace es web scrapping.
Lo que es esta técnica, ¿no?
Extrae información haciéndose pasar por un usuario, básicamente.
Y lee la información y dice, hostia, ¿qué título tiene?
¿Qué descripción tiene?
¿Qué contenido tiene?
Todo esto.
Y nosotros estamos haciendo algo similar.
Estamos haciendo esta técnica de web scrapping con la que podemos conseguir justamente extraer información
de las páginas que visitamos.
En este caso estamos utilizando una librería que se llama PlayWrite
y aquí tenemos un array con todas las tiendas que vamos a estar revisando.
Y ahora, lo que tenemos por aquí es que si el vendor, en este caso el vendor de Microsoft,
su URL es esta y tenemos un método que nos va a revisar si tiene stock.
Recibiendo la página miramos si este elemento que tiene el área label finalizar la compra del pack,
pues para ver si tiene el texto sin existencia.
Si lo tiene, es que pues nada, no tenemos stock.
Pero si no tuviese este texto significa que ha cambiado esta página, ¿no?
O sea, si yo me voy a la página aquí de Microsoft, puedo ver este sin existencias, no le puedo dar.
Pero en cuanto este botón cambie, significa que tiene existencias.
Y entonces, en lugar de yo estar como estoy, que llevo una semana como un loco aquí constantemente,
buscando a ver si soy capaz de conseguir una Xbox Series X, pues esto lo voy a automatizar, ¿vale?
¿Por qué?
Porque somos dioses andando entre mortales.
No, en broma.
Porque somos desarrolladores.
Y entonces, todo lo que podamos automatizar, pues lo tenemos que automatizar.
¿Ok?
Así que ese es el tema.
Dicho esto, ya tenemos el de Microsoft y tenemos el de Game, ¿vale?
Game es una tienda española y vamos hasta URL y revisamos otras cosas.
Y aquí tenemos un poquito este código.
Me estoy riendo todavía de lo de que somos dioses caminando entre mortales.
¡Ay, qué risa!
Claro que voy a subir el repo, sí, sí, claro que sí.
Ah, mira, también el Twitter de Xbox te avisa cuando hay stock.
Vale, bueno, bueno, pues lo tengo en cuenta.
Entonces, nada, iniciamos un browser.
¡Ah! Una cosa súper buena para que veáis que esto es la bomba.
Fíjate, aquí en Launch le podemos poner Headless, le podemos poner a False,
y fíjate cuando ejecutemos nuestro programita lo que va a hacer.
Esto es lo mejor que tiene.
Le vamos a dar y nos inicia el navegador y vamos viendo cómo lo va haciendo.
¿Has visto? Esto está súper chulo.
Que, por cierto, de cada página yo creo que la deberíamos cerrar.
¿Cómo se cerraba? Yo creo que es page.close.
Aparte del browser deberíamos cerrar las páginas.
Page, page, page, page.close.
Sí, page.close.
Después de mirar si tiene stock o no tiene stock, aquí podríamos hacer page.close.
Bueno, no tiene mucho sentido que se quede abierta.
Pero bueno, esto está bien porque así podemos ver si realmente, si vemos algún problema,
podemos ver qué es lo que está haciendo.
Incluso podemos hacer que empiece a simular clics, historias para buscar.
O sea, podemos simular un usuario.
O sea, es increíble, es increíble esto, es la hostia.
Vale, aparte de game, vamos a ver qué más tenemos por aquí.
Estos dos ya los tenemos.
Ya se puede reservar.
Vale, en game suele estar, en xbox suele estar.
A ver lo que duran, eso me pregunto yo.
En fnac también están.
Vale, esto lo miramos ahora.
En game, game.
Media market también está.
Venga, pues vamos poniendo.
Mira, ¿ves?
En este caso, este artículo no está disponible.
Por lo mismo, es que ya repetir, es ir repitiendo.
Esto es ir repitiendo.
Pero a Dios pongo por testigo que voy a conseguir mi consola.
¿Vale?
Aquí están los límites legales del web scrapping.
Porque también se pueden bloquear por muchas requests y tendrías que usar timeouts, proxies.
A ver, límite legal.
La verdad es que yo considero, yo considero que yo no soy juez.
O sea, me cuentas, ¿no?
Pero yo creo que tiene sentido.
Para eso normalmente deberían existir robots que deberían bloquear y tal.
Yo creo que en este caso entra dentro de un...
O sea, no le voy a hacer un ataque.
Lo voy a mirar cada 10 minutos.
Pero, hombre, límites legales.
Pues si haces scrapping como para, básicamente, tirar abajo una web.
O para robar contenido y copiarlo en otra página y cosas así.
Hombre, yo creo que sí que puede ser.
Pero simular que eres un usuario para visitar una página.
Yo no creo que debería haber ningún problema legal.
Ahora que le interese que lo haga por X motivo, obviamente puede ser que no le interese.
Pero no creo que sea ilegal como tal.
Bueno, y sí, te pueden bloquear por muchas requests.
Pero si tienes cuidado, puedes hacer bastantes cositas, ¿vale?
Es mejor que con PapiTier.
Para mí sí.
¿Vale?
Saludos de Colombia, dice Sebas.
Estará este vídeo en YouTube, ya lo he dicho.
Cabe aclarar que la técnica de scrapping es una solución al problema de que no exista una API pública de esos sitios web.
Obviamente.
A ver.
Sí y no.
O sea, normalmente lo que dice Asdolo es totalmente cierto, ¿no?
Que claro, estamos haciendo scrapping porque estas webs no tienen una API pública que me digan exactamente si tienen stock de la Xbox Series X.
Sería brutal, ¿no?
Ya poder hacer esto.
Pero también hay veces que aunque existiese una API, pensad a lo mejor que yo quiero mirar ahora 50 webs diferentes.
Puede ser que por X motivo me interese más hacer un scrapping en el sentido de tener una API única que yo controle desde otro canal,
que no el tener que tratar con 50 APIs distintas, con X motivos y posibilidades de que me cambie la versión y tal.
Que también esto tiene, cada una tiene sus ventajas y sus ventajas, ¿eh?
Pero yo he visto, y lo sé porque yo he trabajado en una empresa que utiliza mucho tema de scrapping,
tanto para noticias como para temas de vuelos en aeropuertos y eso,
que había compañías que te daban una API para conseguir sus artículos y nos daba igual.
Utilizamos scrapping igualmente.
Aunque ellos tenían una API.
¿Por qué?
Por mil millones de razones.
Que nuestras, era, nos salía mejor hacer scrapping que utilizar las APIs.
O sea, que tienes razón, pero que no siempre tiene por qué ser así, ¿eh?
¿Qué curso de React hago?
Si quieres un curso de React, mejor el de React desde cero.
Y si no, el de Bookcam.
El de Bookcam es más general, ¿vale?
¿Vas a subir el repo?
Sí, vamos a subir el repo.
Vamos a subirlo ya.
Vamos a subirlo ya, que si no luego se me olvida.
Y la gente...
Vamos a crear...
Voy a intentar crearlo.
Repo.
A ver.
Repo.
Create.
Venga, voy a intentar crear un repositorio desde la terminal.
Venga.
Si soy capaz.
Ah, vale.
Pensaba que...
Vale, porque esto es para crear el repositorio.
Vale, tengo que hacer un git init.
Git init.
Vale.
Y ahora sí.
GH es de GitHub.
Repo.create.
Pensaba que a lo mejor me inicializaría directamente el repositorio.
Igual había alguna forma de hacerlo aquí, ¿no?
No.
Vale.
Repo.create.
Quiero un Xbox Series X.
De verdad, quiero una Xbox Series X.
Vamos a hacer que sea público.
This will add an origin git remote.
Sí.
Me parece bien.
Vale.
Y ya está.
¡Wow!
Súper genial, ¿eh?
Genial.
Ahora vamos a añadir al git ignore el node modules.
Git ignore.
Vamos con el node modules.
Esta imagen la vamos a quitar.
De hecho, quería hacer de cada uno page.screenshot.
¿Vale?
Y de este vamos a ponerle que el screenshot sea vendor.png.
Creo que era esto ahora sí.
Vamos a ver si esto funciona.
No.
Esto.
Esto sí.
Path.
Page.
Screenshot.
Hacemos una wait.
Y vamos a poner aquí screenshots vendor.
Screenshots.
Y aquí vamos a añadir un git keep.
Esto es porque quiero que esta carpeta, aunque esté vacía, que me la mantenga.
¿Vale?
Bastante interesante esto.
Porque si no me eliminaría esta carpeta y no me la subiría al repo.
Entonces, el git ignore, ponemos en node modules y voy a dejar, y voy a quitar la, o sea, screenshot, tampoco la quiero subir.
O sea, no quiero subir los archivos, lo que no quiero subir.
Eso es lo que no quiero subir.
Quiero subir la carpeta para que esté la estructura, pero no quiero subir los archivos.
¿Vale?
Añado todos los archivos.
Vamos a hacer que esto sea fit.
First version of the scrapper.
Pusheamos.
¿Vale?
Y repo open view.
Creo que esto me debería abrir el...
Vale.
Web.
Y me abre mi repositorio directamente.
¿Qué os parece esto?
Esto está chulo, ¿eh?
Que hemos visto, hemos abierto, hemos creado un repositorio de GitHub desde la terminal.
Estas cosas, a ver, yo no quiero hacer publicidad porque me sabe mal.
Pero estas cosas las aprendería si tenéis mi libro de Aprendiendo Git desde cero.
Que además creo que mañana tengo que escribir un poquito más, pero mañana voy a intentar publicar una nueva versión.
Pero ya tiene 224 páginas, ¿eh?
O sea, 224 páginas.
He visto libros que te intentan enseñar un lenguaje de programación con menos de la mitad de páginas.
Así que, vamos.
Y yo te estoy enseñando Git y un montón de trucos y un montón de historias.
Vale.
En Rimi...
Para conseguir una Xbox Series X.
Pues eso.
Que está la cosa complicada.
Añadimos este Rimi por ahora.
Me lo traigo por aquí.
Y luego ya le daremos.
Os paso el repo.
¿Vale?
¿Cada cuánto vas a revisar?
No sé, ya veremos.
A ver.
Ya veremos.
¿Está hecho con Cypress?
Eh, no.
No está hecho con Cypress.
Ya hemos comentado antes.
Pero la verdadera pregunta que se queda sin resolver.
¿Para qué quieres una Xbox Series X?
Para peinarme.
No te jode.
Pues para jugar.
¿Para qué la voy a querer?
Neble.
O sea, para jugar.
¿Por qué abre el browser y no un simple fetch?
¿Por qué abre el browser y no un simple fetch?
Porque, hombre, si quieres simular realmente que eres un usuario, tienes que abrir el browser.
Un fetch al final lo que te devolvería es como hacer un curl, ¿no?
Un curl de HTTP, yo qué sé, pues por ejemplo esta página.
Que se podría hacer también.
Pero yo considero que con este tipo de simulación es bastante más posible.
Que simule mejor un usuario, ¿no?
O sea, tú haces un curl, pues tendrías aquí todo el string.
Esto sería como hacer un fetch.
Pero no es lo mismo.
Ta-ta.
También podría reutilizar la página para que parezca una navegación más normal de un usuario.
Vale, me da igual, la verdad.
Y no usa Selenium.
A ver, Selenium, a día de hoy, a no ser que ya lo estéis usando por un tema histórico,
Selenium no tiene sentido.
¿Me habéis dicho Selenium 80 veces?
Si me está...
A ver, no quiero decir que esté deprecated.
Pero es que ya es un entorno que ya no tiene tanto sentido.
Tenía sentido...
Mira, última versión estable.
2018.
O sea, no sé, no sé.
¿En qué estáis jugando?
De verdad.
Selenium ya llovió, ¿vale?
Ya llovió.
O sea, es que tiene mucho más sentido no utilizar Selenium cuando tienes herramientas
como Playgrove y Pappetier.
Que en mi empresa usamos Selenium todavía porque tenemos procesos muy antiguos que lo
usan y no se han migrado.
Que está bien.
Pero no voy a ponerme a utilizar Selenium a día de hoy porque tiene un montón de problemas
que están de sobra solucionados con estas herramientas.
Venga, que os leo ahí rápidamente.
Yo estoy haciendo algo parecido con Cypress para pedir cita del SEPE.
¿Cómo vas a hacer lo de ejecutarle una lambda?
Pues ahora lo miraremos.
¿Qué pasa con Captcha que te pudieran salir?
Pues que está jodido.
Si te sale un Captcha, estás jodido.
Espero que no me salgan.
Así de claro te lo digo.
¿Lo vas a streamear lo del SMS?
Sí, sí, la baldi.
Vamos a hacerlo todo.
Ya aquí hemos hecho un buen rato.
¿Qué opinas de visualscodio.def?
¿Yo lo has usado?
Sí, pero bueno, está bien.
Pero muy parecido al punto de GitHub.
Es parecido a esto que ya teníamos anteriormente.
Me parece increíble.
Me parece súper bien.
Pero que ya no sorprende tanto porque ya teníamos este Visual Studio Code aquí.
Que solo dándole al punto ya te lo abría.
Pues ya está.
¿Te instala Chromium si deseas usar Firefox o te instala también o hay que pasarle el pad del ejecutable?
Buena pregunta Tom y Melo.
Yo creo que sí que te lo instala.
Lo podríamos mirar rápidamente.
No sé si te lo instala.
Yo creo que sí que te lo instalaba.
Pero puede ser que detecte automáticamente si lo tienes instalado y entonces no te lo instale.
Pero yo creo que al menos antes te lo instalaba.
Fíjate con las pocas líneas de código.
Lo que hemos conseguido en tan pocas líneas de código.
Vale.
Vamos a quitar todo lo que sea mierdecilla.
Y nos quedamos con esto.
Esto por aquí.
Xbox Series X.
1 Tera.
Vamos a ver.
Este artículo no está disponible.
¡Ah, mira!
¡Gracias!
¡Gracias, Media Market!
¡Gracias por dejar tus data tests!
¡Me encantan!
¡Me encantan!
Mira, text content.
Vamos a hacer lo mismo.
Text content.
Pero aquí vamos a poner...
Data test.
¡Qué bien!
¡Qué bien!
Ni siquiera le hace falta que esté...
¿Sabes?
No está...
¿Sabes?
Puedo poner...
No está disponible.
Actualmente.
Content.
Y para que esto vaya más rápido...
Vamos a poner esto por así.
Y vamos a poner esto por aquí.
¡Oh!
¡Chun, chun, chun!
Este es un problema.
¿Ves?
Media Market, por ejemplo,
tiene más cuidado con el tema de los scrapers.
En este caso.
La verdad es que dice...
Estos soluciones van a ser más rápido.
Yo creo que esto tendrá más que ver con el user alien.
¿Vale?
Seguramente el user alien que estoy utilizando...
De hecho, lo podemos mirar.
Pero mira, ahí vamos a encontrarnos con el primer problemilla.
El user alien que estemos utilizando sea bastante ñe.
De hecho, vamos a...
Vamos a esperar aquí...
Vamos a esperar en algún sitio...
Es que me gustaría que se quedase...
Bueno, a ver.
Lo podría haber hecho ahí también.
Espérate.
Tira para atrás.
Tira para atrás.
Y ahora le cambiamos el user alien.
Vamos a ver otra vez el error.
Pim, pim, pim, pim, pim, pim, pim, pim, pim.
Ah, pues no.
El user alien está bien, ¿eh?
Pues, ¿por qué será que no...
Que me lo ha pillado tan rápido?
¿Cómo lo estará detectando?
A void...
Detect...
Porque pensaba que a lo mejor el user alien ponía...
Esto suele pasar, ¿vale?
Papetier y todo esto.
Usted dice...
¿Eh, user alien es tal?
Igualmente ha habido un momento que lo ha cargado el cabrón.
O sea que al principio...
Bueno, ahora ha hecho el timeout, ¿eh?
¿Ves?
Al final, claro.
En lugar de estar esperándose todo el rato...
A void...
Detect...
Papetier...
As...
Bot.
Voy a poner papetier, a ver.
Vale.
También puede ser que estén mirando el tema de...
De las cookies, por ejemplo.
Vamos a mirar.
Vamos a mirar.
Y si no, un proxy.
Eso sería otra.
Bueno, ya veo que me da market.
Por ahora, caca.
A ver, os voy leyendo.
A ver si a alguien se le ocurre.
Alguna.
Pero ya os digo que si...
Aunque intentésemos darle un clic, eso no colaría.
Vamos a seguir mientras con el FNAC.
Ah, Amazon también.
Amazon.
Amazon.
Amazon.
Check stock, page.
Vale.
El FNAC.
Y el corte inglés.
Y el corte inglés.
FNAC.
Yo creo que de aquí...
Me puedo quitar todo esto.
No disponible en tienda.
Yo sí que estoy agotado de que no me dejéis comprar la consola.
Mira.
Buy.
Class.
Buy box.
Buy box.
I believe it.
A ver aquí.
Esto que ocupa...
Pues yo creo que esto...
A ver, que también podría mirar directamente si es que...
Si existe.
¿Sabes?
O sea, podría mirar en la página si existe el elemento y ya está.
Vamos a hacerlo.
Vamos a hacer esto.
En lugar de assertions, podría enfocar el query selector.
Estoy mirando las aserciones.
Inner text attribute value.
Estoy mirando a ver cómo se puede mirar si existe.
¿Vale?
Porque veo aquí muchas de innerHTML.
Is visible.
A ver, is visible.
Puede ser.
Pero yo lo único que quiero saber es si existe.
También se pueden hacer evaluaciones.
Que esto está bastante chulo.
Puedes hacer un page.evaluate.
En el evaluate, tú aquí lo que haces directamente sería...
Sería ejecutar el javascript que te diese la gana.
Eso está bastante chulo.
Evaluate, evaluate.
No, pero lo que me gustaría es solo ver si existe.
¿Sabes?
Algo parecido a lo que hace Cypress.
Selecting quick white.
¿Ves?
Aquí tenemos los clics, pero no quiero hacer un clic.
Lo único que quiero es seleccionarlo.
Page.
Click.
Selecting elements.
Visible elements.
There are two ways of selecting visible elements.
Vale.
Click.
Data.
Text.
Papi.
Papi tierno.
Play right.
Check if element exists.
A ver, si no, al final lo que puedo hacer es con el evaluate.
Directamente.
Claro.
Ah, mira, claro.
Este, fíjate.
¿Veis esto que es el...?
Esto funciona exactamente igual como lo hacemos en las herramientas de desarrollo.
Claro.
Entonces, al final lo que podríamos hacer, por ejemplo, aquí.
Check stock.
Async.
Le pasamos la página.
Y aquí lo que podríamos hacer es not available icon page punto.
Intentaríamos recuperar esto.
Y solo tendríamos que mirar return.
Not available icon.
O sea, en este caso, vamos a probar a ver si Leftnack nos deja scrapear.
Pero en este caso, lo que estaremos mirando más bien sería el icono.
Con lo bien que haya ido al principio.
Vale.
Out of stock.
¿Vale?
O sea, lo que estamos mirando es si existe el icono.
Para revisar que esto nos funcione bien, lo que podemos hacer, lo que hemos hecho antes.
Nos vamos a cualquier producto que sí que esté disponible.
Como por ejemplo, este.
¿Vale?
Y este lo ponemos aquí.
Y este nos debería decir, oye, que sí que está disponible.
Y ya está.
Ya tendríamos la de Leftnack también.
Pues no.
No nos ha dicho eso.
Vamos a ver por qué.
Pero bueno, está bien.
¿Ves?
Siempre hay que probar que las cosas no...
Igual está el maldito elemento ahí, pero oculto.
Pues no.
Bueno, es que esto devuelve un array.
Claro, cuando haces el punto este, devuelve un array.
Que claro, si devolvemos esto, aquí debemos hacer NotableableIcon.length.
Debería ser...
Tendría que ser cero, ¿no?
Para que tuviese stock.
Imagino que también esto...
Out of stock.
Aquí sí que me da true.
¿Por qué me está detectando esto?
Vamos a ver qué tiene el NotableableIcon esto.
NotableableIcon.
Xbox Series X.
Y ahí veo que no está disponible.
¡Ay, la madre que me parió!
¡La madre que me parió, parió!
NotableableIcon.
Ahora ya sé por qué no me estaba funcionando.
Porque siempre hay que hacer una wait.
Mira que lo he dicho, ¿eh?
Mira que lo he dicho.
Mira que lo he dicho y no...
Nada, que no me hago caso ni a mí mismo.
Vale.
Todo.
Siempre hay que hacer una wait.
Es que siempre todo devuelve promesas, ¿vale?
Cuando haces un selector, cuando haces un click, cuando haces lo que te dé la gana.
Todo, todo, todo.
¿Vale?
Ahora sí que me debería parecer que no tiene stock.
Y...
¿Vale?
Out of stock.
Ahora esto sí que está funcionando.
Ya tenemos uno más, ¿vale?
¡Ay, que es que ni yo me escucho!
Siendo e-commerce, podrías hacer la misma consulta para todos esos.
Si tienen datos de marcado para ver si tienen de stock.
De esta manera no te placerías con los sectores de clases.
Dice Floflix24.
Eso es bastante curioso intentando esperar que realmente tenga el esquema que me diga todas si tienen o no tienen.
Y además que habría que parsearlo, ¿no?
Porque si tenemos el JSON...
Ah, bueno.
Ojo, ojo.
Ojo, ojo.
Ahí...
Este está bien, ¿eh?
Out of stock.
Me sorprende y todo que lo tenga, ¿eh?
Muy bien.
Igual lo tienen todos.
Pero no es mala idea, ¿eh?
O sea, no es mala idea sobre todo para hacer un fetch.
Que esa sería otra forma de hacer.
De scraper.
Hacemos el fetch y nos pillamos esto.
Lo que pasa es que la verdad es que me da sorprendido que el Fnac lo tenga.
Vamos a ver si este lo tiene.
Igual lo podríamos hacer con todos.
¿Y si todos lo tienen?
Ojo.
Oye, pues mira, con la tontería.
Igual sé que lo tienen todos.
Estoy sorprendido.
Yo pensaba que iban a pasar de todo fácilmente.
Muy bien, ¿eh?
Vaya, Amazon pasa de esto.
Y el Xbox.
El Xbox sería raro.
Pero bueno, ¿quién sabe?
El Xbox.
Tampoco.
Pero bueno, sí que el Fnac.
Tendríamos el Fnac.
El Game.
El Game sí que puede ser.
Lo tienen que tener más de la mano.
Pero bueno, puedo hacer...
Bueno, el Game tampoco.
Hostia, que bueno.
Hit any key to continue.
Le han puesto aquí un muñequito.
Esto.
Bueno, ya hemos visto que al menos dos sí que lo tienen.
Lo tendría el Fnac.
Que se le podría poner aquí un, por ejemplo,
hardcast schema.
Y que si tuviese esto, pues que utilizase una forma especial de revisarlo.
No es mala idea, ¿eh?
Me parece curioso.
O sea, vamos a ponérselo por si acaso.
Por si luego consideramos interesante, ¿vale?
Utilizar esto, lo del schema.
Y luego los que no tengan schema o no lo ponemos.
O sea, hacemos que por defecto no tengan.
Screma.
Schrema.
False, por ejemplo.
Has schema.
Has schema.
Schrema.
Schrema.
Y false.
Lo vamos a poner por si acaso.
Luego le podemos hacer algo.
Que los que lo tengan, pues básicamente, tengan un check especial.
Que directamente miren eso y ya está.
O incluso que hagan un fetch y se salten todo el tema de Puppetier.
Que también podría ser.
Así que en uno puede ser que el check stock lo haga si no tiene el hash schema.
Y lo haga con Puppetier.
O que haga los dos.
Solo por probar, ¿sabes?
Tampoco me parece buena idea.
Muy bien, muy bien.
Ahí está la gente colaborando.
Ay, espérate.
Iba a comitear esto, pero todavía...
El MediaMar por ahora...
Disable for now because it's not working properly.
Properly.
¿Vale?
Y todos estos...
Ahora vamos a por el de Amazon.
Amazon es una cosa curiosa lo que pasa con Amazon.
Porque...
Bueno, no sé ahora, ¿eh?
Vamos a probarlo.
Pero históricamente ha dejado bastante que se le haga scrapping a posta.
Porque le parece bien, ¿sabes?
De que la gente le haga scrapping directamente.
Me parece bastante curioso.
No sé si es una cosa que han cambiado ya.
Pero ya os digo que al menos antes le daba igual.
No disponible.
Hostia, qué cabrones.
Porque veo aquí que...
Si le doy a cualquiera...
O sea, no disponible.
No disponible.
Pero en cambio este me dice...
Ver todas las opciones de compra.
Hostia, 599.
Qué cabrones.
Claro, con Amazon hay que tener cuidado.
Porque aquí...
Lo que pasa es que hay gente que lo vende de segunda mano.
Dice...
Nuevo 600 euros.
Dice...
Entrega por 279 euros.
Pero serán ladrones.
Serán ladrones, malditos.
Motherfuckers.
Vaya ratas de alcantarilla.
Qué mal dolor les dé.
Cuanto mal les compre, más les duela.
¿Cómo podemos saber si realmente está disponible aquí?
¿Sabes qué podemos mirar?
Vamos a ver...
Si somos capaces...
Yo creo que el añadir a la cesta, ¿no?
O sea, yo creo que con que esté este botón de añadir a la cesta...
Vamos a ver.
Add to cart button.
Yo creo que si está el add to cart button...
Debería...
Add to cart button.
Vamos a probarlo, ¿no?
Await page...
Yo creo que con que...
Bueno, vale.
Si me parece esto bien...
Que hagamos así.
Add to cart button.
Punto length.
Mayor a cero.
Yo creo que...
Todo podría funcionar.
Vamos a...
Comentar todas estas.
Vamos a hacer solo la de Amazon.
Capitalismo.
Esto no es capitalismo.
Una cosa...
Una cosa es capitalismo y otra cosa es básicamente raterismo, ¿vale?
Esto es raterismo.
Y yo no creo que sea capitalismo.
Capitalismo es lo que hace Microsoft que vende su consola, ¿vale?
Mira, out of stock.
Eso es capitalismo.
Esto es especulación.
Que no tiene nada que ver con el capitalismo.
No tiene nada que ver con el capitalismo.
Esto es una persona que...
Que básicamente está especulando.
Pero no le está...
No está directamente...
Que es una cosa que ha creado esa persona, ¿no?
O sea, es una ratada lo que está haciendo.
Mira, aquí ya está en house stock.
Vale, perfecto.
¿Os imagináis que lo ponen ahora?
De repente...
Lo ponen disponible.
Buah, me cago encima, ¿eh?
Me cago encima.
Pa, pa, pa.
Vale.
Voy a conseguir una Xbox con mi scrapper.
Bien jugado.
Venga, os dejo una encuesta.
¿Para Amazon deberías comprobar las opciones con mandos?
La verdad es que sí que debería.
Pero bueno, por ahora...
Por ahora no.
Por ahora lo vamos a dejar ahí.
¿Buscas que sea la oficial store de Microsoft
y no otros vendos o particulares?
Si no, infla en el precio.
Bueno, pero mira.
Mientras me avise...
Mientras me avise...
No pasa nada.
Vale.
Pues ya tenemos unas cuantas.
No sé...
No sé qué...
Ah, el corte inglés.
Va.
Última.
El corte inglés...
El corte inglés.
Challenge validation.
Ya empieza mal.
Que a mí me...
O sea...
Ya empieza mal.
Ya empieza mal.
Que a mí me pide ya validación para entrar.
O sea, me la pide a mí.
No es que...
O sea, no me la pide al script.
No, me la pide a mí.
Mal pinta ya.
Mal pinta.
Pero bueno, vamos a ver.
El corte inglés.
Lo vamos a intentar por si acaso.
Has schema.
Vamos a ver si tiene el schema.
Esquema.
Out of...
No.
Tiene el schema, pero a medias, ¿no?
No tiene...
Stock.
Stock.
Online stock.
Tiene el schema, pero desperdigado.
Y además pone in stock.
O sea, este se engaña...
Me está engañando.
Vamos a ponerle false porque no es fiable.
Vamos a ponerle a URL.
Chequeamos el stock.
Para chequear el stock.
Async.
Page.
Pam, pam, pam, pam, pam.
Pam, pam, pam, pam.
Pam, pam, pam, pam.
Pam, pam, pam, pam.
Agotado temporalmente.
Js add to card desktop.
Bueno.
Me sirve.
En este caso vamos a copiar más.
Como ven este.
Este de aquí.
Y aquí hemos visto que es una ID.
Así que add to card desktop.
Y lo que tiene que ser agotado temporalmente.
Si eso es diferente, es que lo tenemos.
¿Vale?
Vamos a...
Esto dejarlo así.
Me tendría que decir out of stock.
Nada.
¿What?
¿Cómo?
Eso lo ha pasado automáticamente.
Lo ha pasado automáticamente.
O sea, me encanta.
Qué grande.
Me encanta, me encanta.
O sea, directamente...
Eres un robot.
No me fío de ti.
Bueno, va.
Te voy a dejar pasar.
Está bien.
No pasa nada.
Tampoco...
Tampoco es tan importante.
Está bien.
Muy bien, muy bien, muy bien.
Vale, vale.
Me está...
Me gusta.
Me gusta que seamos así de...
Vamos a ver esta.
Que esta es...
Este es otro.
Vale.
Blanco.
No sé de qué.
Este sí que está disponible.
Sí que tendría que poner que está disponible.
Shup.
Venga.
Vámonos.
Ahora me tendría que decir has stock.
A ver si me sale otra vez.
Permiso denegado, ¿eh?
Permiso denegado.
No puedes.
No puedes, pero venga, va.
Pasa.
Pasa, que no pasa nada.
No pasa nada.
Vale, vale.
Gracias.
El corte inglés.
Gracias.
Me encanta.
Pase, pase.
¿Quiere que le quite abrigo, señor robot?
Dice Verax.
Pero es súper raro, además, porque pone la URL y pone ahí beta.elcortinglés.
Que no sé qué.
Bueno.
Bueno, yo creo que tenemos unos cuantos ya, ¿no?
Yo creo que con esto ya tenemos al menos un ratito.
Entonces, vamos a ver dónde lo...
Hostia, voy a ver si me da tiempo.
Que no me hayan escrito...
Bueno, por ahora, a ver, me tiene que escribir mi pareja para decirme que me vaya.
Por ahora no me han escrito.
Pero bueno, si no, seguiremos, ¿eh?
No os preocupéis.
Buah.
¿Qué sistema masivo de scrapping debe utilizar las páginas que registran los precios de Amazon?
Por ejemplo, ¿qué pa?
Betas, a ver.
Un poco de todo, ¿eh?
Un poco de todo.
Tienen que tener sistemas así, pero sistemas más solo de requests, hasta dispositivos reales.
Hay algunas que utilizan dispositivos reales, cuando los scrappings son bastante chungos.
Dispositivos reales, que al final lo que hacen es más bien...
Tienes el dispositivo real, lo simulas completamente.
Y, o sea, con dispositivos pueden ser hasta móviles, ¿eh?
Con móviles lo he visto.
Y lo que hacen básicamente es tener...
Es que incluso he visto...
Mira, hay una cosa que a lo mejor no conocéis.
Os voy a buscar una cosa que es muy interesante.
Amazon Trabajo Humano.
¿Cómo es esto?
Amazon Trabajo Humano.
¿Cómo se llama esto?
Human Resource...
No, Human Resources no.
Human...
Human Work.
By Hours.
O algo así.
¡Ah, qué rabia!
¡Este, este!
¡Este, este, este, este, este, este, este, este, este!
Amazon Mechanical Turk.
Amazon Mechanical Turk is a crowdsourcing marketplace que hace más fácil...
Bueno, os lo voy a comentar un poquito, ¿vale?
Pero, básicamente, imagínate que tú tienes una tarea manual muy tediosa, muy repetitiva, ¿vale?
Pues, esto que tú puedes decir de aquí, de Amazon Mechanical Turk, y lo conozco porque yo lo utilicé en su día para algunas cosillas.
No, no para uso personal, sino para una empresa en la que trabajaba.
Esto, básicamente, lo que te permite a ti es trabajar, pues, o sea, contratar gente para que te haga el trabajo manual repetitivo.
O sea, esto no es para, básicamente, que tú lo automatices.
Puedes automatizarlo después, ¿vale?
Pero, básicamente, es...
Ah, mira, dice aquí Jorge, dice, yo he ganado muchos dólares ahí en Mechanical Turk.
Claro, es que esto te puede funcionar, pues, yo que sé, para moderar, por ejemplo, ¿no?
Para ver si una imagen es correcta o no es correcta, para ver si el contenido que has scrapeado es correcto o no es correcto, incluso para scrapear, para scrapear manualmente.
O sea, y esto, que puede parecer una chorrada como un templo, esto, realmente, hay grandes empresas que lo siguen utilizando cuando el scrapping es muy, muy difícil.
Lo sé que lo utilizan, por ejemplo, con vuelos o para ver, por ejemplo, ¿cómo se llaman estas empresas?
E-Dreams, ¿no? E-Dreams, que lo que te hace es buscar vuelos baratos.
Al final, hay veces que es bastante complicado, es bastante complicado de ver realmente si tú tienes un precio bien y tal.
Bueno, aquí hay una batalla que es que ni os lo imagináis.
Y hay veces que se utilizan este tipo de cosas, ¿no?
Que son validaciones de datos sencillas, pero muy repetitivas.
Y esto es Amazon Mechanical Turk.
También se utiliza para entrenar inteligencias artificiales, machine learning, para sentimientos, es que un montón de cosas.
Pero es bastante curioso, es bastante curioso.
Lo digo porque hay gente que desconoce que existen estas cosas.
También, también.
Vale, pues yo creo que tenemos esto.
Ahora lo que nos faltaría es dónde lo podemos desplegar.
¿Dónde lo podemos desplegar?
Lo podríamos desplegar en Vercell.
Esa podría ser una, pero yo quería probar Netlify Functions.
Netlify Functions.
Lo que quería es la Netlify Functions, lo que quería ver...
Bueno, a ver, es que no sé qué cosas nos ofrece Netlify.
Vamos a ver todo lo que nos ofrece Netlify.
Functions.
Build with JavaScript.
Esto es lo que quiero yo.
Yo tengo build con JavaScript.
Trigger on Events.
Esto me gusta.
Trigger on Events.
Vale.
You can trigger serverless function calls when certain Netlify events...
Vale, Netlify Events.
Pero yo no creo que sean Netlify Events.
Yo lo que quiero...
Yo lo que me gustaría es que fuese con un webhook o algo, ¿sabes?
Usage and billing.
A ver, Functions Pricing.
Mirad, es que tenemos 100 horas, ¿eh?
Tenemos 100 horas aquí.
Background Functions.
Background Functions, a ver.
For tasks like batching process, scrapping.
Ojo, ojo, scrapping.
Background, con AWS Lambda.
Es invocada.
Like only functions, background functions, adversion control.
Background Functions.
Background Functions.
Pero aquí tampoco es que ponga mucho...
No sé si ni tengo cuenta en Netlify.
Lo voy a mirar porque igual ni tengo cuenta.
A ver, es que tiene buena pinta lo de Netlify Functions.
Pero claro, si lo de Background Functions no voy a poder utilizar...
A ver, según esto pone Level 0.
Pone Available on Pro Plants and Above.
Pero esto, entonces, ¿por qué pone aquí Check?
Es que siento como que me ha engañado, ¿no?
Hostia, estoy en incógnito todo el rato.
Espérate.
Voy a quitarme todo esto.
Y...
Voy a quitar todo esto que tampoco me hace falta.
Que ya me debe estar chupando esto.
La memoria RAM, las energías, el mundo entero.
Vale.
Netlify Functions.
Y si no...
Pricing Functions.
Venga, explícame, ¿qué son las Functions?
Write, deploy, run.
Example use case.
Fetch live data from an API.
Return dynamic images.
Send automatic email.
Hombre, esto es básicamente lo que quiero yo, ¿eh?
Workflow, manage everything in one project.
Build test locally.
Bueno, bueno, que decís que sí, que me voy a conseguir mi consolita.
Gracias a...
No creo, pero bien jugado.
Bueno, bueno.
Deploy backend.
Front and code together.
Stage preview and rollback.
Run AB testing.
Data dot integration.
No, que datos dock integration.
Hostia.
10 segundos.
10 segundos es una mierda.
Necesito, o sea, una background function de estas.
A ver, no, no, pro plans.
Bueno, a ver, vamos a verlo.
Es que, claro, me dice 19...
Es que aquí me pone level 0, 0 dólares.
Pero aquí me pone luego que tiene que ser pro.
O sea, que me parece que aquí no lo vamos a poder poner, ¿eh?
¿Sabéis el problema?
Es que en Vercell no se puede hacer scrapping.
No, no.
Web scrapping...
En Vercell está prohibido el scrapping.
Es un limit.
Limit.
¿Ves?
Fair use policy.
¿Ves?
Scrappers.
O sea, no puedo utilizar para scrappers.
Ay...
Cago la leche.
A ver, que si no utilizo una AWS o Lambda.
Cloudflare.
Cloudflare.
¿Sabéis lo que pasa?
Es que AWS es un coñazo.
Porque es que para...
Ya iniciar sesión y todo esto.
Además tengo ahí algunas cosillas.
Ya no tendría el free tier.
Tendría que estar pendiente.
Tenía que mirarlo del course explorer.
Me da mucho, mucho, mucho rollo.
Mucho rollo.
De Cloudflare Workers...
A ver.
El otro día estuve leyendo que habían hecho alguna cosilla nueva.
En temas de...
De que habían añadido unas nuevas.
Y no sé si se podrá utilizar un browser.
Pero habían hecho un nuevo límite.
A ver si tiene aquí browser.
No.
Para apetir.
No.
Nada.
Es que me parece que no...
Este no va a tener.
Serverless API.
Se pueden hacer muchas cosas con esto.
Pero me da a mí que no vamos a poder utilizar.
Webstandards.
Webcrypto.
Sería increíble.
Si se puede ir a hacer con...
Scrap.
Tampoco.
Pero las han mejorado un montón.
Y ahora pueden durar hasta minutos.
A ver.
Cloudflare Workers.
Papetier.
Papetier.
Vamos a ver si Papetier se puede.
Running Papetier en Service Workers.
Cloudflare Workers.
Interdition.
Uh.
Es que tienen 10 mil...
Pero esto es antes.
Es que ahora ya tiene bastante más.
Cloudflare Workers Introduction to Serverless.
No.
Pero esto tampoco.
Interproject Created.
Workers.
Papetier.
Es que han mejorado bastante.
Y ahora se puede...
I'm able to test this on the server without Chrome or Papetier.
No.
A ver.
Esto no...
Esto no es.
A ver.
En Heroku.
Heroku podría ser.
Firebase Functions.
No.
Es hacer deploy de una función.
Las Netlify Functions.
Efectivamente.
Serían como funciones.
Serían como parecidos a tener un endpoint de una API.
¿Vale?
En Arduino.
Sí.
En Arduino.
Voy a hacer yo ahora.
El problema de scrappers de este tipo es el propio anti-scrapper.
Claro.
Obviamente.
Sí.
Suele ser el problema.
Por no hablar de todos los automatizados de compra.
No solo del ping del stock.
Claro.
Claro.
Sí.
Ese suele ser el problema.
Pero bueno.
A ver.
Lo estamos haciendo a baja escala.
Igual tenemos suerte y no hay ningún problema.
Azure Functions.
Azure Functions.
Nunca he utilizado Azure Functions.
Azure Functions.
Sería poético porque Azure es de Microsoft.
Azure Functions.
Deploy.
Papetier.
Venga.
Va.
Vamos a probarlo.
Va.
Venga.
Vamos a probarlo.
Running Headless Chromium.
In Azure Functions.
Aquí encontramos cositas.
Así que parece ser que hay gente que lo ha conseguido.
Si hay gente que lo ha conseguido.
Azure Functions.
Deploy.
Vamos a poner Playwright.
A ver si alguien ya ha intentado esto.
Más que Papetier.
Ojo.
Ojo.
Ojo.
Que aquí.
Wow.
Ejemplo.
Ejemplo.
Bien.
Bien.
Bien.
Bien.
Me gusta.
Vamos.
Me gusta.
Running Playwright.
In Azure Functions.
Venga.
Va.
Es la primera vez que voy a utilizar.
Azure Functions.
Pero no sería poético.
No sería poético.
No sería poético.
Que Azure es de Microsoft.
Y me va a ayudar a comprarme mi.
Me va a ayudar a comprarme.
Mi Xbox Series X.
Sería poético.
Venga.
Vamos a intentarlo.
Va.
Sí.
Sí.
Claro que he probado Clofford Workers.
Sí.
Hicimos un directo para hacer el midu.link.
Estuvo súper genial.
Pero vamos a ver.
Playwright.
Azure Functions.
¿Esto qué es?
¿Qué es esto?
Playwright.
Ah.
Esto es Playwright.
On Azure Functions.
Vale.
Vale.
Esto lo miramos después.
Voy a iniciar sesión.
¿Vale?
Por ahí.
Mi Duga.
A ver si me acuerdo de mi.
Ah.
Se puede iniciar sesión con GitHub.
Déjame volver atrás.
Bueno.
Pues no me deje volver atrás.
Da igual.
No importa.
Parece que ya tiene una cuenta de Azure.
No jodas.
Eso es lo que estoy intentando.
Eso es lo que estoy intentando.
Entrar.
Regístrese para obtener una suscripción de tipo pago por uso.
No.
Use una suscripción asistente en su cuenta.
¿Vale?
No sé qué ha pasado.
No sé.
Optimización de las caras de trabajo en la nube.
Recomendación.
Qué miedo.
Qué miedos tengo.
Aplicaciones de funciones.
Me imagino que es esta.
Es la primera vez que entro.
¿Pago por uso?
Última consulta de hace tres años.
Qué cabrones.
Voy a cerrar sesión.
Y voy a intentar.
Voy a intentar entrar con la cuenta de GitHub.
A ver si me dejan.
A ver si así.
A ver.
Usar otra cuenta.
Iniciar sesión con GitHub.
Autorazize.
Parece que ya tiene una cuenta registrada.
Miduga.
Sí.
Venga.
Va.
Escribe el código que hemos enviado a Miduga.
Venga.
Vamos a Miduga.
Vámonos al mail.
Equipo.
Código de un solo uso.
Vale.
Código.
¿Quieres mantener la sesión?
Hombre, sí.
Si estoy entrando ahora.
Todo listo.
Venga.
Fantástico.
Ya puedo iniciar con lo de GitHub.
No me ha servido para absolutamente nada.
Pero bueno.
Confirmar dirección.
Si la acabo de confirmar.
Dios mío.
Pago por uso.
Qué cabrón.
Bueno.
A ver.
Aunque sea pago por uso.
Yo entiendo.
Hostia.
Qué miedo.
Que salen cosas ahí.
Que a ver si son privadas.
Aplicación.
Venga.
Va.
Crear aplicación de funciones.
Me imagino que es esto.
Yo creo que es ese.
La aplicación de funciones.
Es que la traducción es un poco extraña.
Vamos a ver todos los servicios.
Functions.
Aplicación de funciones.
Sí.
Es esa.
Te cobran por cada ejecución.
No.
Pero tiene que haber una Azure Functions.
Yo creo que tiene que haber un free tier.
No me lo puedo creer que te cobren de primeras.
O sea.
No me lo creo.
Informáticas en servidos.
Vamos a ver.
Precios.
Plan de consumo.
Premium.
Precios de Azure.
Tienen que tener una.
O sea.
Free tier.
Bueno.
A ver.
Pero no muy cara.
No pasa nada.
Ah.
Gratis mensual.
Un millón de solicitudes.
Los precios del plan.
Venga.
No pasa nada.
No pasa nada.
Vamos a ver si ponemos Europa.
Bueno.
A ver.
¿Por qué pone Europa y luego Alemania?
Como que Alemania no es parte de Europa.
¿O qué pasa aquí?
En Madrid nos olvidamos.
¿Verdad?
De España no hay aquí nada.
A ver.
Pues Francia del sur.
Que debe ser lo que tenemos más cerca.
Y del euro.
El plan de consumo de Azure Functions se factura en función del consumo de recursos.
Los precios del plan de consumo incluyen una concesión gratuita mensual de un millón de solicitudes.
Joder.
Vale.
Las Functions Premium tienen mejor.
Bueno.
Pero bueno.
Vamos a probar.
Vamos a probar.
¿Qué es lo peor que puede pasar?
Si es un bucle te cobran una solo.
Bueno.
Está bien.
Crear aplicación de funciones.
Venga.
Ya le he dado.
Pago por uso.
Es que a ver.
Hay otro tipo de suscripción.
Grupo de recursos.
Crear nuevo grupo de recursos.
Me dudé.
Vamos a poner Scrapping Xbox Series X.
Nombre de la aplicación de funciones.
Scrapping Xbox Series X.
Voy a copiar esto por algún lado.
Que luego.
Publicar.
Código.
Código.
Seleccionar una pila de entorno de ejecución.
Note.
Hostia.
Catorce.
Cabrones.
Y lo queremos en.
Lo queríamos en Francia.
Pero ahora.
Me ha puesto más complicado esto.
Norte de Europa.
Norte de Europa no.
France Central.
Bueno.
Pues Francia Central.
Venga.
Cuenta de storage.
Pues esa mismo.
Al crear una aplicación de funciones.
Te ves crear una cuenta de storage.
De uso general.
Un vínculo a ella.
Que admita.
Blob storage.
Cube storage.
Y Topolo storage.
Pues vale.
Sistema operativo.
Linux.
Le hemos recomendado.
Sistema operativo.
Según la selección que ha hecho.
La pila de tiempo de ejecución.
Mentiroso.
Mentiroso.
Plan.
El plan elegido.
De dictado.
Vamos a escalar.
Consumo.
Sin servidor.
Functions premium.
Plan de servicio.
Aplicaciones.
Sin servidor.
A ver.
Más información.
Opciones de hospedaje.
Información.
Plan de consumo.
Plan de hospedaje.
Plan premium.
Plan de consumo.
Escale de forma automática.
Y pague los recursos.
Bueno.
Creo que es la que tiene mejor pinta.
Porque premium suena a que cuesta dinero.
Y dedicado que cuesta dinero también.
Así que consumo.
Redes.
Redes.
¿Qué coño?
La aplicación de funciones.
Se puede apreciar con la dirección de entrada.
Bueno.
No necesitamos nada de esto.
Supervisión.
La leche.
Sí que hay que hacer cosas aquí.
Habilitar application insights.
¿Es un servicio de administración de rendimiento de aplicaciones?
Sí.
Sí.
Sí.
Sí a todo.
Sí a todo.
Las etiquetas son para el nombre de valor que permiten categorizar los recursos y ver
una facturación.
Bueno.
No pasa nada.
Espero que no me cobres nada.
O sea que.
Vale.
Descargar una plantilla para automatización.
No sé si esto debería evitar que se vea.
Yo por si acaso voy a hacer que no se vea.
Ah.
De automatización para crear el recurso.
Vale.
Vale.
O sea.
En principio creo que aquí no hay nada.
Parámetros.
Scripts.
Puede usar la clica Azure para administrar los grupos de recursos.
Esto es lo que seguramente vamos a tener que instalar.
Implementar.
A ver.
Una cosa que podríamos hacer ya es directamente arrastrar.
Y ya está ¿no?
Implementar.
Entiendo que implementar es que podría.
¿Qué es esto?
Implementación personalizada.
Revisar crear.
Falta de información necesaria o no válida.
A ver.
¿Dónde está esta información?
Grupo de recursos y ya.
¿Pero la he creado ya o no la he creado ya?
¿Qué ha pasado con mi función?
¡No!
¡Mi función devuelve mi función!
¡No!
¿Dónde está mi función?
¡La madre que los parió!
¿Dónde está mi función?
¡Devuelve mi función que había creado!
No me lo puedo creer.
No me lo puedo creer.
¿Vale?
No me lo puedo creer.
Dios mío.
Scrapping Xbox Series X.
¡Qué cabrón!
¡Qué cabrón!
¿Nombre de aplicaciones no sé qué hace cuánto?
¿Dónde está el nombre de aplicaciones y funciones?
Xbox Series X.
¿Tengo guardada?
¿Tienes guardada la plantilla?
Sí, tengo guardada la plantilla.
O sea, ¿la plantilla tendría suficiente?
Claro, es verdad, verdad.
Que he creado la plantilla.
Crear.
Esta UX no la entiendo.
Aplicaciones de funciones.
Vamos a ver.
Administrar lista.
Es que para crear ya siempre me sale eso.
Abrir.
No sé qué.
¿Cómo se crea de la plantilla?
Desde el CLI.
A ver.
Install Azure CLI.
¡Ay!
Macos.
Voy a dejar instalando esto.
Por si acaso.
Y ahora...
A lo mejor lo puedo crear a través de la plantilla.
Ya está, pero...
Si es que voy a tardar menos en hacerla aquí, que...
Scraping Series X.
Series X.
Secciones.
Note.
16.
Francia.
Otra vez.
One more time.
Francia.
Hospedaje.
Nuevo.
Linux.
Sin consumo.
Siguiente.
Redes.
Nada.
Subvisión.
Sí, lo queremos.
Etiqueta.
No hace falta.
Revisar y crear.
Vale.
Revisar y crear.
No sé qué.
Crear.
Vale.
Es que antes le he dado a descargar la plantilla.
Me ha llevado a otro sitio.
La hemos liado.
Crear.
Vale.
Ahora ya me la está creando.
No es ilegal hacer eso.
¿Cómo que ilegal?
Quedó puesta la versión 14.
Es que solo podemos utilizar la 14.
La 14 es la última disponible.
Dentro de poco van a poner la 16 cuando sea LTS.
Sí, hay que hacer un máster para utilizar Azure.
Detalles de implementación.
Es que creo que la traducción tampoco tiene sentido.
A ver.
¿Qué quiere decir por detalles de implementación?
¿Qué quiere decir por detalles de implementación?
Deployment.
No sé qué.
Vale, vale.
No.
Estaba mirando a ver si eran los...
No sé.
Detalles de operación.
Absetted.
Created.
Entradas.
Entradas.
Salidas.
Plantilla.
Agregar a la biblioteca.
Implementar.
Implementación.
Vale.
Es para implementar la plantilla.
Es que antes he perdido la plantilla.
Yo también.
Vale.
Inicio.
Aplicación de funciones.
Pero no está mi función.
Bueno, a ver.
¿Alguien sabe dónde están mis funciones?
¿Y por qué están desapareciendo?
No sé si es que la está creando.
Pero si ya ha creado el resource group.
Ya lo he creado.
Ya lo he creado hace un momento.
Grupo de recursos.
Si ya está creado.
Pago por uso.
Scrapping.
¿Ves?
Este es mi recurso.
Aplicación Insights.
Cuenta de almacenamiento.
Pero no me ha creado la función.
O sea...
¿Dónde está mi función?
Déjame crear mi función ya.
Intercambio.
Borra los filtros.
Ubicación.
Todo.
Todo.
Todo.
Dios mío.
Mira arriba.
En la barra está el proceso de creación.
Ah, ojo.
Ojo.
Joder.
Pero...
Se está realizando la implementación del grupo de recursos.
Vale, vale.
Pasos siguientes.
Pero aquí pone...
Ah, vale.
Parece que sí.
Parece que ahora sí.
Joder, pero hombre.
Podría salir en la lista, ¿no?
Pasos siguientes.
Crea una función.
O sea, lo que me está diciendo es que crea una función ahora.
Ahora sí.
Vale, vale.
Bueno, muchas gracias.
Es que la interfaz, joder.
¿Por qué no me puede aparecer aquí la función y ponerme en lugar de estado en ejecución en creación?
Digo yo, vamos.
O sea, tampoco era tan difícil.
Es muy raro.
Claro, que tenga que mirar en el iconito ISTE y mirarlo.
Yo qué sé.
Bueno, a ver.
Igual yo también la primera vez que lo uso, ¿eh?
No nos vamos a engañar.
Tampoco voy a decir que yo vaya muy sobrado.
Es la primera vez que lo uso.
Por lo tanto, hay que tener paciencia.
Hay que tener paciencia.
Uf, vale.
Claves de la aplicación, archivos, espacio de implementación, configuración.
Vamos a ver la configuración.
A ver.
Es que eso sería hacerlo demasiado intuitivo, ya te digo.
Vale.
Configuración del tiempo de ejecución.
¿Cómo?
Versión en tiempo de ejecución.
Tres.
Uno, tres.
Qué raro eso.
Funciones.
Vale.
Entiendo que aquí, en este funciones, es donde en crear, se podría crear la función.
Ahora sí, entorno de desarrollo, Visual Studio Code.
NPM install.
Antes de comenzar, debes instalar Visual Studio Code.
Vale.
Debes instalar Node, incluir NPM.
Creación de un proyecto Azure Functions.
Crea una función del panel Azure Functions.
Otra vez.
Ay, Dios mío.
Cuando decís instalar la extensión de Azure Functions, Visual Studio Code,
una vez instalada, iniciar sesión Azure, ejecución del proyecto de función localmente.
Vale, vale.
Esto tiene un poquito mejor pinta, va.
Esto tiene un poquito mejor pinta.
Entiendo.
Entiendo estas...
Hostia, que esto está instalando todavía esto.
Midu, una pregunta.
He visto en tu blog que hacéis desarrollos para empresas.
¿Seguís con esto?
Qué va, tío.
No, no, no.
Chemi.
Qué va.
No sé dónde ha visto lo que hacemos desarrollos para empresas, pero es que no me sale a cuenta.
O sea, es que no tengo tiempo.
No me da la vida.
No me da la vida, vamos.
Porque además es que las empresas pagan muy poco.
Son muy ratas.
Entonces, ¿qué paso?
Es que prefiero estar aquí streameando gratis que ya está.
Si el Azure Function Clip...
Me lo estoy instalando.
Es esto de aquí.
Esto que se está instalando es el Azure Function Clip.
Así que nada.
Y la extensión de Azure Function en Visual Studio Code.
Eso también me lo voy a instalar ya.
Azure Function...
Pero qué bonito, ¿eh?
Estamos aprendiendo aquí cosas nuevas.
Azure Functions que entiendo...
Azure Function, tío, que es esta, ¿no?
Vale.
Sing up today for free and receive to...
Bueno, esto no lo tengo, ¿eh?
Ah, mira, para crear tu primera...
Oye, pero mira, esto es súper fácil aquí, ¿no?
Ahora va a ser súper fácil aquí.
Cago en la leche.
Trans, servers, lines, api, local, twitter.
Bueno, vamos a probar si esto realmente funciona.
Azure, me imagino...
Sing in.
Sí, en mi cuenta esta de GitHub.
Vale.
Pago por uso.
¿Qué mal suena eso de pago por uso?
Me da bastante...
Sí, abruma bastante info, ¿eh?
Es mucho más fácil por Visual Studio Code.
Pues venga, va.
Vamos a intentarlo por aquí.
¿Vale?
Esta es la función que hemos creado.
Application settings.
Vale, vale.
Deployments.
Bueno, no tengo ningún deploy todavía.
Entiendo que aquí en functions deberíamos crear nuestra función.
Pero...
Hostia, lo que es un poco raro...
Me entiendo que es aquí, ¿no?
Para crear la función.
Vale.
Vale.
A ver, espérate.
Vamos a cerrar cosas.
Vamos a cerrar cosas.
Voy a cerrar esto, voy a cerrar esto, voy a cerrar esto.
Supongo que ahora que estamos en esta carpeta, si yo le doy aquí a crear mi nueva función...
This effort is not a function.
Create new project.
It's not a function project.
Bueno, pero yo quiero crearlo en una...
¿Qué es esta?
Create new project.
Create the folder, no sé qué, no sé qué.
Quiero una nueva...
Venga, va.
Y esto está hecho con JavaScript.
Select a template for no sé qué, no sé cuánto.
Timer trigger.
Timer trigger, entiendo que el Timer trigger será la que queremos, ¿no?
Timer trigger.
Va, Timer trigger.
Create a new Timer trigger.
Every 10 minutes.
Vaya.
Every 10 minutes.
Pam.
Vale.
Enter a Chrome.
Creo que esto es así, ¿no?
O sea, esto sería cada 10 minutos.
Cada 10 minutos.
Creo que sí.
Si no, hay una web que me gusta mucho, Chrome Job.
Chrome Job, Chrome Job.
Ahora sí.
Check Chrome Tab.
O Chrome Tab Online.
Ah, Chrome Tab Guru.
Esta.
Que te lo chiva todo.
Vale, pero no le gusta.
Porque tiene de más.
No, esto es cada...
Esto es cada...
Es que a ver, claro.
Es que no entiendo aquí.
Es que aquí tiene segundos.
Que en este caso tiene minutos.
Claro, es que son un poco diferentes.
Yo creo que está bien.
Minuto.
Claro, es que esto sería cada hora.
Esto sería cada 10 minutos.
Cada...
At every 10 minutes.
Hostia, esto no sería cada 10 minutos, entonces.
Esto no sería cada 10 minutos.
O sea, esto sería...
Vamos a poner...
Coño, como no tiene minutos...
O sea, no tiene segundos, es un poco raro, ¿no?
Sería así, ¿no?
At every minute.
O sea, quitando esto.
Coño, ahora me ha...
Es que como me está liando esto de que no tiene minutos...
No tiene segundos.
¿Y este sí?
No, tío.
Eso sería cada 10 minutos después de las 10.
A ver.
¿Pero en cuál?
¿En este?
Porque es que en este pone minutos y aquí tenemos segundos, ¿vale?
Coño, pero eso lo habíamos hecho antes.
Entonces, pues ya está.
Si es que está bien, entonces este, ¿no?
Ah, lo que pasa es que aquí tiene un 0.
O sea, sería así.
O con el 0.
Yo creo que es con el 0, ¿no?
O sea, el 0...
Cada 10 minutos...
O sea, que ahora sí estaría bien.
¿Sí o no?
¿El que tenemos aquí está bien o no está bien?
Sin el 0.
Quita el 0.
No.
El 0 no se puede quitar.
O sea, el 0...
O sea, le pongo el asterisco...
O le pongo el asterisco o le pongo un 0.
Pero si es un asterisco, sería...
O sea, se le pone...
Yo creo que es así, ¿vale?
Está así.
¿Vale?
Lo que pasa...
Lo que es una mierda aquí es que no está lo de los segundos aquí.
Entonces, cuando lo he pegado aquí, pues ya me ha liado porque no tenía lo de los minutos.
Pero entonces, después...
Bueno, da igual.
Que está bien.
Que está así.
0, el asterisco, barra 10 y ya está.
Second minute...
Después...
Vale.
Cada 10 minutos.
Ya está.
Git ignore ya existe.
Sí, hombre, sí.
Y el package JSON ya existe.
¿Me lo vas a joder?
Venga.
Da igual.
Vale.
Vamos a ver todo lo que nos ha creado aquí.
Nos ha creado una función aquí que se llama every 10 minutes.
¿Vale?
O sea que...
Entiendo que...
Lo que no sé si tendría que poner las dependencias en este...
Vale.
Entiendo que no.
Entiendo que debería ser todo y ya está.
Vale.
Lo malo es en este package JSON, pero bueno, no pasa nada porque vamos a pillar los cambios.
Le vamos a poner el function start este.
Start...
Esto lo vamos a poner aquí.
Pip.
Y ya está.
Y yo creo que ya está, ¿no?
A ver.
Que no se me olvide nada que tenía aquí.
Echo, no test, no sé qué, no sé cuánto.
Quiero un Xbox.
A ver, le vamos a dejar el nombre este.
Bueno, es que este nombre es el que tiene ya.
Vale.
Pues ya está.
Yo creo que este package JSON es el que necesitamos.
Y con todo esto...
Bueno, a ver qué pasa.
A ver si somos capaces de hacer esto y que funcione, ¿no?
Yo diría que es con la...
Ahora me decís que es con el asterisco, ¿eh?
Con el 0 para que sean el segundo 0 de cada 10 minutos.
Eso es lo que creo yo también.
Que tiene que ser el 0.
Porque si es con el asterisco va a ser cada segundo del minuto 10, ¿no?
Bueno, vamos a ver esto.
Every 10 minutes index.
Vale, todo esto está así mal.
Esto, aquí es donde tendríamos que poner nuestro código.
Host.json.
Vale, se supone que ahora podríamos probar nuestra función.
Pero no aparece aquí.
Tampoco.
O sea, ¿no debería aparecer aquí las functions?
O sea...
No aparece aquí.
La madre que la parió.
Parida.
Si acabamos de crear una...
Aquí me debería aparecer justamente la que acabamos de crear.
Y no me aparece.
Ay, señor.
Porque esto me va a crear una nueva.
Que no quiero que me cree una nueva.
O sea, no me debería aparecer aquí en functions.
No me debería aparecer esta de every time, no sé qué, no sé cuánto.
Esta de my timer y todo esto.
Sample.dat.
This makes a...
How it works.
For a time to try to work, you improve, no sé qué, no sé cuánto.
¿Ves?
Con el cero es cada cinco minutos.
¿Vale?
Cada segundo cero.
O sea, que lo hemos hecho bien.
Todo esto lo habrás ahorrado con las Netlify Functions.
Bueno, pero las Netlify Functions son de pago, claro.
Es una putada.
Lo que quiero ahora es ver este every 10 minutes.
Que no sé por qué no me sale en mi Azure Function aquí.
¿Por qué aquí en functions no me aparecen?
No sé si es porque esto es lo que está desplegado.
Vamos a probarlo.
A ver, esto sería deploy to function.
Xbox Series X.
Yo qué sé.
Yo sé el momento de deploy.
¿En el previous deploy?
Deploy ya, yo qué sé.
Aunque reviente.
Lo que es ver ahí cosas.
¿Vale?
Yo lo que quiero ver es que aquí en functions está disponible mi función.
Punto.
Vale.
Lo tendré que desplegar, ¿verdad?
Eso es el tema.
A ver, que no me...
Que no me se me haga tarde para salir.
Que luego me matan.
Hostia, ¿cómo tarda esto en desplegar la leche?
Vale, completado.
Ay, ay, ay, ay.
Vale, ahora sí.
Ahora está aquí.
Vale, vale.
Me parece todo correcto.
Todo bien.
Entonces, mi otra pregunta.
¿Yo cómo puedo ejecutar esta función?
Porque he visto...
O sea, ¿cómo puedo ejecutarla en local?
Porque antes he visto por aquí en la extensión, Azure Functions, me ponía por aquí.
Si tú esto lo quieres ejecutar, select button, no sé qué, vale, para crear, vale, vale, sí, esto ya lo hemos hecho.
Esto, run the serverless app locally.
No, pero esto es la serverless app.
O sea, pero la función es lo que yo quiero.
Copy function URL.
Esto es lo que quiero yo.
¿Sabes cómo puedo yo ejecutarla?
La...
Attach to functions.
Yo lo que quiero es ejecutar la función.
Yo me seleccioné.
Joder, ¿cuántas cosas hay que hacer aquí?
Sí, esa misma.
A ver, a ver.
Quiero que se ejecute, aunque no haga lo que tenga que hacer.
Timestamp is past due.
Function run.
No sé si ya las está ejecutando.
Cannot create directores for share.
Bueno, empezamos bien.
Operation no permitted.
Empezamos bien, vale.
Empezamos bien.
Vale.
Functions for detail.
Throw message.
Incompatible.
The version refer to the documentation.
Vale, la versión que se está utilizando es incompatible.
Node version 16.8.
¿16.8?
¿Estoy yo utilizando la 16.8?
Hostia, sí.
Estoy utilizando yo la 16.8.
Vale, vamos a entrar a la 14.
Vamos a...
¡No!
Nada, es que tiene que compilar la versión 14.
Si hago eso, se pone esto a...
Se revienta.
Se revienta, pero cosa mala.
Entonces, ahora que más o menos ya, ahora sí, tenemos nuestra función.
Que entiendo que ahora sí que debería aparecer aquí.
¿Cómo que no hay ninguna?
Ahora.
Esta.
Vale.
Y no es compatible con las aplicaciones de funciones de consumo para Linux.
Joder, cuántas complicaciones.
Ay, cuántas complicaciones.
Bueno, deberíamos poder ver aquí el código.
Que ahora mismo el código es un rollo, ¿no?
Que es este, ¿vale?
Que entiendo que se podría...
Ah, no, se puede editar.
Vale.
Me parece bien.
Probar.
Entre los parámetros.
Your Functioned.
Cuerpo.
Esto no sirve para nada, ¿no?
Host Key.
Default Key.
Bueno, yo qué sé.
Dale.
Ejecutar.
A ver si se puede ejecutar aquí en la nube, al menos.
Se conectó.
Vale.
Fantástico.
Pero, ¿qué?
¿Hizo algo?
Se conectó.
Hizo un 202, pero yo no veo aquí el context lock.
O sea, no veo que haya hecho nada en el context lock.
No, ha funcionado.
Ha funcionado, al menos.
No sé si el context lock debería mostrar alguna cosa aquí, pero bueno.
202.
Vale.
El timer este es el que hace cada 10 minutos.
No se han definido salidas.
Supervisión.
Claves de...
Bueno, claves de función no vamos a ver.
No, vayamos a liar.
Y...
Probar a ejecutar.
Bueno, esto no sirve para nada, pero bueno.
Request entity to large.
Ya, es que esto...
No sé todo esto.
¿Por qué lo ponen ahí?
Se supone que esta función debería en la salida...
Ponen context lock, pero bueno.
Bueno.
Al menos, ya más o menos tenemos nuestra función.
Yo ahora lo que quiero es que consigamos ejecutar nuestra random esta.
Esto es...
Use puppeteer and playwright.
La primera request son dependientes de la instalación en Linux Consumption Plans.
Vale.
Aquí nos dice que instalemos Chromium mejor.
Vale.
No pasa nada.
Vamos a instalarlo...
Playwright.
Puedes utilizar justamente la versión específica de cada navegador.
En lugar de utilizar una forma más general, lo que puedes decirle es exactamente un navegador en concreto.
Así que vamos a utilizar el de Chromium.
Vale.
Vamos a poner esto...
1.16.
Y esto es una dependencia.
No sé por qué...
Dependencies...
No sé por qué lo he puesto en Dependencies antes.
Estándar sí que es una Dependencies.
Y esto fuera.
Al final no lo estamos utilizando para nada.
Y como vamos a utilizar esto así, en nuestra función que teníamos aquí, esto, tenemos que hacer exactamente por ahora lo mismo.
¿Vale?
Así que vamos a borrar no modules.
MPM install.
ImUmbrax.
Disculpad si ya se ha hablado.
Pero sabéis que todo esto se puede hacer con Distil, ¿no?
Una extensión de Chrome con interfaz gráfica.
Conseguir más de 30 RTX 3080.
Que sí.
Que se puede hacer de un montón de formas.
Que hay un montón de aplicaciones.
Que sí.
Pero que no es solo por el hecho de hacerlo.
Es como lo estamos haciendo y para aprender.
Que sí, que está bien.
Que está guay.
Pero que, bueno...
Que lo que queremos es aprender a utilizar Playwright.
Desplegar un Azure Function.
Lo hacemos porque podemos.
No por otra cosa.
Que seguro que incluso...
Me podría apuntar a un grupo de Telegram.
También, ¿eh?
Pero...
Ah, mira.
Aquí tenemos...
Hostia.
Aceptar cookies.
Mira, aquí tendríamos un poco...
Hostia, he dejado la del corte inglés.
He dejado la incorrecta.
He dejado la incorrecta.
Defnack.
¿Vale?
Tenemos aquí todas las imágenes.
Vale.
Aquí no lo voy a poder probar porque no puedo instalar en local la versión 16.8.
La puedo instalar pero es que va a tardar un montón porque la tiene que compilar la versión 14.
Y se va a poner a petar el stream.
O sea que eso da igual.
Vamos a intentar a ver si somos capaces de hacer que llegue fuera directamente y ya está.
Así que, lo que vamos a hacer es adaptar nuestro código que tenemos por aquí, este código, a lo que sería una Azure Function.
La Azure Function lo que tiene es un module.export, una función asíncrona donde recibe el context y el myTimer.
Que la verdad es que esto es el myTimer, la primera vez que lo veo en mi vida.
Pero entiendo que es eso, que dice que...
Te dice si llega tarde.
Esto, myTimer, spasdue...
Supongo que tiene más información como que hora es, como es el cron, lo que sea.
Así que, aquí dentro, en lugar de hacer todo esto, porque esto...
No sé, no sé para qué es esto, spasdue...
O sea, ¿esto qué significa?
¿Se puede ejecutar tarde la función por X motivo?
Bueno, es un poco raro.
El tema, que vamos a pasar todo lo que teníamos aquí.
Un poco de pavo.
Teníamos aquí los shops.
Esto lo podemos poner aquí fuera.
No pasa nada.
Y todo lo que teníamos dentro, esto, esta parte de aquí, pues nada.
Básicamente la ponemos dentro de nuestra función.
Y ya está.
Este Chromium...
Ah, vale, porque no lo he importado.
Espérate.
Esta línea de aquí...
Vamos a traernos también el tsecheck.
¿Vale?
Y ahora, en principio, tendría nuestra función...
Estaría haciendo exactamente lo mismo.
Tanto el context como el myTimer, en principio, no son importantes.
Pero entiendo que aquí, en lugar de utilizar el console, podríamos utilizar el context.log.
Lo que no sé es si el context.log es básicamente para hacer algún tipo de...
De login que se pueda ver en Azure para alguna cosa.
Es que es la primera vez que utilizo un Azure expansion.
O si realmente es para hacer el console.log.
Pero si no, podemos hacer las dos cosas.
Podemos hacer aquí...
Log.
Vamos a crear aquí esto.
Y vamos a hacer las dos, más que nada, para asegurarnos.
Context.log.
Total, como lo estamos haciendo de prueba.
Y al finalizar todo esto, aparte, también podríamos hacer una respuesta.
Porque al final, una Azure function, cualquier cosa de estas...
Al final, lo que tú quieres es llamar la función y ver qué es lo que devuelve.
Así que podríamos...
Yo entiendo que aquí...
O sea, context.res.
Y podríamos tener un objeto...
Bueno, aquí no, ¿eh?
Esto lo tenemos que hacer al final.
No aquí.
Podríamos ver dónde se han estado encontrando...
O si hay alguna...
Hay algún tipo de...
De stock disponible.
Así que...
Uy, ¿por qué esto?
Ahora...
Vale.
Así que...
Vamos a poner aquí, por ejemplo, avalable.
Vamos a poner que si tiene stock.
Y si tiene stock, entonces avalable.push.
Y le vamos a pasar por un lado el vendor.
Bueno, le podemos poner el vendor y ya está.
¿No?
Tampoco es importante realmente vendor.
Y aquí en context.res, pues podríamos decirle, por un lado, los headers.
Que bueno, headers...
Si no le ponemos headers, podríamos tener una respuesta normal y corriente.
O sea, podríamos poner que sea json.
Que puede tener sentido.
Y el body que sea el json.
Oye, hay una cosa que me está tocando un poco las narices.
Y es el hecho de los tabs.
No sé por qué.
No sé si es que me ha añadido aquí un editor o algo.
No veo ni...
Ah, local.settings.
No, pero esto tampoco.
Host.json.
No sé, no sé por qué los tabs funcionan mal en este fichero.
No sé si es que cuando lo ha creado...
A ver, tab size.
Tab, size.
Tab.
Tu, tu, tu.
Indent.
Convert indent to spaces.
Indent.
Indent line.
No sé si es que me lo ha detectado mal.
O cuando ha creado el archivo que a lo mejor estaba regular.
Bueno, en body podríamos poner...
¿Ves?
Es que me lo está haciendo de cuatro.
Aquí abajo normalmente se puede configurar, pero tengo tantas cosillas.
Bueno, ya me lo miraré.
Vendors o Available on.
Y podemos poner aquí.
Available.
Si tenemos aquí Available.length mayor a cero, pues...
.join.
Vamos a poner aquí disponible en...
Por ahora vamos a hacer esto, ¿vale?
Luego ya le echaremos un vistazo a esto mejor.
Available on.
Vamos a extraer esto aquí para que sea un poco mejor.
Esto lo vamos a hacer con esto.
Y esta vale y volón.
Es lo que vamos a poner aquí en la respuesta.
Le decimos que sea tipo JSON.
O sea que esto más bien...
Bueno, sí.
Si lo hacemos...
¿Sí?
Ay.
Si es que ya es un objeto.
O sea que ya está.
Vale.
Vale.
Deploy to Azure, bla, bla, bla.
Deploy, bla, bla, bla.
Publishing...
La verdad es que me sorprende que...
Confirming Chromium.loadLocation.
By default Playground.loads Chromium to a location outside the functions folder.
En order...
Ver, esto es importante.
Esto es importante.
A ver.
Confirming Visagrat for Remote Build.
By default Azure Functions, extension will deploy the app using local build,
which means it run MP install locally and deploy the app package.
For Remote Build, we update the apps...
Entiendo que esto es en el...
Este no.
No está.
Local settings tampoco.
Esto no es.
Esto no es.
Esto no es.
Y where deploy is Azure Functions core tools, we can step this.
Ah.
Aquí es donde me ha dejado mejor algunas cosillas, por lo que veo.
Qué raro que lo deje en VS Code, ahí todo escondido, ¿no?
To enable SCMD deploy...
No sé qué, no sé cuántos.
Do build during deployment.
Vamos a ponerlo, que es lo peor que puede pasar.
Que reviente algo.
Project language, JavaScript, post deploy task, MPM install.
Un poco raro.
What's over can read, post deploy task, que es esta de aquí.
Ampli deploy task, que veo...
Ah, que también hay.
MPM prune, no tiene mucho sentido.
And because we are running MPM install remotely, podemos añadir no modules en el funcignore.
¿Vale?
O sea, el funcignore.
Aquí podemos poner no modules porque lo vamos a instalar después.
Lo van a instalar cuando se haga el deploy.
No lo vamos a instalar...
O sea, no vamos a instalar las dependencias localmente y desplegar la función.
¿Vale?
Vale, esto entiendo que ya está hecho.
Esto sí que parece importante.
By default, Playwright desloads.
Deploy significa desplegar.
By default Playwright desloads, el Chromium to Allocation, fuera de la función.
¿Vale?
In order to include Chromium, they build artifacts.
Tenemos que decirle a Playwright que instale Chromium dentro del no modules.
Para hacer esto, creamos un app setting llamado...
App setting, ¿vale?
Pero por app setting, ¿dónde es este app setting?
Pues dice, creamos un app setting.
Coño, pero es que esto parece una variable de entorno.
With a value 0.
O sea, ¿dónde se crea un app setting?
En...
Aquí.
Add new settings.
Vale.
Add new settings.
Claro, es que yo lo entiendo, más que add setting, lo entiendo como variable de entorno.
Pero bueno.
Y esto a 0.
Ah, vale.
Se pone y luego el valor 0.
Pum.
Vale.
Estas serían como las variables de entorno.
¿Vale?
Yo lo entiendo así, pero bueno.
Hidden value, bla, bla, bla.
Playwright process path, 0.
Vale.
Publishing the app.
Bueno, esto se supone que más o menos...
A ver.
Más o menos hemos hecho unas cuantas cosas ahí.
Que tienen sentido.
Vamos a hacer el deploy.
Y...
Sí, hombre.
Claro que estoy de seguro.
Que es lo peor que puede pasar.
Eh...
Esto me sorprende un montón.
Todas estas cosas que te pone aquí.
Como...
Entiendo que...
A ver.
Habrá que agregarlas.
Vamos a agregarlas.
Add psc code folder settings.
Porque entiendo que aquí no hay ningún tipo de key ni nada raro.
Sino que simplemente es como para configurar el proyecto de primeras.
Así que...
Venga, vamos a añadirlo.
Venga, vamos a añadirlo.
Func ignore.
Ignore these files for Azure Function deployment.
Aquí supongo que el nuevo modus está.
Vale.
Change git ignore.
To adapt to Azure Functions needs.
Vale.
Host.json.
Host.json.
Aquí tampoco veo que hay información chunga.
Info regarding host.
En realidad este index...
Este index no tiene...
No tiene valor.
O sea, este index...
O sea, no debería...
En la raíz del proyecto no deberíamos tener ese...
Ese archivo.
Porque al final lo que utilizamos...
Voy a poner este screenshot aquí dentro.
No sé si eso lo utilizará para algo.
Total.
Las funciones son fungibles.
O sea, que entiendo que no sirven para nada.
Este package.json entiendo que sí que tiene sentido aquí.
Esta es la función nuestra.
Es every 10 minutes.
Vale.
Y no modus cuando se instala.
O sea, este index...
No tiene sentido.
Y...
Remove...
Index from root.
Anadapt dependencies.
Y esto sería para crear...
Create every 10 minutes function.
Vale.
Bueno, no sé.
A ver.
Ahora veremos.
Ahora veremos qué tal.
No está mal.
No está mal la cosa.
A ver.
Entiendo que esto ha tenido que terminar.
¿No?
La...
La función...
Está en ello.
Ahora.
Ahora aparece.
Y ahora si nos vamos a nuestras funciones...
Que es que tengo aquí.
Vale.
Vale.
Executing functions...
Se ve bien.
No sé qué sé cuánto.
Probar, ejecutar.
Bueno, a ver.
Actualizar.
Ahora deberíamos ver todo el código.
Con todo.
¿Vale?
Ahora sí que deberíamos ver todo el código en condiciones.
Con todo lo de...
Hay paupetir playwright y todo esto.
Que a ver.
Puede dar problemas.
Porque hay que pensar que el entorno en la nube...
Entorno en la nube.
Bueno.
En una serverless function no es lo mismo como hacerlo en local.
En local está bastante mejor controlado.
Pero bueno.
Vamos a ver.
Oye.
Como tarda, ¿no?
O sea.
Esto debería ser inmediato.
La verdad es que...
No sé.
Functions.
Es que alucino que...
¿Pero qué le pasa a esto?
¿No es compatible con funciones?
Sí.
Esto ya me he enterado.
Es que tarda la vida esto.
Es que no...
No tiene mucho sentido cuánto tarda.
O sea.
No puedo verlo esto mientras, ¿no?
No sé.
Es que se está deployando.
Ahora no sé.
No sé.
La UX...
La UX de Azure me está poniendo un poco nervioso.
¿Vale?
Me está poniendo un poco nervioso.
Porque ahora ya no sé si soy yo...
O...
¿Qué le pasa?
Bueno, yo qué sé.
Vamos a quitarle los anuncios a esto.
Application...
Plam, plam.
Nada.
Se queda pensando.
Sí, he quitado la blocker.
Pero nada, nada.
Tampoco.
Tampoco, ¿eh?
Browse website.
It's up and running.
Esta es la cara que te pone cuando revienta la Windows.
No me deja muy tranquilo esto, ¿eh?
No me deja muy tranquilo.
A ver, ejecutar funciona ahora.
Nada.
404.
Vale.
Start streaming logs.
A ver, enséñame los logs.
Igual vemos ahí un error o algo.
Vale.
Request failure.
Committed memory.
Solicitudes.
Loading functions.
Metadata.
Esto...
Supongo que esta es la...
Las funciones.
O sea, la consola.
Host status.
Cero funciones cargadas.
Bueno, esto es a las tiendas.
Cero functions loaded.
Azure me está...
Vacilando.
O...
Claro, estoy que...
Estoy que le quito...
¿Ves?
Es que...
MySure is running locally.
Bueno, es que no quiero ahora ejecutar lo local.
Si lo estoy desplegando es para verlo.
Claro.
Una cosa que me está preocupando es el hecho de que como lo he puesto en un timer...
Claro.
Que me diga, no, es que tiene que ser cada 10 minutos, ¿sabes?
Pero claro.
Hay formas normalmente de...
Al menos en...
Es que alucino que no me da...
No me dice nada.
¿Dónde está mi función?
Enséñame...
Déjame verla.
Dicen ejecución.
Dinámico.
Ya verá mañana 5.000 euros.
Recuento de ejecuciones de la función.
O sea, a mí lo que me gustaría es de alguna forma simular que ha llegado ese momento de...
Mira, es que no está la función.
No está.
O sea, aquí no está.
Me ha desaparecido.
Es que me parece...
Es que me parece...
No sé si es que ha desaparecido porque...
Bueno, a ver si he hecho algo.
Vamos a ver, vamos a ver.
A ver si es que...
Sí, sí, ha desaparecido.
Ha desaparecido la función.
Se están cargando.
¿Cómo que se está cargando?
Ay...
Vamos a ver.
Output window.
Vamos a ver si ahora hace...
Entiendo que tarde el despliegue, porque claro, ahora la instalación del navegador se está haciendo...
¿Vale?
A ver ahora.
Using...
¿Vale?
Esto está bien, correcto.
Aquí estamos viendo todo lo que está haciendo con el despliegue.
¿Vale?
O sea, que aquí deberíamos detectar si hay algún error.
Hostia, eliminar el index.js.
Pero es que no debería, porque a ver, ese index.js es que le da igual.
Es que no sirve para nada ese index.js.
Claro, aunque este main...
Pero a ver, es que da igual.
Es que no...
Bueno, aquí podemos ver que ha hecho bien el npm install.
¿Vale?
Playwrite.
Esto lo ha hecho bien.
Note install.
O sea, está haciendo bien la instalación.
Esto lo está haciendo bien.
Creating.
O sea, hasta ahora tiene buena pinta.
¿Vale?
Generate script.
Creando el file system.
O sea, ha hecho un npm install.
No sé si el npm install lo ha hecho local.
Yo imagino que lo está haciendo allí.
O sea, hasta ahora tiene buena pinta.
¿Vale?
Está haciendo el deploying.
O sea, que bien.
No sé realmente ahora qué está haciendo porque se ha quedado así como picueto.
No sé si es un tema a lo mejor de que ocupe demasiado.
Puede ser, ¿eh?
Que hay veces que estas cosas pasan.
Playwrite Azure Functions.
Porque aparte que había un artículo.
Aquí hay un example project to run.
¿Ves?
Y esto host.
¿Ves?
Esta gente tiene un proyecto bastante similar.
Claro, ellos están utilizando un docker.
A ver, igual deberíamos utilizar un docker.
Si es el caso, pues nada, lo haremos.
Running hardless.
A ver si este es más actual.
Hostia, hay artículos más feos, más raros.
Dios mío.
Dice, con la reciente actualización de Azure Functions, ahora es posible ejecutar en el, justamente, el plan que tengo yo.
Browser Automation, no sé qué, no sé cuánto.
Leer más.
¿Vale?
Mira, este me interesa.
Use Puppeteer and Playwrite in Azure Functions.
¿Vale?
Playwrite es justamente...
¡Ay!
Ojo.
Ojo que aquí pone algo interesante, ¿eh?
Ahí pone algo interesante.
Es que esto...
¡Ah, mira, mira!
Ha terminado.
Ha terminado.
¿Vale?
Resetting all workers.
All workers.
Deployment.
No HTTP triggers form.
¿Vale?
Esto tiene sentido.
Pero no me aparece la función.
No aparece mi función.
¡Ah, no!
Está aquí.
Pero...
Pero...
Pero, ¿ves?
Me sale en el...
Me sale en el...
En el...
En el local project, ¿no?
En el pago por uso, que es el que me interesa.
¿Sabes?
Es como que no me...
Me sale aquí.
O sea que...
De forma local sí que tengo aquí mi function, pero aquí no me aparece el function.
A ver si es que...
Deploy to Azure...
Runtime 3...
Igual es algo de lo que me he petado aquí.
Publishing the app.
To deploy function app.
Esto es lo que he hecho.
Use an answer function, screw tools, bla, bla.
Pero no.
Me ha desaparecido.
Me ha desaparecido.
Te ha eliminado Azure el fichero para no enviarte una factura de 3 ceros.
A ver, pues mira, al menos...
No hace falta Docker.
¿Para qué?
No, no debería hacer falta Docker.
Lo que pasa...
Mira, Julio me dice...
Ves al portal.
Ah, mira, ahora sí que está mi función.
Pero a ver, esto me está vacilando muy fuerte.
Me está vacilando muy fuerte porque...
Aquí no me sale ahora.
O sea, no me sale aquí.
Ahora sí que me sale en el portal.
Me está vacilando.
He estado habilitado.
Venga, solo quiero código y prueba.
La quiero probar.
Cuando entro a código y prueba, se queda pensando.
Ah, ojo, ojo.
Ahora sí que tengo aquí mi código.
Perfecto.
Muy bien.
Muy bien.
Probar y ejecutar.
Esto no sé por qué...
¿Por qué me sale eso?
Clave.
No sé.
Master.
Ejecutar.
Y conectándose con no sé qué, no sé cuánto.
Venga.
Posting.
A ver, si ahora peta, pues perfecto.
No pasa nada.
Que pete y ya está.
Fail.
Perfecto.
Muy bien.
Ha petado.
Pero no tenemos ni puñetera idea de por qué ha petado.
Entiendo que supervisión en algún sitio deberíamos tener...
Vale, error.
Vamos a verlo aquí.
Ahora hago registros.
Vale, no pasa nada.
Está bien que las cosas peten.
Pero quiero saber por qué.
Functions es que...
O sea...
¿Dónde está registros?
Pero es que no hay log ni nada.
O sea, ¿dónde está mi log?
Verbose error.
Error.
Ya está.
O sea, eso es todo lo que te tengo que decir.
Eso es todo lo que te tengo que decir.
Ay...
A ver, que si se nos complica mucho, pues al final lo haremos como una lambda o lo haremos en otro sitio.
Pero estaba interesante para aprender, pero no hemos sido capaces.
No hemos sido capaces al final de hacerlo.
Hemos estado cerca.
Hemos acariciado el cielo.
Ahora lo único que quiero es ver los logs.
Pero al parecer no puede ser.
A ver, tiene buena pinta de que la duración son 5 segundos.
Es normal, tarda más.
Pero lo que me gustaría es ver...
Es que ya está.
Es que esto es todo.
No sé si lo deberíamos ver.
A ver, yo entiendo que deberíamos verlo aquí.
Y por aquí debería tener, aparte de métricas y todo esto, en algún sitio deberíamos tener logs.
O registros, como le llaman.
No sé si más generales.
Supervisión.
Métricas.
Registros.
Vale.
Página principal.
Cállate.
Responde.
No sé qué consulta.
No sé qué.
Que no.
Que me digas.
Que...
Habla.
No.
Esto tampoco es.
Page View Request.
A ver, no debería ser tan difícil, ¿eh?
Secuencias de registro.
Conectar su application insights.
Nada, pero si no me sale en el otro...
¡Ojo!
Aquí...
T-t-t-t-t.
T-t-t-t will be...
Vale.
Esto está bien.
Pero es que esto no me dice nada.
No me dice nada.
Esto.
No me dice nada.
No me dice nada.
No me dice nada.
Y así no mola.
Ves Application Insights
Pero si ya estamos en
Registros y archivos, aceptar
Ojo, a ver
Ok, esto está vacío
Esto está vacío
Ves Application Insights
Application Insights
No sé si es que hay un servicio
Se llama exactamente
Registros
No
Application Insights
Xbox Series X
Pero es que es lo mismo
Es lo mismo
Mira las direcciones, no sé si, registros
No, es lo mismo
Countries, no sé qué
Si lo único que quiero es ver los logs
Vaya
Vale, dificultad ver los logs también
Que lo que alucino es que todavía aquí no aparece mi
Ahora sí que me aparece la función
Star Streaming Logs
Vamos a ver si puedo ver el streaming de los logs aquí
Live Metrics
Vale
Bueno, vale
Aquí tenemos esto
Ejemplo de telemetría
Ver en registros
No
A ver
Estoy bastante seguro que debo ser yo
Que no estoy encontrando
Dónde están los logs
Los logs normales y corrientes
Porque yo entiendo que nuestra
O sea, nuestro programa
Está en algún sitio
Metiendo esto
Por favor, es B
No BES
BES es de ver
Y B es de ir
Efectivamente
Efectivamente
He dicho BES Application Insights
Porque no sabía que si
Julio Burgos me quería decir de ver
O de ir
He leído su comentario
Ya me sé la diferencia
Nada
Live Metrics
Ni siquiera aquí aparece
Que haya fallado
La request
Ni nada
Memoria asignada
Total de CPU
Servidores
Es que esto además
Son más como las ricas
O sea, no es el login
004
Sí, sí
Sí, 004
Está muy bien
Excepciones
BES lo dice mucho
En Valencia, Cataluña
Supongo que es algo en catalán
No, eso es un error
Es que en Cataluña
En catalán se dice BES
Pero
De
De Ana
No sé ni siquiera
Pero sí es verdad
Que es un error
Muy común
Que en castellano se dice
La gente que es de Cataluña
Mira aquí
Al menos a ti dice
Failure Exception
Que yo ni siquiera
He sido capaz de encontrarlo
Si es un estudio code
Tengo una sección de logs
Ah, mira
Connect to application
Venga, va
Proxies
Detail trace
Aquí nada
Connect to log stream
Qué dificultad
Dios mío
Si me hubiera dado ahí
Me hubiera aparecido
Pero es que son estos logs
Otra vez
Es que no me puedo creer
¿Cómo que BES
Es la forma imperativa
Que está bien dicho
Es B
De ir
Es B
B allí
B a buscar patatas
¿Ves?
Es como
¿Lo ves?
¿Ves?
¿Ves o no lo ves?
Pero de ir
B
Con B
Con B alta no es
A ver
Forma
Imperativa
Verbo
Ir
Bueno
Iros
Ir
It
O sea
B
B de


Ve
Yo
Vete
Idos
Hostia lo de idos
Ve
Anda
Anda
Anda
Vos
Anda
Anda
Anda
Bueno
Bueno
Esto es argentino
Esto es argentino
Esto es argentino
Me parece
Anda
Pues nada
No
Connect to
Logstream
Pero Logstream
Es otra vez
One more time
Es exactamente lo mismo
No sé si es que
No lo veo
Iros a daos hostias
Conmigo
Joder
La hostia
La gente está muy
No sé si
Más información
No sé
Si es que
Estos puntitos
Aquí
Nombre de servidor
Ya le he dado el nombre de servidor
Entiendo que aquí
En traza
Sí que tiene sentido
¿Ves?
Si tengo la excepción
O sea
Parece que es esta parte
De aquí
¿Vale?
Porque pone
Ejemplo de telemetría
Que el título
Es horrible
Pero
Ojo
Ojo
Que
La madre lo parió
Ojo
Que
Que está aquí
Todo el trasto
¿Eh?
Pues es esto
Madre mía
Madre mía
Vamos a ver
Failure
Exception
Error
Browser
Type
Punto
Launch
Vale
Vale
Vale
Ya
Hostia
Sé por dónde pueden ir los tiros
Creo que sé por dónde van los tiros
Es por el headless
Que lo he dejado a false
Y esto debería ser true
Ojo
Ojo
Cuidado
Que igual lo arreglamos
¿Eh?
Que igual van por ahí los tiros
Porque
Porque puede ser que sea esto
Eh
Vamos a
True
Vale
Vamos a volver a ejecutar la función
Pero
Ha costado
¿Eh?
Ha costado
Porque ha costado hasta encontrar los logs
Y la madre los trajo
Y todo por culpa de estar en castellano
¿Eh?
Porque
Sinceramente
Ejemplo de telemetría
Y por ejemplo
Es que no sé qué quiere decir
Por ejemplo
Pero bueno
Está bien que al menos hemos encontrado esto aquí
Y ahí sí
Ese sí que era el problema
Y porque por suerte se ejecuta en ese momento
Porque como es cada 10 minutos
Pues se ha ejecutado
Pero es que
No se lee bien
No sé si soy yo
Pero
Porque no puedo acceder a la telemetría esta
En condiciones
Es que no sé
No me parece tan difícil
Esto de que aparezca así
Tan chiquitito
A ver
No switch file or directory
Open
System
O igual el problema es este
CPU free
No sé qué
No sé cuánto
Ya veremos
Ahora veremos
Cuál es el problema realmente
Espero que sea el del headless
Pero no descarto nada
Bueno al menos
La petada ha sido bien petada
Y ahí hemos visto
Vale
Al menos se está desplegando
Vamos a probar con esta última
Idos es el supuesto imperativo
Pero casi nadie lo dice
Sí, sí
Su usuario
Ya lo sé
Y una lengua es lo que la gente dice
Iros
Por eso la RAE lo acepta

Iros está aceptado
Yo no he dicho que no está aceptado
¿Cómo os picáis con el tema de la lengua?
¿Qué os pasa en la lengua?
Os picáis mucho
Con la lengua
Que si el B es el B
El id
Iros
Yo digo id
No digo
O sea no
Digo
Iros
Iros
Lo digo con R
Yo no he escuchado en mi vida nadie decir idos
Bueno sí
Para decir
Están idos
De la cabeza
Pero no como
Irsus
Si me queréis
Irsus
Bueno vamos a ver
Que esto está desplegando
Yo solo quiero ver
Cómo esto funciona
Para
Vamos
Veo que
Va a ser difícil igualmente
Que funcione
No sé
Es como que no me fío
Es como que
Veo demasiadas
Incertidumbres
Demasiada incertidumbre
Veo aquí
Demasiada
Pero bueno
Ojalá
Ojalá
Venga vamos a los servicios
Vámonos a
Nuestra aplicación de funciones
Xbox Series X
Claves
Funciones
Eventos
Funciones
Aquí debería aparecer la nuestra
Aquí la tenemos
Pago por uso
Código y prueba
Código y prueba
Código y prueba
Código y prueba
Pero por qué
¿Qué le ha pasado esto?
La interfaz
A veces es que
Tiene unas cosas
Muy raras
Esta
De verdad
A ver
Solo quiero probarla
Porque ahora
La UX
Me ha hecho
Esa cosa extraña
Eso quiero yo
Ahora
Ahora me la ha abierto
Bien
Código y prueba
Probar y ejecutar
No sé por qué
Por defecto
Aparece toda esta basura
Pero bueno
Bueno se supone
Que ya está
Completada
Vale
Así que
Esta debe ser
La última versión
Ejecutamos
Y vemos la salida
Y apeta otra vez
Fantástico
Vamos
Me encanta
Lo ves
Lo que es una rabia
Es el hecho de
Detallar
Información
Error
No
Enséñame
Enséñame todo
¿Por qué me tienes que enseñar?
Oh
Ojo
Algo está haciendo
¿No?
Algo está haciendo
Ahí
Ha petado
Ha petado
Pero algo ha hecho
Algo ha hecho
Ha petado
No sé en qué momento
Ni por qué
Al menos
A ver
36
Bueno
Al menos aquí
Sí que tenemos bien
No puedo encontrar
Ah
Para el screenshot
Vale
Vale
Vale
Fuera
Fuera
Nada
Bicho
Bicho
Bicho
Bicho
Bicho
Bicho
Screenshot
Nada
Quitamos el screenshot
No pasa nada
Screenshot
Esto es porque
Claro
Tiene sentido
No puede guardar
Este tipo de cositas
Quitamos lo del screenshot
Esto lo dejamos
Avoid
Storing
Screenshot
Claro
Si es que no tiene sentido
Lo del screenshot ahora
Venga
Hacemos el deploy
Ojo que al final
Ojo que al final
Ojo que al final
Nadie daba un duro
Nadie daba un duro
Y aquí estamos
Nadie daba un duro
Lo pruebo
Lo pruebo
Lo pruebo
Digo yo
Que no tengo que hacer
Nada más
O sea que
Esto va a utilizar
La última versión
Disponible
Ya
Bueno no sé
Si peta
Intento hacer otra cosa
Ya está
Se conectó
Hola
Hostia
Dos de byte
Me ha dado bytes
Y no ha dicho nada
Raro me parece
Y todo
No es que ves
Aquí podemos ver
Ojo
Ojo
¿Cómo que el FNAC tiene stock?
¿Cómo?
Esperate, ¿cómo?
Me ha engañado
Falso positivo
Falso positivo
¿Qué ha pasado ahí? ¿Qué ha pasado?
¿Cómo que tiene stock?
Es mentira
Vamos a tener que revisar esta lógica
Esta lógica me engaña
Me ha engañado durante un momento
Me ha engañado
Y falla
Y falló
Bueno, al menos
Vamos a ver aquí
¿Cuál es el fallo que ha tenido?
36, 91 nuevas
Page text content
Bueno, esta
Add to card to desktop
El corte inglés
Bueno, el corte inglés parece ser que
Pero no pasa nada
O sea, es normal que pueda petar
No pasa nada que pete
En este caso, lo que ha pasado
Le pondré un try catch
Para que no quede tan mal
Seguramente
Pero esto es porque ha fallado
En hacer algo en la tienda
Vale
Pero bueno, es una mierda
Que no aparezca aquí la información
Pero bueno
Funcionaron
Así que ha funcionado
Esto del FNAC lo tenemos que revisar bien
Pero bueno
Oye, ha estado increíble
¿Qué quieres que te diga?
En dos horas y media
Hemos hecho un scrapper
Hemos hecho el deploy
En Azure Functions
Es la primera vez que toca
Azure Functions
No está mal, ¿no?
Y hemos estado hablando
He estado bebiendo un poquito
Pero no era que validaba
Si era bot
Me imagino que eso es lo que falla
Que no lo está validando
En este sentido
Pero bueno
Bueno, no pasa nada
Ya miraremos
Formas alternativas
A lo mejor
Si lo juntamos
El papetier
Con hacer los fetch
Y cosas así
Poco a poco
Es la primera iteración
Pero ya me sirve
Pues nos vemos
La morcilla Pablo Carmona
Di que sí
Bueno amigos
Me voy
Me voy echando
Porque me voy echando
Leches
Porque es que
Me voy a todo gas
Como diría aquel
Me voy porque
He quedado
Ya lo sabéis
Bueno
Que os aprecio mucho
Os mando un abrazo enorme
Joder
Todos dos dos
Gracias por esos mil bits
Creo que es la primera vez
Que recibo mil bits
Pero esto es una locura
Mil bits
Me cago la hostia
Mil bits
Con eso me lo voy a cenar
Me lo voy a cenar
Falla por el content rest
Que el punto body
Debe ser una string
¿Tienes una string?
Anda
Ah pues me lo miraré también
Pero que raro ¿no?
Porque si le puse
Que tenía que ser de tipo json
Pensaba que le iba a pasar un json
Pero gracias
Me lo miraré pues
Oye
Bueno me puse a los cambios
Si queréis
Pues haced deploy
Y tal
La próxima lo automatizaremos
Y todo esto
¿Vale?
Os mando un abrazo
Sed buenos
Cuidaos mucho
Muchas gracias
Y nada
Que nos vemos próximamente
A ver si consigo mi Xbox Series X
Hasta luego
Chao
Chao
Chao
Chao
Chao
Chao
Chao
Chao
Gracias por ver el video.