@suzakuteam/scraper-node
Version:
Sebuah Module Scraper yang dibuat oleh Sxyz dan SuzakuTeam untuk memudahkan penggunaan scraper di project ESM maupun CJS.
552 lines (500 loc) • 15.3 kB
JavaScript
const axios = require("axios");
const FormDatas = require("form-data");
const cheerio = require("cheerio");
const CryptoJs = require("crypto-js");
const { CookieJar } = require("tough-cookie");
const { wrapper } = require("axios-cookiejar-support");
const { Success, ErrorResponse } = require("./lib/function.cjs");
const downloader = {
allinonedownloader: async (url) => {
if (url.includes("youtube"))
return {
msg: "Youtube Not Supported!",
};
async function getTokens() {
const response = await fetch("https://allinonedownloader.com/", {
headers: {
"User-Agent": "Mozilla/5.0",
},
});
const html = await response.text();
const $ = cheerio.load(html);
const rawCookie = response.headers.get("set-cookie") || "";
return {
token: $("#token").val(),
urls: $("#scc").val(),
cookie: rawCookie,
};
}
async function generateHash(url, token) {
const keys = CryptoJs.enc.Hex.parse(token);
const ivs = CryptoJs.enc.Hex.parse("afc4e290725a3bf0ac4d3ff826c43c10");
const enc = CryptoJs.AES.encrypt(url, keys, {
iv: ivs,
padding: CryptoJs.pad.ZeroPadding,
});
return enc.toString();
}
const tokens = await getTokens();
const { urls: paths, cookie, token } = tokens;
const hashResult = await generateHash(url, token);
const form = new FormDatas();
form.append("url", url);
form.append("urlhash", hashResult);
form.append("token", token);
const response = await fetch(`https://allinonedownloader.com${paths}`, {
method: "POST",
headers: {
...form.getHeaders(),
Cookie: `crs_ALLINONEDOWNLOADER_COM=blah; ${cookie}`,
Origin: "https://allinonedownloader.com",
Referer: "https://allinonedownloader.com/",
"User-Agent":
"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
},
body: form,
});
const json = await response.json();
return json;
},
fbPhoto: async (url) => {
async function getNonce() {
const { data: nonce } = await axios.get(
"https://thefdownloader.com/facebook-photo-downloader/",
);
const _ = cheerio.load(nonce);
const skripKontent = _("#hmd-facebook-downloader-js-extra").html();
const match = /"nonce":"([a-zA-Z0-9]+)"/.exec(skripKontent);
return match?.[1];
}
const nonce = await getNonce();
const base = {
url: {
admin: "https://thefdownloader.com/wp-admin/admin-ajax.php",
},
};
let data = new FormDatas();
data.append("action", "facebook_photo_action");
data.append("facebook", `facebook_photo_url=${url}`);
data.append("nonce", nonce);
let response = await axios.post(base.url.admin, data, {
headers: {
...data.getHeaders(),
},
});
let $ = cheerio.load(response.data);
let imageUrl = $(".facebook__media img").attr("src");
return {
imageUrl,
};
},
twitter: async (url) => {
let form = new FormDatas();
form.append("q", url);
form.append("lang", "en");
form.append("cftoken", "");
let headersList = {
headers: {
...form.getHeaders(),
},
};
let { data } = await axios.post(
"https://savetwitter.net/api/ajaxSearch",
form,
headersList,
);
if (!data.data) throw new Error("Data kosong / tidak ditemukan");
const $ = cheerio.load(data.data);
const thumbnail = $(".image-tw img").attr("src");
const result = [];
$(".dl-action a").each((_, el) => {
const link = $(el).attr("href");
const label = $(el).text().trim();
if (link && label.includes("Download MP4")) {
result.push({
quality: label
.replace("Download MP4", "")
.trim()
.replace("(", "")
.replace(")", ""),
url: link,
thumbnail,
});
}
});
return result;
},
fbVideo: async (url) => {
let datas = new FormData();
datas.append("URLz", url);
let headers = {
headers: {
...datas.getHeaders(),
Accept:
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "en-US,en;q=0.9",
"Cache-Control": "no-cache",
Connection: "keep-alive",
Host: "fdown.net",
Origin: "https://fdown.net",
Pragma: "no-cache",
Referer: "https://fdown.net/",
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
},
};
let { data: postt } = await axios.post(
"https://fdown.net/download.php",
datas,
headers,
);
let $ = cheerio.load(postt);
let image = $(".lib-img-show").attr("src") || "No image";
let title = $(".lib-header").text().trim() || "No title";
let caption =
$(".lib-desc").first().text().replace("Description:", "").trim() ||
"No description";
let duration =
$(".lib-desc").eq(1).text().replace("Duration:", "").trim() ||
"No duration";
let sdLink = $("#sdlink").attr("href") || "No SD link";
let hdLink = $("#hdlink").attr("href") || "No HD link";
return {
title,
caption,
duration,
image,
sdLink,
hdLink,
};
},
ttsave: async (url) => {
if (!url)
return {
msg: "Isi Parameter Url.",
};
const payload = {
language_id: "1",
query: url,
};
const { data } = await axios.post("https://ttsave.app/download", payload);
const $ = cheerio.load(data);
const slideElements = $('a[type="slide"]');
const slides = [];
slideElements.each((i, el) => {
const href = $(el).attr("href");
slides.push(href);
});
const result = {
type: "video",
no_watermark: $('a[type="no-watermark"]').attr("href"),
with_watermark: $('a[type="watermark"]').attr("href"),
audio: $('a[type="audio"]').attr("href"),
profile: $('a[type="profile"]').attr("href"),
cover: $('a[type="cover"]').attr("href"),
slides: slides.length ? slides : undefined,
};
if (slides.length > 0) {
result.type = "slide";
}
return result;
},
fbVideo: async (url) => {
const enncodedURL = encodeURIComponent(url);
const { data } = await axios.get(
`https://tooly.chative.io/facebook/video?url=${enncodedURL}`,
);
const { success } = data;
if (!success)
return {
message: "Pengunduhan Tidak Berhasil!",
code: 500,
success: false,
};
const titleCheck =
data.title === "Untitled" ? "Tidak ada title tersedia." : data.title;
return {
success: true,
title: titleCheck,
download: {
sdVideos: {
videoUrl: data.videos.sd.url,
sizeVideo: data.videos.sd.size,
},
hdVideos: {
videoUrl: data.videos.hd.url,
sizeVideo: data.videos.hd.size,
},
},
};
},
spotify: async (url) => {
const jar = new CookieJar();
const client = wrapper(axios.create({ jar, withCredentials: true }));
const getCsrfToken = async () => {
const { data: html } = await client.get("https://spotmate.online/");
const $ = cheerio.load(html);
return $("meta[name='csrf-token']").attr("content");
};
const csrftkn = await getCsrfToken();
const headers = {
"X-Csrf-Token": csrftkn,
"Content-Type": "application/json",
};
const { data: detail } = await client.post(
"https://spotmate.online/getTrackData",
{ spotify_url: url },
{ headers },
);
if (!detail || detail.error) return "Error saat ambil detail";
const { data } = await client.post(
"https://spotmate.online/convert",
{ urls: url },
{ headers },
);
if (!data || data.error) return "Error saat convert lagu";
return {
image: detail.album?.images?.[0]?.url,
title: detail.name,
previewMP3: detail.preview_url,
type: detail.type,
downloadMP3: data.url,
};
},
capcut: async (url) => {
const payload = {
url: url,
};
const headers = {
headers: {
"Content-Type": "application/json; charset=UTF-8",
Accept: "application/json, text/plain, */*",
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) " +
"AppleWebKit/537.36 (KHTML, like Gecko) " +
"Chrome/114.0.0.0 Safari/537.36",
Origin: "https://teknogram.id",
Referer: "https://teknogram.id/",
Connection: "keep-alive",
"Accept-Encoding": "gzip, deflate, br",
},
};
const { data } = await axios.post(
"https://api.teknogram.id/v1/capcut",
payload,
headers,
);
const v = new URL(data.url);
const i = v.searchParams.get("id");
const validDl = `https://ddl.teknogram.id/?id=${i}`;
return {
title: data.title,
redirectDownloadLinks: data.url,
downloadLinksValids: validDl,
};
},
snackvideo: async (url) => {
if (!url) throw new Error("Input url snackvideo");
const d = new FormData();
d.append("ic-request", "true");
d.append("id", url);
d.append("locale", "id");
d.append("ic-element", "main_page_form");
d.append("ic-id", "1");
d.append("ic-target-id", "active_container");
d.append("ic-trigger-id", "main_page_form");
d.append("ic-current-url", "/id");
d.append("ic-select-from-response", "#id1");
d.append("_method", "POST");
const { data } = await axios.post("https://getsnackvideo.com/results", d, {
headers: {
...d.getHeaders(),
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36",
Accept:
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
"Accept-Language": "id-ID,id;q=0.9,en-US;q=0.8,en;q=0.7",
Referer: "https://getsnackvideo.com/id",
Origin: "https://getsnackvideo.com",
Connection: "keep-alive",
},
});
const $ = cheerio.load(data);
return {
thumb: $(".img_thumb img").attr("src"),
dlUrl: $("a.download_link.without_watermark").attr("href"),
};
},
instagram: async (urls) => {
const payload = {
url: urls,
};
const { data } = await axios.post(
"https://www.instadl.org/api/download",
payload,
);
return {
success: true,
result: {
download: data,
},
};
},
youtubeMp3: async (url) => {
const ds = new FormDatas();
ds.append("url", url);
const headers = {
headers: {
...ds.getHeaders(),
},
};
const { data } = await axios.post(
"https://www.youtubemp3.ltd/convert",
ds,
headers,
);
return {
success: true,
response: {
title: data.filename,
downloadUrl: data.link,
},
};
},
ytdl: async (url, quality) => {
const validQuality = {
480: 480,
1080: 1080,
720: 720,
360: 360,
audio: "mp3",
};
if (!Object.keys(validQuality).includes(quality)) {
return new ErrorResponse({
message: "Masukkan Quality Yang Valid!",
availableQuality: validQuality,
});
}
const qualitys = validQuality[quality];
const { data: firstRequest } = await axios.get(
`https://p.oceansaver.in/ajax/download.php?button=1&start=1&end=1&format=${qualitys}&iframe_source=https://allinonetools.com/&url=${url}`,
);
const { progress_url } = firstRequest;
let metadata = {
image: firstRequest.info.image,
title: firstRequest.info.title,
downloadUrl: "",
};
let datas;
do {
const { data } = await axios.get(progress_url);
datas = data;
} while (!datas.download_url);
metadata.downloadUrl = datas.download_url;
return new Success(metadata);
},
douyin: async (url) => {
const d = new FormData();
d.append("q", url);
d.append("lang", "id");
d.append("cftoken", "");
const headers = { headers: { ...d.getHeaders() } };
const { data } = await axios.post(
"https://savetik.co/api/ajaxSearch",
d,
headers,
);
const $ = cheerio.load(data.data);
const downloadLinks = [];
$(".dl-action a").each((i, el) => {
const text = $(el).text().trim();
const href = $(el).attr("href");
downloadLinks.push({ type: text, url: href });
});
let result = {
thumbnail: $(".thumbnail img").attr("src"),
duration: $(".thumbnail .clearfix p").text().trim(),
downloadLinks: downloadLinks,
};
return result;
},
spotifydl: (url) => {
return new Promise(async (resolve, reject) => {
let attempt = 0;
let result;
try {
const yanzz = await axios.get(
`https://api.fabdl.com/spotify/get?url=${encodeURIComponent(url)}`,
);
const yanz = await axios.get(
`https://api.fabdl.com/spotify/mp3-convert-task/${yanzz.data.result.gid}/${yanzz.data.result.id}`,
);
if (yanz.data.result.download_url) {
result = {
title: yanzz.data.result.name,
type: yanzz.data.result.type,
artis: yanzz.data.result.artists,
durasi: yanzz.data.result.duration_ms,
image: yanzz.data.result.image,
download: "https://api.fabdl.com" + yanz.data.result.download_url,
};
return resolve(
new Success({
result,
}),
);
} else {
reject({ status: false, msg: "error coba lagi" });
//console.log(`Attempt ${attempt}: Download URL undefined, retrying...`);
}
} catch (error) {
//
}
reject({ status: false, msg: error });
});
},
terabox: async (url) => {
const jar = new CookieJar();
const client = wrapper(
axios.create({
jar,
withCredentials: true,
}),
);
const d = new FormDatas();
d.append("action", "terabox_api_request");
d.append("url", url);
const headers = {
headers: {
...d.getHeaders(),
},
};
const { data } = await client.post(
"https://terabxdownloader.com/wp-admin/admin-ajax.php",
d,
headers,
);
return data;
},
mediafire: async (url) => {
try {
const { data } = await axios.get(url);
const $ = cheerio.load(data);
const downloadElement = $("#downloadButton");
const downloadUrl = downloadElement.attr("href");
const fileName = $(".dl-btn-label").text().trim();
const fileSize = downloadElement.text().trim();
if (!downloadUrl) throw new Error("Gagal menemukan link download.");
return {
fileName,
fileSize,
downloadUrl,
};
} catch (e) {
return Promise.reject(e);
}
},
};
module.exports = downloader;