tester-scraper
Version:
Sebuah Module Scraper yang dibuat oleh Sxyz dan SuzakuTeam untuk memudahkan penggunaan scraper di project ESM maupun CJS.
424 lines (381 loc) • 11.4 kB
JavaScript
import axios from "axios";
import FormData from "form-data";
import * as cheerio from "cheerio";
import CryptoJs from "crypto-js";
import { randomUUID } from "crypto";
import fetch from "node-fetch";
import { CookieJar } from "tough-cookie";
import { wrapper } from "axios-cookiejar-support";
const downloader = {
aioV1: 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 FormData();
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;
},
aioV2: async (u) => {
5;
const vdtoks = randomUUID();
const form = new FormData();
form.append("url", u);
form.append("vdtok", vdtoks);
const headers = {
headers: {
...form.getHeaders(),
"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",
Accept: "*/*",
"Accept-Language": "en-US,en;q=0.9",
Origin: "https://maelyn.sbs",
Referer: "https://maelyn.sbs/",
Connection: "keep-alive",
},
};
const { data } = await axios.post(
"https://vdl.maelyn.sbs/_root.data?index",
form,
headers,
);
return data;
},
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 FormData();
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 FormData();
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 (u) => {
function generatePayload(y) {
return {
id: y,
locale: "id",
};
}
let pylox = generatePayload(u);
let { data } = await axios.post("https://getmyfb.com/process", pylox);
let $ = cheerio.load(data);
let downloadLinks = [];
$(".results-list-item").each((index, element) => {
const quality = $(element).text().replace(/\s+/g, "");
const link = $(element).find("a").attr("href");
const filename = $(element).find("a").attr("download");
if (link) {
if (filename) {
downloadLinks.push({
quality,
link,
filename,
});
} else {
downloadLinks.push({
quality,
link,
});
}
}
});
return downloadLinks;
},
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 FormData();
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,
},
};
},
};
export default downloader;