UNPKG

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
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;