【问题标题】:cURL got different page source than what Chrome browser didcURL 获得与 Chrome 浏览器不同的页面源
【发布时间】: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 标志。也没有运气。

以下是我所做的更详细的步骤:

  1. 打开 Chrome 隐身模式
  2. 打开开发者工具
  3. 使用 Command+Shift+P (Mac) 打开命令菜单
  4. 输入“禁用javascript”并回车
  5. 切换到网络标签
  6. 打开https://www.etoro.com/app/sv-iframe
  7. 观察请求列表 - 应该只有 1 个请求(request screenshot 1 / request screenshot 2 / response body / response cookie
  8. 右击请求->复制为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


【解决方案1】:

该页面上有一些混淆的js eval代码,基本上是设置cookie或发送日志,再深入一点,结果是这样的:


 (function() {
    var s = '9a7xxx......';

    function setCookie(cname, cvalue, domain, exdays) {
        var d = new Date();
        d.setTime(d.getTime() + (exdays * 1000 * 60 * 60 * 24));
        var expires = "expires=" + d.toUTCString();
        var cookie = cname + "=" + cvalue;
        if (domain) {
            cookie += ";" + "domain=" + domain;
        }
        cookie += ";" + expires + ";path=/";
        document.cookie = cookie;
    }

    function deleteCookie(cname, domain) {
        setCookie(cname, "", domain, 0);
    }
    var ta = ["window.callPhantom", "window.__nightmare", "window._phantom", "window.__webdriver_script_fn", "navigator.webdriver", "document.$cdc_asdjflasutopfhvcZLmcfl_"];
    var re;
    try {
        re = [!!window.callPhantom, !!window.__nightmare, !!window._phantom, !!window.__webdriver_script_fn, !!navigator.webdriver, !!document.$cdc_asdjflasutopfhvcZLmcfl_];
    } catch (err) {}
    if (re && re.indexOf(true) == -1) {
        setCookie("TMIS2", s, ".etoro.com", 14);
    } else {
        var resultsObj = {};
        for (var i = 0; i < ta.length; i++) {
            resultsObj[ta[i]] = re[i];
        }
        var img = new Image();
        img.src = 'https://etorologsapi.etoro.com/api/v2/monitoring?applicationIdentifier=JSCClient&LogEvents=' + encodeURIComponent(JSON.stringify([{
            ApplicationIdentifier: 'JSCClient',
            ApplicationVersion: '0.0.11',
            Level: "error",
            Message: "ClientSel",
            Results: resultsObj,
            Type: 'log'
        }]));
    }
 })();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 2019-09-22
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 2012-09-07
    相关资源
    最近更新 更多