No estoy seguro si el título tiene sentido. No tengo mucha experiencia en este tipo de cosas.
Esta es la situación:
Estoy ejecutando un servidor Linux con Ubuntu 20.04
Ejecuto un programa a través de secuencias de comandos .sh para extraer páginas web de diferentes URL.
Una URL devuelve un archivo que comienza así:
{"javaClass":"java.util.ArrayList","list":[No estoy seguro de si este es un archivo de clase Java o un archivo JSON, porque la URL no tiene extensión.
Puedo llamar a esta URL en mi navegador y se mostrará como texto. (Es por eso que puedo ver el código anterior).
Si lo llamo con curl en la terminal de Ubuntu, no hace nada.
¿Cómo puedo mostrar y leer esto como texto sin formato en Ubuntu Terminal para procesar los datos, como lo hago en mi navegador Chrome?
EDITAR: La URL en cuestión es esta: https://www.yes.co.il/o/yes/servletlinearsched/getscheduale?startdate=20211025&p_auth=w3wmBNc5
EDIT2: El token al final es cada vez diferente. Leí bien el token, así que ese no es el problema.
Descubrí que el sitio solicita cookies x-dtpc. Encontré esto sobre las cookies x-dtpc:
este encabezado lo establece el agente de JavaScript en los XHR y se usa para correlacionar las solicitudes de XHR con las acciones del usuario
Cuando abro la página y obtengo la URL de la consola del desarrollador, puedo abrir la URL en una nueva pestaña. Si obtengo la URL a través de mi secuencia de comandos, no puedo abrir la URL en el navegador.
Cargo cookies estándar, pero aparentemente eso no es suficiente.
En las herramientas de desarrollo de Chrome, puede hacer clic derecho en la solicitud específica y copiar la cURL correspondiente. Cuando abrí la página, se creó el siguiente comando:
curl 'https://www.yes.co.il/o/yes/servletlinearsched/getscheduale' \ -H 'authority: www.yes.co.il' \ -H 'sec-ch-ua: "Google Chrome";v="95", "Chromium";v="95", ";Not A Brand";v="99"' \ -H 'dnt: 1' \ -H 'sec-ch-ua-mobile: ?0' \ -H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36' \ -H 'x-dtpc: 1$418482539_291h9vJHPPKPVFOURUFMBUBCNHWPOEEHUEJATA-0e5' \ -H 'accept: text/plain, */*; q=0.01' \ -H 'x-requested-with: XMLHttpRequest' \ -H 'content-type: application/x-www-form-urlencoded' \ -H 'sec-ch-ua-platform: "macOS"' \ -H 'origin: https://www.yes.co.il' \ -H 'sec-fetch-site: same-origin' \ -H 'sec-fetch-mode: cors' \ -H 'sec-fetch-dest: empty' \ -H 'referer: https://www.yes.co.il/content/tvguide' \ -H 'accept-language: en-US,en;q=0.9,de;q=0.8' \ -H 'cookie: TS01be6705=01ef05715da91cbd2bd3d3708b62fc37483302654019cffd2d42c61fe786389bea0697bdddc6cfaa989d8e83d7ecaf362d163c3ba4d4cc2cb2171d826bc2189e24b33b372f; COOKIE_SUPPORT=true; GUEST_LANGUAGE_ID=iw_IL; rxVisitor=1635415629464DQEQ6RQ2S8SQQ1QCFS5J66I2US8LK1NG; _gcl_au=1.1.2116753794.1635415632; _gid=GA1.3.1516801157.1635415633; dtSa=-; _ga=GA1.3.1003301072.1635415633; LFR_SESSION_STATE_33706=1635417685179; JSESSIONID=B399B241579DB87AF9FEC02AD72D62CF.worker_ip-10-0-3-108.eu-west-1.compute.internal; dtCookie==3=srv=1=sn=BF10E6A2EFEE80BE2CAD31F302CAF608=perc=100000=ol=0=mul=1=app:e6d1c681b48e20c9=0; _ga_H6Z9EGVSQX=GS1.1.1635418482.2.0.1635418482.0; dtLatC=14; AWSALB=1Ky1qIweYH/VBDu2pUv/DACVcWq5dmx3PPhlghfLR0g4oNTdMV78d7G08LreVX0l2Lvm0wdW5oRh+3j+THyZKDQmVldChB6XScu8+BVkqbSymgNrvMm4dOdT6TNL; AWSALBCORS=1Ky1qIweYH/VBDu2pUv/DACVcWq5dmx3PPhlghfLR0g4oNTdMV78d7G08LreVX0l2Lvm0wdW5oRh+3j+THyZKDQmVldChB6XScu8+BVkqbSymgNrvMm4dOdT6TNL; TS01542e32=01ef05715d1819fe7529d33b6e77731cfbb0015d8964ad5bb6c2e651cbb0a0a4b1882c8fa451246095770e14517339cd0a68861c971608fb5c8f0731d6c968c519acbcd35ea68d53e6fc4ceb067d99238c1dfce91a494ac4abf599a7d66a54b92c363e5c1b004d2d59e86f6198819dd2f1b43c0191; dtPC=1$418482539_291h9vJHPPKPVFOURUFMBUBCNHWPOEEHUEJATA-0e5; rxvt=1635420284821|1635415629471' \ --data-raw 'startdate=20211028&p_auth=c43Cdm7P' \ --compressedLa mayoría de los encabezados no parecen ser demasiado relevantes, por lo que pude reducirlo a
curl --location --request POST 'https://www.yes.co.il/o/yes/servletlinearsched/getscheduale' \ --header 'content-type: application/x-www-form-urlencoded' \ --header 'cookie: JSESSIONID=B399B241579DB87AF9FEC02AD72D62CF.worker_ip-10-0-3-108.eu-west-1.compute.internal;' \ --data-urlencode 'startdate=20211028' \ --data-urlencode 'p_auth=c43Cdm7P' Sin embargo, existe la cookie JSESSIONID que se establece mediante la solicitud inicial a la página y se actualiza potencialmente mediante solicitudes posteriores. Es por eso que una solicitud solo funciona por un tiempo limitado sin usar una nueva identificación de sesión. Su raspador tendrá que extraer una identificación de sesión de solicitudes anteriores y usar esta.
Ese es el resultado de una herramienta que 'serializa' (convierte objetos que viven en la memoria en una representación basada en bytes que se puede transportar a través de una red o almacenar en disco), específicamente, que serializó un ArrayList en un formato JSON.
La mejor manera de leer esto con código Java es averiguar qué herramienta se usó y usar la misma herramienta. No está integrado en Java en sí mismo; es una biblioteca de terceros como Jackson.
Todas esas herramientas que conozco tienen una excepción especial 'codificado' para cualquier cosa que amplíe java.util.List (como ArrayList), para tratarlo simplemente como una lista JSON simple. Entonces, estoy un poco desconcertado en cuanto a qué herramienta se ha utilizado aquí.
Pero, [A] encuentra la herramienta, o [B] aplica ingeniería inversa a la salida.
NB: normalmente, estas herramientas de serialización representarán en el JSON tanto el nombre de la clase como cada campo. Sin embargo, el campo relevante en ArrayList se llama elementData y no list . Esa es otra ceja más levantada: esto es simplemente extraño.