У меня есть вариант использования, в котором необходимо использовать Headless Chrome Network (https://chromedevtools.github.io/devtools-protocol/tot/Network/), чтобы перехватить все запросы изображений и узнать размер изображения перед его сохранением (в основном отбросьте небольшие изображения, такие как значки).
Однако я не могу найти способ загрузить данные изображения в память перед их сохранением. Мне нужно загрузить его в объект Img, чтобы получить width
и height
. Network.getResponseBody
принимает requestId, к которому у меня нет доступа в Network.requestIntercepted
. Также Network.loadingFinished
всегда дает мне "0" в переменной encodedDataLength
. Понятия не имею почему. Итак, мои вопросы:
Как перехватить все ответы от запроса jpg / png и получить данные изображения? Без сохранения файла через строку URL на диск и загрузка обратно.
ЛУЧШИЙ: как получить размер изображения из ответа заголовка? Тогда мне вообще не нужно считывать данные в память.
Мой код ниже:
const chromeLauncher = require('chrome-launcher');
const CDP = require('chrome-remote-interface');
const file = require('fs');
(async function() {
async function launchChrome() {
return await chromeLauncher.launch({
chromeFlags: [
'--disable-gpu',
'--headless'
]
});
}
const chrome = await launchChrome();
const protocol = await CDP({
port: chrome.port
});
const {
DOM,
Network,
Page,
Emulation,
Runtime
} = protocol;
await Promise.all([Network.enable(), Page.enable(), Runtime.enable(), DOM.enable()]);
await Network.setRequestInterceptionEnabled({enabled: true});
Network.requestIntercepted(({interceptionId, request, resourceType}) => {
if ((request.url.indexOf('.jpg') >= 0) || (request.url.indexOf('.png') >= 0)) {
console.log(JSON.stringify(request));
console.log(resourceType);
if (request.url.indexOf("/unspecified.jpg") >= 0) {
console.log("FOUND unspecified.jpg");
console.log(JSON.stringify(interceptionId));
// console.log(JSON.stringify(Network.getResponseBody(interceptionId)));
}
}
Network.continueInterceptedRequest({interceptionId});
});
Network.loadingFinished(({requestId, timestamp, encodedDataLength}) => {
console.log(requestId);
console.log(timestamp);
console.log(encodedDataLength);
});
Page.navigate({
url: 'https://www.yahoo.com/'
});
Page.loadEventFired(async() => {
protocol.close();
chrome.kill();
});
})();