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