Ответ 1
Вы должны записать запрос функции в трекер проблемы с DevTools. Информация инициатора не экспортируется в HAR, поэтому ее выход из нее не будет работать. Насколько мне известно, ни один из существующих API не допускает этого.
На вкладке "Сеть разработчиков Chrome" есть столбец инициатора, который покажет вам, какой именно код инициировал сетевой запрос.
Я хотел бы получить программную информацию о инициаторе сетевого запроса, поэтому я мог бы запустить script с аргументом url
и request search string
, и он вернет детали о том, где каждый запрос с совпадением URL request search string
появился на странице url
. Поэтому с учетом аргументов www.stackoverflow.com
и google
вывод может выглядеть примерно так (показывая запрос 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 или какой-либо другой инструмент или услугу, например селен?
UPDATE
Из комментариев и ответов до сих пор кажется, что в настоящее время это не поддерживается Phantom, селеном или чем-то еще. Итак, вот альтернативный подход, который может работать: Загрузите страницу и все активы, а затем найдите все вхождения request search string
во всех файлах. Как я могу это сделать?
Вы должны записать запрос функции в трекер проблемы с DevTools. Информация инициатора не экспортируется в HAR, поэтому ее выход из нее не будет работать. Насколько мне известно, ни один из существующих API не допускает этого.
Я смог реализовать решение, которое использует PhantomJS, чтобы получить все URL-адреса, загруженные страницей, а затем использовать комбинацию xargs, curl и grep, чтобы найти строку поиска по этим URL-адресам.
Первая часть - это PhantomJS script, которая просто выводит каждый 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#^#% #'"
Мы можем обернуть это все в небольшом script, где мы будем выводить результат через 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"
Затем мы можем использовать его для поиска любого термина на любом сайте. Здесь мы ищем adzerk.net на stackoverflow.com:
Итак, вы можете видеть, что запрос adzerk.net инициируется где-то вокруг строки 4158 главной страницы stackoverflow. Это не идеальное решение, потому что вызов может быть где-то полностью отличным от того, где указан URL, но он, вероятно, близок, и, конечно же, неплохо начать отслеживать точный сайт вызова.
Возможно, существует лучший способ поиска содержимого каждого URL-адреса. Он не похож на phantonJS onResourceReceived обработчик в настоящее время предоставляет содержимое ресурса, но есть текущая работа для решения этой проблемы, и как только это будет доступно, все это будет намного проще.
Вы можете использовать Chrome протокол отладчика из процесса, внешнего по отношению к Chrome, или использовать chrome.debugger в расширение Chrome (см. Как сделать получить Инициатор запроса при расширении Chrome DevTool?).