我不确定标题是否有意义。我对这类事情不是很有经验。
情况如下:
我正在运行Ubuntu 20.04的linux服务器
我通过.sh脚本运行一个程序,从不同的url中抓取网页。
一个url返回一个这样开头的文件:
{"javaClass":"java.util.ArrayList","list":[
我不确定这是Java类文件还是JSON文件,因为url没有扩展名。
我可以调用这个url在我的浏览器,它将显示为文本。(这就是为什么我可以看到上面的代码。)
如果我在Ubuntu终端用curl调用它,它什么也不做。
我如何在Ubuntu终端中显示和阅读纯文本来处理数据,就像我在Chrome浏览器中做的那样?
编辑:有问题的url是:https://www.yes.co.il/o/yes/servletlinearsched/getscheduale?startdate=20211025&p_auth=w3wmBNc5
EDIT2:最后的令牌每次都不同。我正确地读取了令牌,所以这不是问题。
我发现这个站点请求x-dtpc cookie。我发现关于x-dtpc cookie:
这个标头是由JavaScript代理在XHR上设置的,用于将XHR请求与用户操作相关联
当我打开页面并从开发人员控制台获取url时,我可以在新选项卡中打开url。如果我通过脚本获取url,我无法在浏览器中打开该url。
我加载标准cookie,但显然这还不够。
在chrome开发工具中,您可以右键单击特定请求并复制相应的cURL。当我打开页面时,创建了以下命令:
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'
--compressed
大多数标题似乎不太相关,因此我能够将其归结为
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'
然而,JSESSIONID
cookie是由对页面的初始请求设置的,并可能在进一步的请求中更新。这就是为什么请求只能在有限的时间内工作,而不使用新的会话id。刮你的将不得不从以前的请求中提取会话id并使用此会话id。
这是"序列化"工具的输出(将内存中的对象转换为可以通过网络传输或存储在磁盘上的基于字节的表示),特别是将ArrayList序列化为JSON格式。
阅读java代码的最佳方法是找出使用了哪个工具,并使用相同的工具。它并没有融入java本身;它是一些第三方库,比如Jackson。
我所知道的所有这样的工具都有一个"硬编码"的特殊异常,用于扩展java.util.List
(如ArrayList),只是将其视为普通的JSON列表。所以,我对这里使用的是什么工具有点困惑。
但是,要么[A]找到工具,要么[B]逆向工程输出。
注:通常这样的序列化工具将在JSON中表示类名和每个字段。但是,ArrayList中对应的字段是elementData
,而不是list
。这是另一个进一步挑起眉毛:这太奇怪了。