Consumir API de Yapo.cl para búsqueda de trabajo [Bash]

freishner

Capo
Se incorporó
16 Noviembre 2021
Mensajes
298
En yapo siempre hay trabajos wenos, rápidos y no tan rápidos. Sin embargo, algo fundamental es llegar rápido con los publicantes. Para eso quería compartir un tenten pié para utilizar la nueva y flamante API que pusieron hace un tiempo. Antes había que darse la paja de hacer scraping. Ahora 25 líneas bien derrochadas desde un copy paste del inspector de código de chrome, y algo de bash, hacen toda la pega. Fácil, rápido y bonito.

Yo se que le van a dar buen uso...

Ésta fué la parte mas difícil. El JSON resultante ya saben como trabajarlo. Nada que un buen cronjob no nos pueda indicar cada x tiempo con una alarma en nuestro OS favorito.

Bash:
#!/bin/bash
# CLI PARAMETERS
# P1: PAGE
# P2: LIMIT

x_txtref=$(http -b GET https://new.yapo.cl/main.5fc9887f6d5b25d4.js | egrep -E -o "key:\".{36}\"" | awk '{gsub("\"", "", $0); gsub("key:", "", $0); print $0}')

curl "https://public-api.yapo.cl/buyers/search?page=${1}&limit=${2}&query=%7B%22category%22:%5B7020%5D%7D" \
  -H 'authority: public-api.yapo.cl' \
  -H 'accept: application/json, text/plain, */*' \
  -H 'accept-language: es-CL,es;q=0.9,en-US;q=0.8,en;q=0.7' \
  -H 'origin: https://new.yapo.cl' \
  -H 'referer: https://new.yapo.cl/' \
  -H 'sec-fetch-dest: empty' \
  -H 'sec-fetch-mode: cors' \
  -H 'sec-fetch-site: same-site' \
  -H 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:100.0) Gecko/20100101 Firefox/100.0' \
  -H 'x-chref: WEB' \
  -H 'x-cmref: client' \
  -H 'x-commerce: Yapo' \
  -H 'x-country: CL' \
  -H 'x-domain: Buyer' \
  -H 'x-rhsref: new.yapo.cl' \
  -H "x-txref: ${x_txtref}" \
  --compressed > data.json

Ya que hay interés, vamos a agregar las instrucciones de instalación para las herramientas necesarias (por ahora).

Linux Debian (Ubuntu, mate, ...)

cURL

Bash:
sudo apt-get install -y curl

snap
Bash:
sudo apt install snapd

httpie
Bash:
snap install httpie

awk y egrep ya deberían venir con el sistema, para verificarlo usamos el siguiente comando.
Bash:
which awk
Bash:
which egrep

Deberíamos obtener las rutas de los ejecutables.

Ejecución

Con el copy paste del script, vamos a crear un archivo "archivo.sh" y vamos a pegar el contenido dentro de dicho archivo.
Luego en nuestro terminal tenemos que ubicar dicho archivo y darle permisos de ejecución.
Bash:
chmod + archivo.sh

Para correr el programa, sencillamente lo ejecutamos de la siguiente forma.
Bash:
./archivo.sh

Resultado
Un archivo data.json aparecerá en el mismo directorio en donde tengamos el programa. El cual tiene la siguiente estructura base.

1654441545360.png



Quizá cuando tenga mas tiempo, pueda ir desgranando el funcionamiento.
 
Última modificación:

Sago7

Tibetan Mod
Miembro del Equipo
MOD
Se incorporó
5 Julio 2006
Mensajes
6.072
Me paso de patudo si pido alguna orientación sobre como levantar el ambiente para probar estos cositos?.
 
Upvote 0

Miguelwill

I am online
Miembro del Equipo
MOD
Se incorporó
23 Febrero 2004
Mensajes
12.267
Me paso de patudo si pido alguna orientación sobre como levantar el ambiente para probar estos cositos?.
instalar paquete "curl" (apt install curl o como su sabor le deje )

copia el codigo en un archivo de texto que tenga extension .sh

dale permisos de ejecucion (chmod +x archivo.sh)

para ejecutar en la misma consola directamente (solo imprimira lo que deba): ./archivo.sh

si quieres debuguear lo que hacen los comandos:
bash -x archivo.sh

al final veo que la salida la desvia a un archivo .json, asi que eventualmente no va a devolver nada en pantalla, y todo el resultado estara en el archivo que indique despues de ">" , asi que ahi puedes mirar el resultado
 
Upvote 0

freishner

Capo
Se incorporó
16 Noviembre 2021
Mensajes
298
Miren estas métricas a nivel nacional para la última semana sobre anuncios publicados

1654318729437.png


Ahora cuantas de éstas se relacionan con "programador"

1654318833604.png


Reduciendo la búsqueda a "php"

1654318893548.png


Ahora para "web"

1654318958161.png


Y por último para "trabajos remotos"

1654319233638.png


Con toda ésta info pega no falta jeje
 
Upvote 0

Prinmode

Miembro Activo
Se incorporó
24 Abril 2020
Mensajes
2
instalar paquete "curl" (apt install curl o como su sabor le deje )

copia el codigo en un archivo de texto que tenga extension .sh

dale permisos de ejecucion (chmod +x archivo.sh)

para ejecutar en la misma consola directamente (solo imprimira lo que deba): ./archivo.sh

si quieres debuguear lo que hacen los comandos:
bash -x archivo.sh

al final veo que la salida la desvia a un archivo .json, asi que eventualmente no va a devolver nada en pantalla, y todo el resultado estara en el archivo que indique despues de ">" , asi que ahi puedes mirar el resultado

Falto instalar el package httpie
por ej, apt install httpie
 
Upvote 0

Prinmode

Miembro Activo
Se incorporó
24 Abril 2020
Mensajes
2
Esta bueno el script, muy interesante, ahí cache que se puede sacar la query de la consola de yapo.cl cuando haces una busqueda, quizás sea mas practico recibir la query por parámetro también

se agradece saludos
 
Upvote 0

sebaestrada

Miembro Regular
Se incorporó
1 Septiembre 2021
Mensajes
39
Mira que interesante, justo hace poco con unos amigos nos pusimos a scrapear yapo con su nueva interfaz, y no nos dimos cuenta que se podía hacer esto. Realmente esto nos puede ser de mucha utilidad 👍
 
Upvote 0

kilneriun

Miembro Activo
Se incorporó
27 Mayo 2023
Mensajes
1
Hola! de casualidad has visto como se puede obtener el `x_txtref` actualmente? No me está funcionando, ya que creo que cambiaron la forma de obtener la clave :c
 
Upvote 0

VitouXY

Miembro Activo
Se incorporó
28 Diciembre 2021
Mensajes
15
Hola! de casualidad has visto como se puede obtener el `x_txtref` actualmente? No me está funcionando, ya que creo que cambiaron la forma de obtener la clave :c


Bash:
x_txtref=$(cat /proc/sys/kernel/random/uuid)

Bash:
x_txtref=f00000ff-f0f0-0f0f-ff00-000f000fff0f

---

Bash:
# One-Line
curl --silent --fail --location --request GET --url 'https://public-api.yapo.cl/buyers/search' --get --data-urlencode 'page='${YPAGE:-0} --data-urlencode 'limit='${YLIMIT:-50} --data-urlencode 'query={"category":[7000,7020,7040,7060,7080]}' --data-urlencode 'orders={"orderBy":"listTime","typeOrder":"desc"}' --header 'Accept: application/json,text/plain,*/*' --header 'X-country:CL' --header 'X-domain:Buyer' --header 'X-commerce:Yapo' --header 'X-chRef:WEB' --header 'X-rhsRef:new.yapo.cl' --header 'X-cmRef:client' --header 'X-txRef:'$(cat /proc/sys/kernel/random/uuid) |jq '.ads | [.[] | {id: .listId, title: .subject, body: .body, price: .price, location: .location.communeName}]' -
 
Última modificación:
Upvote 0

VitouXY

Miembro Activo
Se incorporó
28 Diciembre 2021
Mensajes
15
Python:
#!/usr/bin/env python3

import urllib.request
import json
import uuid

YPAGE = 0
YLIMIT = 15

with urllib.request.urlopen(urllib.request.Request(f'https://public-api.yapo.cl/buyers/search?page={YPAGE}&limit={YLIMIT}&query=%7B%22category%22:%5B7020%5D%7D', headers={'User-Agent': 'Mozilla/5.0','Accept': 'application/json,text/plain,*/*','X-country': 'CL','X-domain': 'Buyer','X-commerce': 'Yapo','X-chRef': 'WEB','X-rhsRef': 'new.yapo.cl','X-cmRef': 'client','X-txRef': str(uuid.uuid4())})) as resp:
        response = resp.read()

if 'ads' in json.loads(response):
    print('\n************************************\n')
    for i in range(0, len(json.loads(response)['ads'])):
        print(f"*** {json.loads(response)['ads'][i]['subject']} ***")
        if json.loads(response)['ads'][i]['price'] > 0:
            print(f"{json.loads(response)['ads'][i]['location']['communeName']} \t${json.loads(response)['ads'][i]['price']}")
        else:
            print(f"{json.loads(response)['ads'][i]['location']['communeName']}")
        #print(f"\n{json.loads(response)['ads'][i]['body']}")
        print('\n************************************\n')
 
Upvote 0
Subir