Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Puppeteer и работа с GET запросами (https://javascript.ru/forum/node-js-io-js/85086-puppeteer-i-rabota-s-get-zaprosami.html)

QuZ 03.04.2023 01:07

Puppeteer и работа с GET запросами
 
Добрый вечер. Чуть чуть знаком для личного использования с данным продуктом, столкнулся с задачей, что мне необходимо отслеживать от сайта входящие GET запросы в асинхронном режиме (бесконечно долго, до закрытия страницы браузера) и обрабатывать только пришедшие от нужной url.(грубо говоря кидать в консоль лог). Задача совсем не типичная для моих навыков работы, понимаю, что тут пяток строк кода, но я не смог найти в документации чего-то подобного. Подскажите пожалуйста, как реализовать данный функционал.

Спасибо.

Nexus 03.04.2023 14:08

https://pptr.dev/guides/request-interception

QuZ 03.04.2023 15:55

Цитата:

Сообщение от Nexus (Сообщение 551363)

Спасибо Вам большое. Отличный пример, как раз то что будет полезно.

QuZ 07.04.2023 01:56

Добрый вечер.. Решил не создавать новую тему, подскажите пожалуйста, пытаюсь сделать обработку уже пост запросов, которые отсылает браузер, хочу получить ответы. В теории понимаю, скорее всего, в момент получения тела запроса, еще ответа нет и необходимо сделать ожидание его загрузки.. Наверно так.
Спасибо.

import puppeteer from 'puppeteer';
(async () => {
        const browser = await puppeteer.launch({
        headless: false,
        slowMo: 50,  
        args: ['--start-fullscreen'],    // we can use '--start-fullscreen' || --start-maximized
    });
    const page = await browser.newPage();
    await page.setViewport({width: 1720, height: 980});
    await page.setRequestInterception(true);
    page.on('request', interceptedRequest => {
      if (interceptedRequest.isInterceptResolutionHandled()) return;
      if (
        interceptedRequest.url().endsWith('.png') ||
        interceptedRequest.url().endsWith('.jpg')
      ){
        interceptedRequest.abort();
        console.log('-');
      }
      else {
        interceptedRequest.continue();
        
        if (interceptedRequest.url() == 'https://website.com/api/'){
            console.log('url');
            console.log(interceptedRequest.url());
            console.log('headers');
            console.log(interceptedRequest.headers());
            console.log('postData - Отправляемый запрос');
            console.log(interceptedRequest.postData());
        }
      }
    });
    await page.goto('https://website.com');
    await page.type('input[type="email"]', "weqwe@mail.ru", {delay : 3});
    await page.type('input[type="password"]', "фывапролдж", {delay : 3});
    await page.waitForTimeout(3000);
    await page.click ('div.holder.login > div');
    //await browser.close();
  })();

Nexus 07.04.2023 14:11

QuZ, вы гуглить не пробовали?
https://stackoverflow.com/questions/60579493
https://stackoverflow.com/questions/45822058

QuZ 08.04.2023 01:23

Спасибо, сегодня посмотрю. Пробовал, и документацию просматривал, просидел весь вечер, пытаясь понять проблему, мышление у меня пхпшника и все должно вроде как решаться проще. В JS какие-то вещи для меня не логичные. Без попыток самостоятельно разобраться не люблю задавать вопросы.

QuZ 08.04.2023 10:49

Цитата:

Сообщение от Nexus (Сообщение 551436)

Добрый день.
Взял за основу из Ваших ссылок -
page.on('response', async(response) => {
                const request = response.request();
                if (request.url().includes('desiredrequest.json')){
                    const text = await response.text();
                    console.log(text);
                }
            })


Понял, что вызывать надо второй метод (page.on response) для ожидания ответа. Можно ли сделать, чтобы данный код работал в условии проверки
if (interceptedRequest.url() == 'https://website.com/api/'){
            console.log('url');
            console.log(interceptedRequest.url());
            console.log('headers');
            console.log(interceptedRequest.headers());
            console.log('postData - Отправляемый запрос');
            console.log(interceptedRequest.postData());
// Вызывался тут
        }


или надо делать отдельные обработчики для
page.on('request', и page.on('response',
и объединять занесенные в массив из реквеста и респонса данные по каким-то параметрам?

Nexus 08.04.2023 16:12

page.on('request', async (request) => {
    console.log('url', request.url());
    if (request.url() !== 'https://website.com/api/') {
        return;
    }

    console.log('headers', request.headers());
    console.log('postData - Отправляемый запрос', request.postData());
});

QuZ 08.04.2023 19:19

Цитата:

Сообщение от Nexus (Сообщение 551445)
page.on('request', async (request) => {
    console.log('url', request.url());
    if (request.url() !== 'https://website.com/api/') {
        return;
    }

    console.log('headers', request.headers());
    console.log('postData - Отправляемый запрос', request.postData());
});

Простите, не совсем Вас понял. А где запрос на получение данных из ответа? Запрос ( postDate и header) я уже получал, в Вашем коде Вы поменяли проверку на принадлежность ссылки к нужному для обработки запросу.

Nexus 08.04.2023 19:47

Цитата:

Сообщение от QuZ
Простите, не совсем Вас понял. А где запрос на получение данных из ответа?

Ознакомьтесь с типом HTTPRequest.
Посмотрите на метод response и на тип данных, который он возвращает.


Часовой пояс GMT +3, время: 10:36.