Buenos días,
Hace ya días que os voy leyendo y vuestros consejos y recursos me han permitido hacerme con una 3080 y ahora con un Ryzen 5000. Agradecido, me he dado de alta para postear un par de pequeños bots que he hecho en base al de
@RaD3R, con alguna mejora digamos de calidad de vida.
Para que funcionen hay que tener instalados xmllint y html2text. En Debian (y Ubuntu, Mint, etc...) se instalarían con:
apt install libxml2-utils html2text
Los códigos no son especialmente leíbles y he dejado chivatos porque sinceramente ya me iban bien puesto que los he seguido reutilizando para distintas tiendas.
El primero es para PcComponentes, y lo hice después de que el bot me avisara de un artículo a precio de usura del marketplace de pccomponentes. El problema cuando pasa eso es que si alguien lo pone tambien a la venta a precio normal, el bot no te va a avisar, o sea que tienes que estar pendiente de la página hasta que el artículo vuelva a aparecer como no disponible. Sigue el código:
#!/bin/bash
FLAG=0
FLAG_NO=1
while :;
do
clear
date
OUTPUT=$(curl -sL -H Cache-Control: no-cache https://www.pccomponentes.com/amd-ryzen-9-5950x-34-ghz | xmllint --html --xpath "(//div[@id='btnsWishAddBuy']/button[contains(@class,'btn')])[3] | //div[@id='precio-main']" - 2>/dev/null | html2text -utf8)
if echo $OUTPUT | grep Comprar
then
PRICE=$(echo $OUTPUT | grep -oe '\([0-9,€]*\)')
if [ $FLAG != $PRICE ]
then
./telegram -t *************************TOKEN*********************** -c ****CONVERSACIÓN**** "######BETA###### PCCOM RYZEN 9 5950X disponible a $PRICE "
FLAG=$PRICE
FLAG_NO=1
fi
else
if [ "$FLAG_NO" -eq 1 ]
then
echo "0"
./telegram -t *************************TOKEN*********************** -c ****CONVERSACIÓN**** "######BETA###### PCCOM RYZEN 9 5950X NO disponible"
FLAG_NO=0
FLAG=0
echo "control"
fi
fi
sleep 10
done
Para monitorizar el estado de otro artículo (por ejemplo una gráfica RTX 3000) solo hay que cambiar la URL en la línea:
OUTPUT=$(curl -sL -H Cache-Control: no-cache
https://www.pccomponentes.com/amd-ryzen-9-5950x-34-ghz | xmllint --html --xpath "(//div[@id='btnsWishAddBuy']/button[contains(@class,'btn')])[3] | //div[@id='precio-main']" - 2>/dev/null | html2text -utf8)
Por la URL del artículo que nos interese.
Evidentemente también hay que cambiar *************************TOKEN*********************** por el token de nuestro bot y ****CONVERSACIÓN**** por su conversación con nosotros.
El segundo funciona en varias tiendas que usan la misma plataforma. Creo que eran Wipoid y Neobyte. Pero con los cambios oportunos que luego explicaré puede usarse prácticamente con cualquiera.También tiene una diferencia de uso.
#!/bin/bash
FLAG=0
FLAG_NO=1
while :;
do
clear
date
OUTPUT=$(curl -sL -H Cache-Control: no-cache $1 | xmllint --html --xpath "//span[@id='availability_value'] | //span[@id='our_price_display']" - 2>/dev/null | html2text -utf8)
echo $OUTPUT | grep "$2"
if [ $? = 1 ]
then
PRICE=$(echo $OUTPUT | grep -oe '\([0-9,]*\)' )
if [ "$FLAG" != "$PRICE" ]
then
./telegram -t *************************TOKEN*********************** -c ****CONVERSACIÓN**** "######BETA###### $1 disponible a $PRICE€"
FLAG=$PRICE
FLAG_NO=1
fi
else
if [ "$FLAG_NO" -eq 1 ]
then
echo "0"
./telegram -t *************************TOKEN*********************** -c ****CONVERSACIÓN**** "######BETA###### $1 NO disponible"
FLAG_NO=0
FLAG=0
echo "control"
fi
fi
sleep 10
done
En este caso le pasamos por línea de comandos tanto la URL del producto como un texto a buscar para comprobar si está disponible o no. En el caso de Neobyte sería, por ejemplo, si no recuerdo mal...:
./bot https://www.neobyte.es/asus-tuf-rtx-3080-gaming-10gb-7282.html "No disponible"
En todo caso podéis ejecutar la línea
curl -sL -H Cache-Control: no-cache https://www.neobyte.es/asus-tuf-rtx-3080-gaming-10gb-7282.html | xmllint --html --xpath "//span[@id='availability_value'] | //span[@id='our_price_display']" - 2>/dev/null | html2text -utf8
Y os debería salir el precio y un texto indicando no disponibilidad, o al revés. Este texto es el que tenéis que poner como segundo parámetro. La ventaja es que sirve para varios productos y, además, en el mensaje telegram ya proporcionará el link para comprarlo inmediatamente.
Para usarlo con otras tiendas, yo he usado el Distill, puesto que XPATH me suena a chino mezclado con coreano. Siguiendo las instrucciones que hay aquí mismo sobre el Distill, te vas a la página, y con el ratón seleccionas primero el precio, y luego donde indica "no disponible". Para que funciona es esencial que lo hagamos con un producto que NO esté disponible, pues a veces el distill retorna condiciones de búsqueda distintas para productos disponibles que no disponibles, dependiendo de como se haya hecho la web. En todo caso, si seleccionas tanto el precio como "no disponible", el distill va a dar 2 conciciones de búsqueda XPATH, que sustituiremos en la línea
OUTPUT=$(curl -sL -H Cache-Control: no-cache $1 | xmllint --html --xpath "//span[@id='availability_value'] | //span[@id='our_price_display']" - 2>/dev/null | html2text -utf8)
Debería quedar así:
OUTPUT=$(curl -sL -H Cache-Control: no-cache $1 | xmllint --html --xpath CONDICION1 | CONDICION2 - 2>/dev/null | html2text -utf8)
Un detalle... He podido comprobar que funciona perfectamente avisando de cuando hay stock y cuando no hay. Si la web de la tienda se cae puede dar falso aviso de stock, pero en cuando vuelve a estar online envía el de que no hay. No he podido aún comprobar que avise de cambios de precio, porque no se ha dado el caso. Pero debería.
Espero que se entienda, haberlo explicado bien y que le sirva a alguien. Tengo bots ya preparados para varias tiendas. Si interesa puedo postearlos en otro momento con más tiempo.
Saludos!