81 lines
2.5 KiB
JavaScript
81 lines
2.5 KiB
JavaScript
const axios = require("axios");
|
|
const cheerio = require("cheerio");
|
|
const lib = require("../lib");
|
|
|
|
module.exports = {
|
|
get: get,
|
|
hostnames: ["we.tl", "wetransfer.com"],
|
|
tests: []
|
|
};
|
|
|
|
async function get(url, options) {
|
|
lib.log(`wetransfer`, `Fetching page...`, [], true, options);
|
|
|
|
let resp = await axios({
|
|
url: url,
|
|
headers: lib.defaultHeaders
|
|
});
|
|
|
|
lib.log(`wetransfer`, `Parsing page...`);
|
|
let $ = cheerio.load(resp.data);
|
|
|
|
let canon = $("link[rel='canonical']").attr("href");
|
|
if (canon) {
|
|
let id = canon.split(`/downloads/`)[1].split(`/`)[0];
|
|
let hash = canon.split(`/downloads/`)[1].split(`/`)[1];
|
|
|
|
lib.log(`wetransfer`, `Got ID:`, [id]);
|
|
lib.log(`wetransfer`, `Got hash:`, [hash]);
|
|
|
|
let headers = lib.defaultHeaders;
|
|
headers["Cache-Control"] = `no-cache`;
|
|
headers["Content-Type"] = `application/json`;
|
|
headers["Origin"] = `https://wetransfer.com`;
|
|
headers["Pragma"] = `no-cache`;
|
|
headers["Referer"] = `https://wetransfer.com/`;
|
|
headers["Sec-Fetch-Dest"] = `empty`;
|
|
headers["Sec-Fetch-Mode"] = `no-cors`;
|
|
headers["TE"] = `trailers`;
|
|
|
|
lib.log(`wetransfer`, `Sending "prepare-download" request...`, [], true, options);
|
|
|
|
resp = await axios({
|
|
method: `POST`,
|
|
headers: headers,
|
|
data: JSON.stringify({security_hash: hash}),
|
|
url: `https://wetransfer.com/api/v4/transfers/${id}/prepare-download`
|
|
});
|
|
|
|
if (resp.data?.state == "downloadable") {
|
|
let fileName = resp.data.recommended_filename;
|
|
|
|
lib.log(`wetransfer`, `Sending "download" request...`, [], true, options);
|
|
|
|
resp = await axios({
|
|
method: `POST`,
|
|
headers: headers,
|
|
data: JSON.stringify({security_hash: hash, intent: "entire_transfer"}),
|
|
url: `https://wetransfer.com/api/v4/transfers/${id}/download`
|
|
});
|
|
|
|
if (resp.data.direct_link) {
|
|
delete headers["Cache-Control"];
|
|
delete headers["Content-Type"];
|
|
delete headers["Pragma"];
|
|
delete headers["TE"];
|
|
headers["Sec-Fetch-Dest"] = "document";
|
|
headers["Sec-Fetch-Mode"] = "navigate";
|
|
|
|
return {
|
|
axiosData: {
|
|
headers: headers,
|
|
url: resp.data.direct_link
|
|
},
|
|
metadata: {
|
|
fileName: fileName
|
|
}
|
|
};
|
|
} else throw new Error(`Direct link not found.`);
|
|
} else throw new Error(`File cannot be downloaded at the moment, state is '${resp.data.state}'.`)
|
|
} else throw new Error("Could not find canonical metadata on page.");
|
|
} |