• Почему не работает скрипт?

    @GrayHorse
    Основной ответ уже был дан тут:
    https://qna.habr.com/answer?answer_id=2174328#answ...

    Судя по заголовкам, которые requests использует по-умолчанию (даже без использования Session), а именно наличию connection: "keep-alive", keep alive режим работает из коробки, и, очевидно, правильно.

    А node-fetch нет. Но это можно исправить, см. мой ответ.
    Просто выставить заголовок недостаточно, заголовок это просто текст.

    Другое отличие — порядок заголовков. Хотя это вряд ли имеет значение.

    И не существует таких заголовков: "authority", "method", "path", "scheme".

    Есть ":authority", ":method", ":path", ":scheme", псевдо-заголовки HTTP/2.

    requests — HTTP/1.1 библиотека.

    ---

    import fetch from "node-fetch";
    import http  from "node:http";
    import https from "node:https";
    
    const httpAgent  = new http.Agent({keepAlive: true});
    const httpsAgent = new https.Agent({keepAlive: true});
    function agent(_parsedURL) {
        if (_parsedURL.protocol === "http:") {
            return httpAgent;
        } else {
            return httpsAgent;
        }
    }
    
    const response = await fetch("https://example.com/", {
        agent
    });
    Ответ написан
    1 комментарий
  • Почему невозможно правильно повторить запрос из браузера?

    @GrayHorse
    Кроме заголовков (а также их порядка и значения) есть еще и протокол. В браузере используется h2 (HTTP/2), если его поддерживает сервер.

    node-fetch, как и большинство HTTP либ, использует только http/1.1.

    Плюс, по-умолчанию, он использует Connection: close, если не использовать свой http.Agent c {keepAlive: true}.

    https://github.com/node-fetch/node-fetch#default-h...
    https://github.com/node-fetch/node-fetch#custom-agent
    Ответ написан
    Комментировать
  • Почему невозможно правильно повторить запрос из браузера?

    @rPman
    не про конкретно это но это тоже важно

    Помимо самих запросов, средства защиты от автоматизации проверяют соседние запросы (казалось бы не важные), которые делает браузер но пропускает автоматизатор плюс возможно тайминги

    Так же, поставь mitm прокси и сравни ее дампы при использовании браузера и использовании твоего скрипта, как минимум обнаружишь свои ошибки

    p.s. порядок параметров в запросе тоже может быть актуальным
    Ответ написан
    Комментировать