【发布时间】:2021-03-12 05:58:17
【问题描述】:
简而言之:我正在尝试在 Bash 中使用 curl 获取 https://www.etoro.com/app/sv-iframe 的页面源代码。
我知道这个问题很“简单”。我在这里阅读了 10 多个类似的问题。不幸的是,它们都不能解决我的问题。
当您在 Chrome 浏览器中打开上面的 URL 时,它是空白的。您可以右键单击 -> 查看页面源代码,或使用 Chrome 开发者工具嗅探网络。两者都会为您提供正确的页面来源。该页面包含 javascripts,其中有一个长的十六进制字符串——我最终需要的。我尝试禁用 javascript 并重新加载页面。我仍然得到了正确的页面来源。所以 javascript 在这里不会耍花招。听起来通过 curl 获取这样的页面源应该是直截了当的,对吧?
当我在 Chrome 开发者工具中右键单击请求 -> 复制为 cURL,并在终端中执行它时,事情变得很糟糕 - 我得到了一个 CloudFlare security check page。我在 Chrome 隐身模式下多次重新打开该页面。我发誓从未在浏览器中看到过 CloudFlare 安全检查。我仔细检查了 cURL 命令。它还设置了用户代理。
这是我目前尝试过的:
- 从 Chrome 开发者工具手动编写 curl 命令并填充标题
- 在 Android 设备上嗅探包,并使用在移动浏览器上设置的标头
- 从 Postman Web 在线发布请求
所有人都给了我相同的 CloudFlare 安全检查页面。
CloudFlare 页面显示“请启用 cookie”。我怀疑服务器是否以这种方式确定我不是从浏览器调用的。在一些线程之后,我尝试使用 curl 设置 -b/-c/-j 标志。也没有运气。
以下是我所做的更详细的步骤:
- 打开 Chrome 隐身模式
- 打开开发者工具
- 使用 Command+Shift+P (Mac) 打开命令菜单
- 输入“禁用javascript”并回车
- 切换到网络标签
- 打开https://www.etoro.com/app/sv-iframe
- 观察请求列表 - 应该只有 1 个请求(request screenshot 1 / request screenshot 2 / response body / response cookie)
- 右击请求->复制为cURL
这是我的 curl 命令:
curl 'https://www.etoro.com/app/sv-iframe' \
-H 'authority: www.etoro.com' \
-H 'pragma: no-cache' \
-H 'cache-control: no-cache' \
-H 'sec-ch-ua: "Google Chrome";v="89", "Chromium";v="89", ";Not A Brand";v="99"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'upgrade-insecure-requests: 1' \
-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36' \
-H 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9' \
-H 'sec-fetch-site: none' \
-H 'sec-fetch-mode: navigate' \
-H 'sec-fetch-user: ?1' \
-H 'sec-fetch-dest: document' \
-H 'accept-language: en-US,en;q=0.9' \
--compressed
我认为请求本身不需要cookie,因为页面可以在隐身模式下打开。无论如何,我尝试将响应 cookie 与请求一起设置。也无济于事。
-H 'cookie: __cfduid=d2edf...; TS01047baf=01d53...; __cf_bm=a3803...; __cflb=02Di3...'
已经花了整个晚上的时间,但无法解决。我感谢任何建议或帮助让我度过难关。我有一种感觉,实际的修复会相当简单。该请求没有 cookie。唯一要更新的是标题。也许我没有指定正确的标题?或者一些额外的 curl 标志会有所帮助?
【问题讨论】:
-
我的浏览器开发工具显示当您访问该页面时,会发生 AJAX POST。它还显示设置了 5 个 cookie。您没有向我们展示任何代码,因此很难说您是否正确接收和使用了这些 cookie,或者您是否正在复制 POST,或者即使这是获得您所追求的十六进制所必需的......
-
您可能会伪造 cookie,但 curl 不会运行在浏览器中运行的任何 javascript - 它会提供服务器提供的任何内容(对于您提供的 UserAgent),无需处理任何脚本.添加 -v 以查看标题 - 可能会提供更多想法。
标签: bash google-chrome curl cloudflare