【问题标题】:Programmatically get web request initiator以编程方式获取 Web 请求发起者
【发布时间】:2016-02-29 01:44:03
【问题描述】:

Chrome 开发工具的网络标签有一个启动器列,它会准确地向您显示启动网络请求的代码。

我希望能够以编程方式获取网络请求发起方信息,因此我可以运行带有 urlrequest search string 参数的脚本,它会返回有关每个请求的详细信息,其中每个请求的 url 匹配 @987654329 @ 来自url 页面。所以给定参数www.stackoverflow.comgoogle 输出可能看起来像这样(显示请求的url、行号和请求的url):

/   19  http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js
/   4291    http://www.google-analytics.com/analytics.js

我查看了 PhantomJS,但它的 onResourceRequested 回调没有提供任何启动器信息或可以从中派生它的上下文,根据文档:http://phantomjs.org/api/webpage/handler/on-resource-requested.html

是否可以使用 PhantomJS 或其他一些工具或服务,例如 selenium?

更新

到目前为止,从 cmets 和答案看来,目前 Phantom、Selenium 或其他任何东西似乎都不支持这一点。因此,这是一种可能有效的替代方法:加载页面和所有资产,然后在所有文件中找到 request search string 的任何出现。我怎么能这样做?

【问题讨论】:

标签: selenium-webdriver phantomjs google-chrome-devtools casperjs selenium-chromedriver


【解决方案1】:

您应该在针对 DevTools 的问题跟踪器中 file a feature request。启动器信息不会在 HAR 中导出,因此将其从那里取出是行不通的。据我所知,现有的 API 也不允许这样做。

【讨论】:

    【解决方案2】:

    您可以在 Chrome 外部的进程中使用 Chrome 的 debugger protocol,或者在 Chrome extension 中使用 chrome.debugger API(请参阅 How to retrieve the Initiator of a request when extending Chrome DevTool?)。

    【讨论】:

    • 你链接到的答案说这是不可能的。
    • @BenDowling,它说当使用Chrome DevTools Extension 和通过 HAR 公开的数据时,这是不可能的,但可以通过调试器 API。我建议sniffing the protocolDebugging over the wire 中所述找到获取网络详细信息等所需的必要 API,然后实现 chrome 扩展来捕获和公开您想要的数据。
    • 我想在无头环境中执行此操作。 chrome 扩展会为此工作吗?我认为我建议的仅抓住搜索字符串的所有资源的方法看起来是最简单的方法。
    • 我猜你的意思是“grepping”。您将如何获得所有源的目录?我怀疑您需要为此使用 Chrome 扩展程序(或 DevTools 扩展程序)。
    • 是的,自动更正! :) 使用 phantomjs。如果没有人打败我,我会写下来作为答案
    【解决方案3】:

    我已经能够实现一个解决方案,它使用 PhantomJS 获取页面加载的所有 URL,然后使用 xargs、curl 和 grep 的组合在这些 URL 处查找搜索字符串。

    第一部分是这个 PhantomJS 脚本,它简单地输出页面请求的每个 URL:

    system = require('system');
    var page = require('webpage').create();
    
    page.onResourceRequested= function(req) {
        console.log(req.url);
    };
    
    page.open(system.args[1], function(status) {
        phantom.exit(1);
    });
    

    它在行动:

    $ phantomjs urls.js http://www.stackoverflow.com | head -n6
    http://www.stackoverflow.com/
    http://stackoverflow.com/
    http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js
    http://cdn.sstatic.net/Js/stub.en.js?v=06bb9dbfaca7
    http://cdn.sstatic.net/stackoverflow/all.css?v=af4b547e0e9f
    http://cdn.sstatic.net/img/share-sprite-new.svg?v=d09c08f3cb07
    

    对于我的问题,我对图像不感兴趣,可以通过添加 phantomjs arg --load-images=no 来解决这些问题。

    第二部分是获取所有 URL 并搜索它们。仅输出匹配是不够的,我还需要匹配 URL 的上下文,理想情况下还需要哪个行号。这样做的方法如下:

    $ cat urls | xargs -I% sh -c "curl -s % | grep -E -n -o '(.{0,30})SEARCH_TERM(.{0,30})' | sed 's#^#% #'"
    

    我们可以将这一切封装在一个小脚本中,我们将通过 grep 将输出返回以在搜索字符串上突出显示颜色:

    #!/bin/bash
    phantomjs --load-images=no urls.js $1 | xargs -I% sh -c "curl -s % | grep -E -n -o '(.{0,30})$2(.{0,30})' | sed 's#^#% #' | grep $2 --color=always"
    

    然后我们可以使用它来搜索任何网站上的任何字词。在这里,我们在 stackoverflow.com 上寻找 adzerk.net:

    因此,您可以看到 adzerk.net 请求是在 stackoverflow 主页面的第 4158 行附近发起的。这不是一个完美的解决方案,因为调用可能与定义 URL 的位置完全不同,但它可能已经接近尾声,而且肯定是开始追踪确切调用站点的好点。

    可能有更好的方法来搜索每个 URL 的内容。看起来 PhantonJS 的 onResourceReceived 处理程序当前不会公开资源内容,但有 ongoing work to address that,一旦可用,所有这些都会简单得多。

    【讨论】:

      猜你喜欢
      • 2017-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-09
      • 2020-02-23
      • 2018-04-30
      • 2021-10-26
      • 1970-01-01
      相关资源
      最近更新 更多