Загрузка файла из Cook ie Защищенный URL, который перенаправляет - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь загрузить файл с https://wi.to, я использую Ax ios, JSDOM и Tough Cook ie, чтобы извлечь ссылку с веб-сайта.

Проблема заключается в том, что когда выполняется запрос, создаются файлы cookie, но URL-адрес по-прежнему отвечает HTML, вместо этого перенаправляя на URL-адрес с запросом download_token. Интересно, есть ли какой-нибудь способ с Ax ios сделать запрос и по тому же запросу с уже созданными куки сделать дополнительный запрос на сайт, чтобы он правильно перенаправил. Я попытался напрямую в консоли chrome сделать запрос на выполнение, и веб-сайт возвращает ссылку с download_token (но в chrome файлы cookie, установленные в первый раз по первому запросу Ax ios, являются постоянными, поэтому он работает в отличие от узла).

Пример ссылки https://wi.to/af8c0af67d5e0f59 Ссылка на тег a.href (загрузка), которую я извлекаю с помощью JSDOM

https://wi.to/af8c0af67d5e0f59?pt=VkZGclVsWTJNa0pETkhSNGVVRXZkM0JUVFZGNVVUMDlPdCtyL09mY0xDQzhLdEtSTFk0RDZTUT0%3D

Chrome Консольный тест


enter image description here

В первый раз, когда сайт всегда возвращает HTML документ и последующий запрос возвращает ссылку на файл с перенаправлением с download_token

Это мой код


import path from 'path';
import fs from 'fs-extra';
import axios from 'axios';
import jsdom from 'jsdom';
import tough from 'tough-cookie';
import axiosCookieJarSupport from 'axios-cookiejar-support';

const {
  JSDOM,
} = jsdom;
axiosCookieJarSupport.default(axios);


const download = async (url) => {
  const __dirname = path.resolve();
  const cookieJar = new tough.CookieJar();
  const p = path.resolve(__dirname, 'temp', 'test.zip');
  const response = await axios.default.get(url, {
    withCredentials: true,
    followAllRedirects: true,
    method: 'GET',
    jar: cookieJar,
    responseType: 'stream',
  });
  console.log(response.headers);

  response.data.pipe(fs.createWriteStream(p));
  return new Promise((resolve, reject) => {
    response.data.on('end', () => {
      resolve();
    });

    response.data.on('error', (err) => {
      reject(err);
    });
  });
};

const getLink = async (link) => {
  let response;

  try {
    response = await axios.get(link);
    const {
      data,
    } = response;
    const {
      window,
    } = new JSDOM(data);
    const temp = window.document.querySelectorAll('a')[3].href;
    await download(temp);
  } catch (error) {
    console.log(error);
  }
};

getLink('https://wi.to/af8c0af67d5e0f59');

Console.log из response.headers

{
  date: 'Thu, 02 Apr 2020 19:20:41 GMT',
  'content-type': 'text/html; charset=UTF-8',
  'transfer-encoding': 'chunked',
  connection: 'close',
  'set-cookie': [
    '__cfduid=d5b1c15f930371b6f6bc267a0ebb92b351585855241; expires=Sat, 02-May-20 19:20:41 GMT; path=/; domain=.wi.to; HttpOnly; SameSite=Lax',
    'filehosting=uh8723m09sp5hn6r3datnfd2sf; expires=Fri, 03-Apr-2020 19:20:41 GMT; Max-Age=86400; path=/'
  ],
  expires: 'Thu, 19 Nov 1981 08:52:00 GMT',
  'cache-control': 'no-store, no-cache, must-revalidate',
  pragma: 'no-cache',
  vary: 'Accept-Encoding,User-Agent',
  'cf-cache-status': 'DYNAMIC',
  'expect-ct': 'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
  server: 'cloudflare',
  'cf-ray': '57dce89beb5bee1f-CDG'
}

Я знаю, что могу легко достичь этого селена, но я бы предпочел не использовать его.

...