abot-scraper
Version:
scraper random for downloader and searching
1 lines • 64.7 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/scraper/downloader.ts","../src/utils/generator.ts","../src/scraper/search.ts","../src/scraper/tools.ts"],"sourcesContent":["import Downloader from './scraper/downloader.js';\nimport Search from './scraper/search.js';\nimport Tools from './scraper/tools.js';\n\nconst downloader = new Downloader();\nconst search = new Search();\nconst tools = new Tools();\nexport default {\n downloader,\n search,\n tools\n};\n\nexport { Downloader, downloader, Search, search, Tools, tools };\n\n","import axios, { AxiosResponse } from 'axios';\nimport * as cheerio from 'cheerio';\nimport qs from 'qs';\nimport {\n ApiResponse,\n FacebookResult,\n InstagramMediaItem,\n SfileDownloadResult,\n TikTokAdvancedResult,\n TikTokV2MediaItem,\n TikTokV2Result,\n YoutubeResultV2\n} from '../../types/index.js';\nimport Generator from '../utils/generator.js';\n\n\ninterface YouTubeFormat {\n quality: string;\n video_url: string;\n [key: string]: unknown;\n}\n\ninterface YouTubeMedia {\n media_type: string;\n preview_url?: string;\n resource_url?: string;\n formats?: YouTubeFormat[];\n [key: string]: unknown;\n}\n\ninterface YouTubeApiResponse {\n text: string;\n medias: YouTubeMedia[];\n}\n\ndeclare global {\n // eslint-disable-next-line no-var\n var creator: string;\n}\n\nglobal.creator = '@abotscraper – ahmuq';\n\nexport default class Downloader {\n private generator: Generator;\n\n constructor() {\n this.generator = new Generator();\n }\n\n async facebookDownloader(url: string): Promise<ApiResponse<FacebookResult>> {\n try {\n const headers = {\n 'User-Agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 Edg/134.0.0.0',\n Origin: 'https://www.fdown.world',\n referer: 'https://www.fdown.world/',\n 'x-requested-with': 'XMLHttpRequest',\n Cookie: 'codehap_domain=www.fdown.world',\n };\n\n const data = new URLSearchParams({ codehap_link: url, codehap: 'true' });\n\n const response: AxiosResponse = await axios.post(\n 'https://www.fdown.world/result.php',\n data,\n { headers }\n );\n\n const $ = cheerio.load(response.data);\n const videoUrl = $('video source').attr('src');\n const imageUrl = $('img').attr('src');\n\n if (!videoUrl && !imageUrl) {\n throw new Error('No video or image found in the response.');\n }\n\n return {\n creator: global.creator,\n status: 200,\n result: {\n thumbnail: imageUrl || '',\n videoUrl: videoUrl || '',\n },\n };\n } catch (error) {\n return {\n creator: global.creator,\n status: false,\n msg: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n async tiktokDownloaderV1(url: string): Promise<ApiResponse<TikTokAdvancedResult>> {\n try {\n const headers = {\n 'sec-ch-ua':\n '\" Not;A Brand\";v=\"99\", \"Google Chrome\";v=\"91\", \"Chromium\";v=\"91\"',\n 'user-agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',\n };\n\n const data = new URLSearchParams({\n id: url,\n locale: 'en',\n tt: 'WmNzZDk_',\n });\n\n const response: AxiosResponse = await axios.post(\n 'https://ssstik.io/abc?url=dl',\n data,\n {\n headers,\n }\n );\n\n const $ = cheerio.load(response.data);\n const author = $('h2').text().trim();\n const avatar = $('img.result_author').attr('src') || '';\n const caption = $('p.maintext').text().trim();\n\n let likes = 0;\n let comments = 0;\n let shares = 0;\n const likeText = $('div.d-flex:has(svg.feather-thumbs-up)').find('div').eq(1).text().trim();\n likes = parseInt(likeText.replace(/[K,]/g, (match) => {\n return match === 'K' ? '000' : '';\n })) || 0;\n\n const commentText = $('div.d-flex:has(svg.feather-message-square)').find('div').eq(1).text().trim();\n comments = parseInt(commentText.replace(/[K,]/g, (match) => {\n return match === 'K' ? '000' : '';\n })) || 0;\n\n const shareText = $('div.d-flex:has(svg.feather-share-2)').find('div').eq(1).text().trim();\n shares = parseInt(shareText.replace(/[K,]/g, (match) => {\n return match === 'K' ? '000' : '';\n })) || 0;\n\n const audioDownloadUrl = $('a.download_link.music').attr('href') || '';\n\n const slides = $('li.splide__slide');\n const isCarousel = slides.length > 0;\n\n if (isCarousel) {\n const images: string[] = [];\n\n slides.each((_index, element) => {\n const $slide = $(element);\n const downloadLink = $slide.find('a.download_link.slide').attr('href');\n\n if (downloadLink) {\n images.push(downloadLink);\n }\n });\n\n if (images.length === 0) {\n throw new Error('Failed to extract carousel slides from response.');\n }\n\n return {\n creator: global.creator,\n status: 200,\n result: {\n author,\n caption,\n avatar,\n likes,\n comments,\n shares,\n type: 'images',\n images,\n audioDownloadUrl,\n },\n };\n } else {\n const videoDownloadUrl = $('a.download_link.without_watermark').attr('href') ||\n $('a#hd_download').attr('data-directurl') ||\n $('a.download_link.without_watermark_hd').attr('data-directurl') || '';\n\n if (!author || !caption || !videoDownloadUrl) {\n throw new Error('Failed to extract required TikTok data from response.');\n }\n\n return {\n creator: global.creator,\n status: 200,\n result: {\n author,\n caption,\n avatar,\n likes,\n comments,\n shares,\n type: 'video',\n videoDownloadUrl,\n audioDownloadUrl,\n },\n };\n }\n } catch (error) {\n return {\n creator: global.creator,\n status: false,\n msg: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n async tiktokDownloaderV2(url: string): Promise<ApiResponse<TikTokV2Result>> {\n try {\n\n const headers = {\n accept: '*/*',\n 'accept-language': 'en-US,en;q=0.9,ar;q=0.8,id;q=0.7,vi;q=0.6',\n 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',\n priority: 'u=1, i',\n referer: 'https://tikdown.com/en',\n 'sec-ch-ua':\n '\"Chromium\";v=\"142\", \"Microsoft Edge\";v=\"142\", \"Not_A Brand\";v=\"99\"',\n 'sec-ch-ua-mobile': '?0',\n 'sec-ch-ua-platform': '\"Windows\"',\n 'sec-fetch-dest': 'empty',\n 'sec-fetch-mode': 'cors',\n 'sec-fetch-site': 'same-origin',\n 'x-requested-with': 'XMLHttpRequest',\n };\n\n const data = new URLSearchParams({ url });\n\n const response: AxiosResponse = await axios.post(\n 'https://tikdown.com/proxy.php',\n data,\n {\n headers,\n withCredentials: true\n }\n );\n\n const apiData = response.data.api;\n\n if (!apiData || apiData.status !== 'OK') {\n throw new Error('Failed to retrieve TikTok data from the response.');\n }\n\n const mediaStats = apiData.mediaStats || {};\n let likes = 0;\n let comments = 0;\n let shares = 0;\n let views = 0;\n\n if (typeof mediaStats.likesCount === 'string') {\n likes = parseInt(mediaStats.likesCount.replace(/[K,M]/g, '')) || 0;\n } else {\n likes = mediaStats.likesCount || 0;\n }\n\n if (typeof mediaStats.commentsCount === 'string') {\n comments = parseInt(mediaStats.commentsCount.replace(/[K,M]/g, '')) || 0;\n } else {\n comments = mediaStats.commentsCount || 0;\n }\n\n if (typeof mediaStats.sharesCount === 'string') {\n shares = parseInt(mediaStats.sharesCount.replace(/[K,M]/g, '')) || 0;\n } else {\n shares = mediaStats.sharesCount || 0;\n }\n\n if (typeof mediaStats.viewsCount === 'string') {\n views = parseInt(mediaStats.viewsCount.replace(/[K,M]/g, '')) || 0;\n } else {\n views = mediaStats.viewsCount || 0;\n }\n\n const userInfo = apiData.userInfo || {};\n const rawMediaItems = (apiData.mediaItems || []) as Array<Record<string, unknown>>;\n\n const mediaItems: TikTokV2MediaItem[] = await Promise.all(\n rawMediaItems.map(async (item: Record<string, unknown>): Promise<TikTokV2MediaItem> => {\n const type = (item.type as 'Video' | 'Image' | 'Music') || 'Video';\n const mediaUrl = (item.mediaUrl as string) || '';\n const quality = (item.mediaQuality as string | undefined) || undefined;\n const fileSize = (item.mediaFileSize as string | undefined) || undefined;\n\n if (type === 'Image') {\n const result: TikTokV2MediaItem = {\n type,\n fileUrl: mediaUrl,\n };\n if (quality !== undefined) result.quality = quality;\n if (fileSize !== undefined) result.fileSize = fileSize;\n return result;\n }\n\n try {\n if (type === 'Video' || type === 'Music') {\n const fileResponse = await axios.get(mediaUrl, { headers });\n const fileData = fileResponse.data;\n\n const result: TikTokV2MediaItem = {\n type,\n fileUrl: (fileData.fileUrl as string) || mediaUrl,\n };\n const resolvedQuality = quality || (fileData.quality as string | undefined);\n const resolvedFileSize = fileSize || (fileData.fileSize as string | undefined);\n if (resolvedQuality !== undefined) result.quality = resolvedQuality;\n if (resolvedFileSize !== undefined) result.fileSize = resolvedFileSize;\n return result;\n }\n } catch {\n // none\n }\n\n const result: TikTokV2MediaItem = {\n type,\n fileUrl: mediaUrl,\n };\n if (quality !== undefined) result.quality = quality;\n if (fileSize !== undefined) result.fileSize = fileSize;\n return result;\n })\n );\n\n return {\n creator: global.creator,\n status: 200,\n result: {\n author: userInfo.name || apiData.title || '',\n username: userInfo.username || '',\n caption: apiData.description || '',\n avatar: userInfo.userAvatar || '',\n likes,\n comments,\n shares,\n views,\n previewUrl: apiData.previewUrl || apiData.imagePreviewUrl || '',\n mediaItems,\n },\n };\n } catch (error) {\n return {\n creator: global.creator,\n status: false,\n msg: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n async instagramDownloader(url: string): Promise<ApiResponse<InstagramMediaItem[]>> {\n try {\n const payload = new URLSearchParams({ url });\n const headers = {\n accept: '*/*',\n 'accept-language': 'en-US,en;q=0.9,ar;q=0.8,id;q=0.7,vi;q=0.6',\n 'content-type': 'application/x-www-form-urlencoded',\n priority: 'u=1, i',\n 'sec-ch-ua':\n '\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\", \"Microsoft Edge\";v=\"138\"',\n 'sec-ch-ua-mobile': '?0',\n 'sec-ch-ua-platform': '\"Windows\"',\n 'sec-fetch-dest': 'empty',\n 'sec-fetch-mode': 'cors',\n 'sec-fetch-site': 'same-origin',\n };\n\n const response: AxiosResponse = await axios.post(\n 'https://snapinsta.llc/process',\n payload,\n { headers }\n );\n\n const $ = cheerio.load(response.data);\n const downloadItems: InstagramMediaItem[] = [];\n $('.download-item').each((_index, element) => {\n const $element = $(element);\n const previewImg = $element.find('.media-box img').attr('src');\n const downloadLink = $element.find('.download-media').attr('href');\n const downloadText = $element.find('.download-media').text().trim();\n const isVideo = downloadText.toLowerCase().includes('video') ||\n $element.find('.icon-downvid').length > 0;\n if (downloadLink) {\n const mediaItem: InstagramMediaItem = {\n type: isVideo ? 'video' : 'image',\n url: downloadLink\n };\n if (previewImg) {\n mediaItem.preview = previewImg;\n }\n downloadItems.push(mediaItem);\n }\n });\n if (downloadItems.length === 0) {\n throw new Error('No media items found in the response.');\n }\n return {\n creator: global.creator,\n status: 200,\n result: downloadItems,\n };\n } catch (error) {\n return {\n creator: global.creator,\n status: false,\n msg: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n ytMp3Downloader = (url: string) => {\n return new Promise((resolve, reject) => {\n const headers = {\n accept: \"*/*\",\n \"accept-language\": \"en-US,en;q=0.9,ar;q=0.8,id;q=0.7,vi;q=0.6\",\n \"content-type\": \"application/x-www-form-urlencoded; charset=UTF-8\",\n priority: \"u=1, i\",\n \"sec-ch-ua\":\n '\"Microsoft Edge\";v=\"137\", \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"',\n \"sec-ch-ua-mobile\": \"?0\",\n \"sec-ch-ua-platform\": '\"Windows\"',\n \"sec-fetch-dest\": \"empty\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-site\": \"cross-site\",\n Referer: \"https://y2hub.com/\",\n \"Referrer-Policy\": \"strict-origin-when-cross-origin\",\n };\n\n const payload = qs.stringify({\n action: \"yt_convert\",\n nonce: \"1495b10e48\",\n youtube_url: url,\n });\n\n axios(`https://youtubemp4free.com/wp-admin/admin-ajax.php`, {\n method: \"POST\",\n headers: headers,\n data: payload,\n })\n .then(({ data }) => {\n if (!data.success) {\n return reject(new Error(\"Failed to fetch video data\"));\n }\n\n const videoInfo = data.data.info;\n const slug = data.data.slug;\n const size = data.data.size;\n return axios(\"https://ryin.info/\", {\n method: \"GET\",\n headers: {\n \"User-Agent\":\n \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 Edg/137.0.0.0\",\n },\n }).then((response) => {\n const setCookieHeaders = response.headers[\"set-cookie\"];\n let cookies;\n\n if (setCookieHeaders) {\n cookies = setCookieHeaders\n .map((cookie) => cookie.split(\";\")[0])\n .join(\"; \");\n } else {\n cookies =\n \"PHPSESSID=fl86pmq4dqgh2835b32mdm7380; csrf_cookie_name=739e04fcc21050c61c5325b34f449659; lang=en\";\n }\n\n const pageUrl = \"https://ryin.info/\" + slug;\n\n return axios(pageUrl, {\n method: \"GET\",\n headers: {\n \"User-Agent\":\n \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36 Edg/137.0.0.0\",\n Cookie: cookies,\n },\n }).then((response) => {\n const html = response.data;\n const $ = cheerio.load(html);\n const downloadHref = $(\"#download-url\").attr(\"download-href\");\n\n if (!downloadHref) {\n return reject(new Error(\"Download link not found on page\"));\n }\n resolve({\n creator: global.creator,\n status: true,\n title: videoInfo.title,\n thumbnail: videoInfo.thumbnail,\n description: videoInfo.description,\n viewCount: videoInfo.view_count,\n size: this.generator.formatFileSize(size),\n downloadUrl: downloadHref,\n });\n });\n });\n })\n .catch((error) => {\n reject({\n creator: global.creator,\n status: false,\n error: error.message,\n });\n });\n });\n };\n\n\n async youtubeDownloader(url: string): Promise<ApiResponse<YoutubeResultV2>> {\n try {\n const timestamp = this.generator.generateTimeStampYoutubeDL();\n const footer = this.generator.generateFooterYoutubeDL(timestamp, url);\n\n const payload = {\n link: url,\n };\n\n const headers = {\n 'user-agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',\n 'g-footer': footer,\n 'g-timestamp': timestamp,\n accept: '*/*',\n 'accept-language': 'en',\n 'content-type': 'application/json',\n priority: 'u=1, i',\n 'sec-ch-ua':\n '\"Microsoft Edge\";v=\"137\", \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"',\n 'sec-ch-ua-mobile': '?0',\n 'sec-ch-ua-platform': '\"Windows\"',\n 'sec-fetch-dest': 'empty',\n 'sec-fetch-mode': 'cors',\n 'sec-fetch-site': 'same-site',\n Referer: 'https://snapany.com/',\n 'Referrer-Policy': 'strict-origin-when-cross-origin',\n };\n\n const response: AxiosResponse<YouTubeApiResponse> = await axios.post(\n 'https://api.snapany.com/v1/extract',\n payload,\n { headers }\n );\n const data = response.data;\n\n const videoMedia = data.medias.find(\n (media: YouTubeMedia) => media.media_type === 'video'\n );\n const audioMedia = data.medias.find(\n (media: YouTubeMedia) => media.media_type === 'audio'\n );\n\n const downloadLinks: Record<string, string> = {};\n if (videoMedia && videoMedia.formats) {\n videoMedia.formats.forEach((format: YouTubeFormat) => {\n const qualityKey = `${format.quality}p`;\n downloadLinks[qualityKey] = format.video_url;\n });\n }\n\n return {\n creator: global.creator,\n status: 200,\n result: {\n title: data.text,\n thumbnail: videoMedia?.preview_url || null,\n downloadLinks: downloadLinks,\n video: videoMedia?.resource_url || null,\n audio: audioMedia?.resource_url || null,\n formats: videoMedia?.formats || [],\n },\n };\n } catch (error) {\n return {\n creator: global.creator,\n status: false,\n msg: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n async sfileDownloader(url: string): Promise<ApiResponse<SfileDownloadResult>> {\n try {\n const response: AxiosResponse = await axios.get(url, {\n headers: {\n 'User-Agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',\n Referer: 'https://sfile.mobi/',\n 'Accept-Language': 'en-US,en;q=0.9',\n },\n });\n\n const $ = cheerio.load(response.data);\n const filename = $('.intro-container img').attr('alt') || '';\n const mimetype = $('div.list').text().split(' - ')[1]?.split('\\n')[0] || '';\n const downloadHref = $('#download').attr('href');\n const download = downloadHref\n ? downloadHref + '&k=' + Math.floor(Math.random() * (15 - 10 + 1) + 10)\n : '';\n\n return {\n creator: global.creator,\n status: 200,\n result: { filename, mimetype, download },\n };\n } catch (error) {\n return {\n creator: global.creator,\n status: false,\n msg: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n}\n","import crypto from 'crypto';\n\nexport default class Generator {\n generateTimeStampYoutubeDL(): string {\n return Date.now().toString();\n }\n\n generateFooterYoutubeDL(timestamp: string, link: string): string {\n const locale = 'en';\n const secretKey = '6HTugjCXxR';\n const input = link + locale + timestamp + secretKey;\n const hash = crypto.createHash('md5').update(input).digest('hex');\n return hash;\n }\n\n formatFileSize(bytes: number): string {\n if (bytes === 0) return \"0 Bytes\";\n const k = 1024;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + \" \" + sizes[i];\n }\n\n private static generateVisitorId(): string {\n const components = [\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',\n '1920x1080',\n new Date().getTimezoneOffset().toString(),\n 'en-US',\n 'Win32',\n Math.random().toString(36).substring(2, 15),\n Date.now().toString(),\n process.pid.toString(),\n Math.floor(Math.random() * 1000000).toString()\n ];\n const fingerprint = crypto.createHash('md5')\n .update(components.join('|'))\n .digest('hex');\n return fingerprint;\n }\n\n static getFingerprint(): string {\n const visitorId = this.generateVisitorId();\n return visitorId;\n }\n}\n","import axios, { AxiosResponse } from 'axios';\nimport * as cheerio from 'cheerio';\nimport {\n ApiResponse,\n InstagramStoriesResult,\n SfileSearchResult,\n WallpaperResult,\n WikimediaResult,\n YtSearchResult\n} from '../../types/index.js';\n\ndeclare global {\n // eslint-disable-next-line no-var\n var creator: string;\n}\n\ninterface StoryItem {\n source: string;\n [key: string]: unknown;\n}\n\ninterface InstagramApiResponse {\n stories: StoryItem[];\n user_info: {\n username: string;\n [key: string]: unknown;\n };\n}\n\nglobal.creator = '@abotscraper – ahmuq';\n\n\nexport default class Search {\n async igStory(username: string): Promise<ApiResponse<InstagramStoriesResult>> {\n const payload = {\n username: username,\n }\n const headers = {\n 'User-Agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/',\n accept: 'application/json, text/plain, */*',\n 'accept-language': 'en-US,en;q=0.9,ar;q=0.8,id;q=0.7,vi;q=0.6',\n 'content-type': 'application/json',\n priority: 'u=1, i',\n 'sec-ch-ua':\n '\"Microsoft Edge\";v=\"137\", \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"',\n 'sec-ch-ua-mobile': '?0',\n 'sec-ch-ua-platform': '\"Windows\"',\n 'sec-fetch-dest': 'empty',\n 'sec-fetch-mode': 'cors',\n 'sec-fetch-site': 'same-origin',\n Referer: 'https://storyviewer.com/',\n 'Referrer-Policy': 'strict-origin-when-cross-origin',\n };\n try {\n const response: AxiosResponse = await axios.post(\n `https://storyviewer.com/api/data`,\n payload,\n { headers }\n );\n\n const data: InstagramApiResponse = response.data;\n const sources = data.stories.map((story: StoryItem) => story.source);\n\n return {\n creator: global.creator,\n status: 200,\n result: {\n user_info: data.user_info,\n links: sources,\n },\n };\n } catch (error) {\n return {\n creator: global.creator,\n status: false,\n msg: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n\n async sfileSearch(\n query: string,\n page: number = 1\n ): Promise<ApiResponse<SfileSearchResult[]>> {\n try {\n const response: AxiosResponse = await axios.get(\n `https://sfile.mobi/search.php?q=${query}&page=${page}`,\n {\n headers: {\n 'User-Agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',\n Referer: 'https://sfile.mobi/',\n 'Accept-Language': 'en-US,en;q=0.9',\n },\n }\n );\n const $ = cheerio.load(response.data);\n const results: SfileSearchResult[] = [];\n\n $('div.list').each(function () {\n const title = $(this).find('a').text();\n const sizeText = $(this).text().trim().split('(')[1];\n const link = $(this).find('a').attr('href');\n\n if (link && sizeText) {\n results.push({\n title,\n size: sizeText.replace(')', ''),\n link\n });\n }\n });\n\n return {\n creator: global.creator,\n status: 200,\n result: results,\n };\n } catch (error) {\n return {\n creator: global.creator,\n status: false,\n msg: error instanceof Error ? error.message : 'Unknown error'\n };\n }\n }\n\n async ytSearch(query: string): Promise<ApiResponse<YtSearchResult[]>> {\n try {\n const headers = {\n accept: \"*/*\",\n \"accept-language\": \"en-US,en;q=0.9,ar;q=0.8,id;q=0.7,vi;q=0.6\",\n priority: \"u=1, i\",\n \"sec-ch-ua\":\n '\"Microsoft Edge\";v=\"137\", \"Chromium\";v=\"137\", \"Not/A)Brand\";v=\"24\"',\n \"sec-ch-ua-mobile\": \"?0\",\n \"sec-ch-ua-platform\": '\"Windows\"',\n \"sec-fetch-dest\": \"empty\",\n \"sec-fetch-mode\": \"cors\",\n \"sec-fetch-site\": \"cross-site\",\n }\n const response: AxiosResponse = await axios.get(\n `https://line.1010diy.com/web/free-mp3-finder/query?q=${encodeURIComponent(query)}&type=youtube&pageToken=`,\n { headers }\n );\n\n const data = response.data;\n const videos = data?.data?.items || [];\n const results: YtSearchResult[] = videos.map((item: {\n title: string;\n thumbnail: string;\n url: string;\n }) => ({\n title: item.title,\n thumbnail: item.thumbnail,\n url: item.url\n }));\n\n return {\n creator: global.creator,\n status: 200,\n result: results,\n };\n } catch (error) {\n return {\n creator: global.creator,\n status: false,\n msg: error instanceof Error ? error.message : 'Unknown error'\n };\n }\n }\n\n wallpaper = (\n title: string,\n page: string = '1'\n ): Promise<ApiResponse<WallpaperResult[]>> => {\n return new Promise((resolve, reject) => {\n axios\n .get(\n `https://www.besthdwallpaper.com/search?CurrentPage=${page}&q=${title}`\n )\n .then(({ data }) => {\n const $ = cheerio.load(data);\n const hasil: WallpaperResult[] = [];\n\n $('div.grid-item').each(function (_, b) {\n const titleAttr = $(b).find('p[title]').attr('title');\n const typeText = $(b).find('div.info > a:nth-child(2)').text();\n const hrefAttr = $(b).find('a').attr('href');\n const imgSrc = $(b).find('picture > img').attr('src');\n const srcset1 = $(b)\n .find('picture > source:nth-child(1)')\n .attr('srcset');\n const srcset2 = $(b)\n .find('picture > source:nth-child(2)')\n .attr('srcset');\n\n if (titleAttr && hrefAttr) {\n hasil.push({\n title: titleAttr.trim(),\n type: typeText?.trim() || '',\n source: 'https://www.besthdwallpaper.com' + hrefAttr,\n image: [imgSrc || '', srcset1 || '', srcset2 || ''],\n });\n }\n });\n\n resolve({ creator: global.creator, status: 200, result: hasil });\n })\n .catch((error) => {\n reject(error);\n });\n });\n };\n\n wikimedia = (title: string): Promise<ApiResponse<WikimediaResult[]>> => {\n return new Promise((resolve, reject) => {\n axios\n .get(\n `https://commons.wikimedia.org/w/index.php?search=${title}&title=Special:MediaSearch&go=Go&type=image`\n )\n .then((res) => {\n const $ = cheerio.load(res.data);\n const hasil: WikimediaResult[] = [];\n\n $('.sdms-search-results__list-wrapper > div > a').each(function (\n _,\n b\n ) {\n const altText = $(b).find('img').attr('alt');\n const href = $(b).attr('href');\n const dataSrc = $(b).find('img').attr('data-src');\n const src = $(b).find('img').attr('src');\n\n if (altText && href) {\n hasil.push({\n title: altText,\n source: href,\n image: dataSrc || src || '',\n });\n }\n });\n\n resolve({ creator: global.creator, status: 200, result: hasil });\n })\n .catch(reject);\n });\n };\n}\n","import axios, { AxiosResponse } from 'axios';\nimport FormData from 'form-data';\nimport Generator from '../utils/generator.js';\nglobal.creator = '@abotscraper – ahmuq'\n\n\nexport default class Tools {\n\n removeBackground = (image: Buffer) => {\n return new Promise((resolve, reject) => {\n const form = new FormData();\n form.append('image_file', image, 'blob');\n const productSerial = Generator.getFingerprint();\n axios.post('https://api.ezremove.ai/api/ez-remove/background-remove/create-job', form, {\n headers: {\n ...form.getHeaders(),\n 'product-serial': productSerial,\n 'Referer': 'https://ezremove.ai/',\n 'Origin': 'https://ezremove.ai',\n \"User-Agent\": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0'\n }\n }).then((createJobResponse: AxiosResponse) => {\n if (createJobResponse.data.code !== 100000) {\n reject({\n creator: global.creator,\n status: false,\n error: `Job creation failed: ${createJobResponse.data.message?.en || createJobResponse.data.message?.id || 'Unknown error'}`,\n });\n return;\n }\n const jobId = createJobResponse.data.result.job_id;\n\n const checkJobStatus = async () => {\n try {\n const jobResponse = await axios.get(`https://api.ezremove.ai/api/ez-remove/background-remove/get-job/${jobId}`, {\n headers: {\n 'authorization': '',\n 'product-serial': productSerial,\n 'Referer': 'https://ezremove.ai/',\n 'Origin': 'https://ezremove.ai',\n }\n });\n const { code, result, message } = jobResponse.data;\n if (code === 100000 && result && result.output) {\n resolve({\n creator: global.creator,\n status: true,\n result: {\n job_id: jobId,\n image_url: result.output[0]\n }\n });\n } else if (code === 300001) {\n setTimeout(checkJobStatus, 3000);\n } else {\n reject({\n creator: global.creator,\n status: false,\n error: `Job failed: ${message?.en || message?.id || 'Unknown error'} (Code: ${code})`,\n });\n }\n } catch (error: unknown) {\n reject({\n creator: global.creator,\n status: false,\n error: `Status check failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n });\n }\n };\n\n checkJobStatus();\n }).catch((error) => {\n reject({\n creator: global.creator,\n status: false,\n error: error.message,\n });\n });\n })\n }\n\n reminiV2 = (buffer: Buffer) => {\n return new Promise((resolve, reject) => {\n const form = new FormData();\n form.append('image', buffer, 'blob');\n form.append('scale', 2);\n axios.post('https://api2.pixelcut.app/image/upscale/v1', form, {\n headers: {\n ...form.getHeaders(),\n Accept: 'application/json',\n Referer: 'https://www.pixelcut.ai/',\n Origin: 'https://www.pixelcut.ai',\n 'x-client-version': 'web'\n }\n }).then((Response: AxiosResponse) => {\n if (Response.data.result_url) {\n resolve({\n creator: global.creator,\n status: true,\n result: Response.data.result_url\n })\n }\n }).catch((error) => {\n reject({\n creator: global.creator,\n status: false,\n error: error.message,\n });\n })\n })\n }\n\n reminiV1 = (buffer: Buffer) => {\n return new Promise((resolve, reject) => {\n const form = new FormData();\n form.append('type', 'Enhancer');\n form.append('original_image_file', buffer, 'blob');\n const productSerial = Generator.getFingerprint();\n axios.post('https://api.remaker.ai/api/pai/v4/ai-enhance/create-job-new', form, {\n headers: {\n ...form.getHeaders(),\n 'authorization': '',\n 'product-code': '067003',\n 'product-serial': productSerial,\n 'Referer': 'https://remaker.ai/',\n \"User-Agent\": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0'\n }\n }).then((createJobResponse: AxiosResponse) => {\n if (createJobResponse.data.code !== 100000) {\n reject({\n creator: global.creator,\n status: false,\n error: `Job creation failed: ${createJobResponse.data.message.en}`,\n });\n return;\n }\n const jobId = createJobResponse.data.result.job_id;\n const checkJobStatus = () => {\n axios.get(`https://api.remaker.ai/api/pai/v4/ai-enhance/get-job/${jobId}`, {\n headers: {\n 'authorization': '',\n 'product-code': '067003',\n 'product-serial': productSerial,\n 'Referer': 'https://remaker.ai/',\n }\n }).then((jobResponse: AxiosResponse) => {\n if (jobResponse.data.code === 100000) {\n resolve({\n creator: global.creator,\n status: true,\n result: {\n job_id: jobId,\n image_url: jobResponse.data.result.output[0]\n }\n });\n } else if (jobResponse.data.code === 300013) {\n setTimeout(checkJobStatus, 3000);\n } else {\n reject({\n creator: global.creator,\n status: false,\n error: `Job failed: ${jobResponse.data.message.en}`,\n });\n }\n }).catch((error) => {\n reject({\n creator: global.creator,\n status: false,\n error: error.message,\n });\n });\n };\n\n checkJobStatus();\n }).catch((error) => {\n reject({\n creator: global.creator,\n status: false,\n error: error.message,\n });\n });\n });\n }\n\n uploadImage = (buffer: Buffer) => {\n return new Promise((resolve, reject) => {\n const form = new FormData();\n form.append('fileToUpload', buffer, 'image.jpg');\n form.append('reqtype', 'fileupload');\n form.append('userhash', '');\n\n axios.post('https://catbox.moe/user/api.php', form, {\n headers: {\n ...form.getHeaders(),\n }\n })\n .then((response: AxiosResponse) => {\n resolve({\n creator: global.creator,\n status: true,\n result: response.data\n })\n })\n .catch((error) => {\n reject({\n creator: global.creator,\n status: false,\n error: error.message,\n });\n });\n })\n }\n}"],"mappings":"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