Подтвердить что ты не робот

Программно получить инициатор веб-запроса

На вкладке "Сеть разработчиков Chrome" есть столбец инициатора, который покажет вам, какой именно код инициировал сетевой запрос.

вкладка сети инструментов Chrome 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 во всех файлах. Как я могу это сделать?

4b9b3361

Ответ 1

Вы должны записать запрос функции в трекер проблемы с DevTools. Информация инициатора не экспортируется в HAR, поэтому ее выход из нее не будет работать. Насколько мне известно, ни один из существующих API не допускает этого.

Ответ 2

Я смог реализовать решение, которое использует 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 обработчик в настоящее время предоставляет содержимое ресурса, но есть текущая работа для решения этой проблемы, и как только это будет доступно, все это будет намного проще.