@zenaveline/scraper 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,101 @@
1
+ <div align="center">
2
+ <h1>✨ @zenaveline/scraper ✨</h1>
3
+ <p><strong>Modul All-in-One Scraper Keren, Cepat, dan Mudah Digunakan!</strong></p>
4
+
5
+ [![npm version](https://badge.fury.io/js/@zenaveline%2Fscraper.svg)](https://badge.fury.io/js/@zenaveline%2Fscraper)
6
+ [![License: ISC](https://img.shields.io/badge/License-ISC-blue.svg)](https://opensource.org/licenses/ISC)
7
+
8
+ <p>
9
+ Satu library untuk mendownload dan mengambil data dari berbagai platform sosial media, AI, dan musik! Mendukung format <b>CommonJS (CJS)</b> dan <b>ECMAScript Modules (ESM)</b>.
10
+ </p>
11
+ </div>
12
+
13
+ ---
14
+
15
+ ## 🚀 Instalasi
16
+
17
+ Kamu bisa menginstal modul ini melalui NPM atau Yarn:
18
+
19
+ ```bash
20
+ # Menggunakan NPM
21
+ npm install @zenaveline/scraper
22
+
23
+ # Menggunakan Yarn
24
+ yarn add @zenaveline/scraper
25
+ ```
26
+
27
+ ---
28
+
29
+ ## 📖 Penggunaan
30
+
31
+ Berikut adalah contoh cara memanggil modul ini di dalam proyek kamu. Kami menyediakan 1 contoh untuk **ESM** dan 1 contoh untuk **CommonJS**.
32
+
33
+ ### 🌟 ESM (ECMAScript Modules)
34
+ Jika kamu menggunakan `"type": "module"` di `package.json`, gunakan `import`:
35
+
36
+ ```javascript
37
+ import scraper from '@zenaveline/scraper';
38
+
39
+ async function runTest() {
40
+ try {
41
+ // Contoh memanggil scraper Threads Downloader
42
+ const data = await scraper.threadsdownload('https://threads.com/@username/post/ID');
43
+ console.log(data);
44
+ } catch (error) {
45
+ console.error(error);
46
+ }
47
+ }
48
+
49
+ runTest();
50
+ ```
51
+
52
+ ### 💻 CommonJS (CJS)
53
+ Jika kamu menggunakan standar NodeJS bawaan (CommonJS), gunakan `require`:
54
+
55
+ ```javascript
56
+ const scraper = require('@zenaveline/scraper');
57
+
58
+ async function runTest() {
59
+ try {
60
+ // Contoh menggunakan scraper Instagram Stalk
61
+ const data = await scraper.igstalk('prabowo');
62
+ console.log(data);
63
+ } catch (error) {
64
+ console.error(error);
65
+ }
66
+ }
67
+
68
+ runTest();
69
+ ```
70
+
71
+ ---
72
+
73
+ ## 🛠️ Daftar Scraper Tersedia
74
+
75
+ Berikut adalah seluruh scraper / fungsi yang sudah terdaftar di modul ini:
76
+
77
+ | Nama Fungsi | Deskripsi |
78
+ | :--- | :--- |
79
+ | `twetterdownload(url)` | Unduh video/gambar dari Twitter (X) menggunakan URL. |
80
+ | `pinterestdownload(url)` | Ambil detail dan media post dari Pinterest. |
81
+ | `igstalk(username)` | Ambil data lengkap profil Instagram seseorang menggunakan username. |
82
+ | `igdl(url)` | Unduh Reels atau Post dari Instagram. |
83
+ | `threadsdownload(url)` | Unduh media foto/video dari postingan Threads. |
84
+ | `geniussearch(query)` | Cari lagu beserta metadata penyanyi di Genius. |
85
+ | `geniusdetail(id)` | Dapatkan detail lagu dan lirik lagu dari ID Genius. |
86
+ | `applemusicdl(url)` | Unduh audio dengan kualitas 320kbps dari Apple Music. |
87
+ | `novaai(text)` | AI Chatbot interaktif menggunakan Nova AI. |
88
+ | `sharpify(img, model)` | Tingkatkan/Upscale kualitas gambar atau hapus background gambar. (`model`: `enhance`, `upscale`, `removebg`) |
89
+ | `pixaremovebg(img)` | Menghapus background gambar dengan hasil rapi (Pixacut API). |
90
+ | `docs()` | Fungsi bawaan untuk mengembalikan array dari seluruh scraper yang ada. |
91
+
92
+ ---
93
+
94
+ ## 💡 Notes
95
+
96
+ - Semua fungsi berbasis **Promise** (Async/Await).
97
+ - Pada scraper yang meminta input *local file path* seperti `sharpify` dan `pixaremovebg`, parameter yang dikirimkan adalah alamat file gambar di komputermu (contoh: `'./input.jpg'`).
98
+
99
+ <div align="center">
100
+ <p>Dibuat dengan ❤️ oleh ZenzzXD</p>
101
+ </div>
package/index.js ADDED
@@ -0,0 +1,25 @@
1
+ const fs = require('fs')
2
+ const path = require('path')
3
+
4
+ const srcPath = path.join(__dirname, 'src')
5
+ const modules = {}
6
+ const listScraper = []
7
+
8
+ fs.readdirSync(srcPath).forEach(file => {
9
+ if (file.endsWith('.js')) {
10
+ const name = file.replace('.js', '')
11
+ modules[name] = require(`./src/${file}`)
12
+ listScraper.push(name)
13
+ }
14
+ })
15
+
16
+ modules.docs = async () => {
17
+ return {
18
+ success: true,
19
+ total: listScraper.length,
20
+ scrapers: listScraper,
21
+ message: "Gunakan nama scraper sebagai function. Contoh pemakaian: await nama_scraper('url')"
22
+ }
23
+ }
24
+
25
+ module.exports = modules
package/index.mjs ADDED
@@ -0,0 +1 @@
1
+ import scraper from './index.js';
package/package.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "@zenaveline/scraper",
3
+ "version": "1.0.0",
4
+ "description": "Kumpulan scraper",
5
+ "main": "index.js",
6
+ "type": "commonjs",
7
+ "exports": {
8
+ ".": {
9
+ "import": "./index.mjs",
10
+ "require": "./index.js"
11
+ }
12
+ },
13
+ "scripts": {
14
+ "test": "echo \"Error: no test specified\" && exit 1"
15
+ },
16
+ "author": "Zenaveline",
17
+ "license": "ISC",
18
+ "dependencies": {
19
+ "axios": "^1.6.0",
20
+ "cheerio": "^1.0.0",
21
+ "crypto": "^1.0.1"
22
+ }
23
+ }
@@ -0,0 +1,63 @@
1
+ /*
2
+ Base : https://aaplmusicdownloader.com/
3
+ By : ZennzXD
4
+ Created : Kamis 2 April 2026
5
+ */
6
+
7
+ const axios = require('axios')
8
+
9
+ const headers = {
10
+ 'User-Agent': 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Mobile Safari/537.36',
11
+ 'Accept': 'application/json, text/javascript, */*; q=0.01',
12
+ 'origin': 'https://aaplmusicdownloader.com',
13
+ 'referer': 'https://aaplmusicdownloader.com/',
14
+ 'sec-fetch-site': 'same-origin',
15
+ 'sec-fetch-mode': 'cors',
16
+ 'accept-language': 'id-ID,id;q=0.9,en-AU;q=0.8,en;q=0.7,en-US;q=0.6'
17
+ }
18
+
19
+ async function aapldown(url) {
20
+ const init = await axios.get('https://aaplmusicdownloader.com/', { headers })
21
+ const cookies = init.headers['set-cookie']
22
+ const cookieStr = cookies ? cookies.map(c => c.split(';')[0]).join('; ') : ''
23
+
24
+ const reqheaders = { ...headers, 'Cookie': cookieStr, 'x-requested-with': 'XMLHttpRequest' }
25
+
26
+ const metadata = await axios.get(`https://aaplmusicdownloader.com/api/song_url.php?url=${encodeURIComponent(url)}`, { headers: reqheaders })
27
+ const meta = metadata.data
28
+
29
+ const swdData = new URLSearchParams()
30
+ swdData.append('song_name', meta.name.replace(/['"]/g, ''))
31
+ swdData.append('artist_name', meta.artist.replace(/['"]/g, ''))
32
+ swdData.append('url', meta.url)
33
+ swdData.append('token', 'none')
34
+ swdData.append('zip_download', 'false')
35
+ swdData.append('quality', '320')
36
+
37
+ const swdRes = await axios.post('https://aaplmusicdownloader.com/api/composer/swd.php', swdData, {
38
+ headers: { ...reqheaders, 'Content-Type': 'application/x-www-form-urlencoded' }
39
+ })
40
+
41
+ const id3Data = new URLSearchParams()
42
+ id3Data.append('url', swdRes.data.dlink)
43
+ id3Data.append('name', meta.name)
44
+ id3Data.append('artist', meta.artist)
45
+ id3Data.append('album', meta.albumname)
46
+ id3Data.append('thumb', meta.thumb)
47
+
48
+ const id3Res = await axios.post('https://aaplmusicdownloader.com/api/composer/ffmpeg/saveid3.php', id3Data, {
49
+ headers: { ...reqheaders, 'Content-Type': 'application/x-www-form-urlencoded' },
50
+ responseType: 'text'
51
+ })
52
+
53
+ return {
54
+ title: meta.name,
55
+ album: meta.albumname,
56
+ artist: meta.artist,
57
+ thumb: meta.thumb,
58
+ duration: meta.duration,
59
+ url_dl: `https://aaplmusicdownloader.com/api/composer/ffmpeg/saved/${id3Res.data}`
60
+ }
61
+ }
62
+
63
+ module.exports = aapldown
@@ -0,0 +1,44 @@
1
+ /*
2
+ Genius
3
+ Base : https://play.google.com/store/apps/details?id=com.genius.android
4
+ Author : ZennzXD
5
+ Created : Sabtu 2 mei 2026
6
+ */
7
+
8
+ const headers = {
9
+ 'Accept-Encoding': 'gzip',
10
+ 'x-genius-app-background-request': '0',
11
+ 'x-genius-logged-out': 'true',
12
+ 'x-genius-android-version': '8.1.1',
13
+ 'user-agent': 'Genius/8.1.1 (Android; Android 13; ZN/Android)'
14
+ }
15
+
16
+ function parselirik(node) {
17
+ if (typeof node === 'string') return node
18
+ if (!node || !node.children) return ''
19
+ if (node.tag === 'br') return '\n'
20
+ return node.children.map(parselirik).join('')
21
+ }
22
+
23
+ async function detail(id) {
24
+ const res = await fetch(`https://api.genius.com/songs/${id}`, { headers })
25
+ const data = await res.json()
26
+ const song = data.response.song
27
+
28
+ return {
29
+ id: song.id,
30
+ title: song.title,
31
+ artist: song.artist_names,
32
+ header_image_url: song.header_image_url,
33
+ song_art_image_url: song.song_art_image_url,
34
+ instrumental: song.instrumental,
35
+ is_music: song.is_music,
36
+ hidden: song.hidden,
37
+ explicit: song.explicit,
38
+ release_date: song.release_date_for_display,
39
+ url: song.url,
40
+ lyrics: song.lyrics ? parselirik(song.lyrics.dom).trim() : null
41
+ }
42
+ }
43
+
44
+ module.exports = detail
@@ -0,0 +1,42 @@
1
+ /*
2
+ Genius
3
+ Base : https://play.google.com/store/apps/details?id=com.genius.android
4
+ Author : ZennzXD
5
+ Created : Sabtu 2 mei 2026
6
+ */
7
+
8
+ const headers = {
9
+ 'Accept-Encoding': 'gzip',
10
+ 'x-genius-app-background-request': '0',
11
+ 'x-genius-logged-out': 'true',
12
+ 'x-genius-android-version': '8.1.1',
13
+ 'user-agent': 'Genius/8.1.1 (Android; Android 13; ZN/Android)'
14
+ }
15
+
16
+ async function search(query) {
17
+ const res = await fetch(`https://api.genius.com/search/multi?q=${encodeURIComponent(query)}`, { headers })
18
+ const data = await res.json()
19
+
20
+ const songs = []
21
+
22
+ for (const section of data.response.sections) {
23
+ if (section.type === 'song' || section.type === 'top_hit') {
24
+ for (const hit of section.hits) {
25
+ if (hit.type === 'song') {
26
+ const song = hit.result
27
+ songs.push({
28
+ id: song.id,
29
+ title: song.title,
30
+ artist: song.artist_names,
31
+ header_image_url: song.header_image_url,
32
+ url: song.url
33
+ })
34
+ }
35
+ }
36
+ }
37
+ }
38
+
39
+ return songs
40
+ }
41
+
42
+ module.exports = search
package/src/igdl.js ADDED
@@ -0,0 +1,53 @@
1
+ /*
2
+ Base : https://fastdl.app
3
+ Author : ZenzzXD
4
+ Thanks to NX
5
+ */
6
+
7
+ const axios = require('axios')
8
+ const crypto = require('crypto')
9
+
10
+ const headers = {
11
+ 'accept': 'application/json, text/plain, */*',
12
+ 'accept-language': 'id-ID,id;q=0.9,en-AU;q=0.8,en;q=0.7,en-US;q=0.6',
13
+ 'origin': 'https://fastdl.app',
14
+ 'referer': 'https://fastdl.app/',
15
+ 'user-agent': 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Mobile Safari/537.36',
16
+ 'sec-ch-ua': '"Chromium";v="139", "Not;A=Brand";v="99"',
17
+ 'sec-ch-ua-mobile': '?1',
18
+ 'sec-ch-ua-platform': '"Android"',
19
+ 'sec-fetch-dest': 'empty',
20
+ 'sec-fetch-mode': 'cors',
21
+ 'sec-fetch-site': 'same-site'
22
+ }
23
+
24
+ async function igdl(url) {
25
+ const { data: msc } = await axios.get('https://fastdl.app/msec', { headers })
26
+
27
+ const ts = Date.now() - (Math.abs(Date.now() - Math.floor(msc.msec * 1000)) >= 60000 ? Date.now() - Math.floor(msc.msec * 1000) : 0)
28
+
29
+ const sg = crypto
30
+ .createHmac('sha256', Buffer.from('82314e32a384d00f055de496b4737acde3cbb2f851b90e1a70625f6d3bb56401', 'hex'))
31
+ .update(url + ts)
32
+ .digest('hex')
33
+
34
+ const { data: result } = await axios.post('https://cors.siputzx.my.id/https://api-wh.fastdl.app/api/convert',
35
+ new URLSearchParams({
36
+ sf_url : url,
37
+ ts : ts.toString(),
38
+ _ts : '1778140969163',
39
+ _tsc : (Math.abs(Date.now() - Math.floor(msc.msec * 1000)) >= 60000 ? Date.now() - Math.floor(msc.msec * 1000) : 0).toString(),
40
+ _sv : '2',
41
+ _s : sg
42
+ }).toString(),
43
+ {
44
+ headers: {
45
+ ...headers
46
+ }
47
+ }
48
+ )
49
+
50
+ return { success: true, ...result }
51
+ }
52
+
53
+ module.exports = igdl
package/src/igstalk.js ADDED
@@ -0,0 +1,67 @@
1
+ /*
2
+ Base : https://instagram.com
3
+ Author : ZenzzXD
4
+ Test code nya di masing" ya jangan di website
5
+ */
6
+
7
+ const axios = require('axios')
8
+ const cheerio = require('cheerio')
9
+
10
+ const headers = {
11
+ 'host': 'www.instagram.com',
12
+ 'dpr': '1.962499976158142',
13
+ 'viewport-width': '980',
14
+ 'sec-ch-ua': '"Chromium";v="139", "Not;A=Brand";v="99"',
15
+ 'sec-ch-ua-mobile': '?1',
16
+ 'sec-ch-ua-platform': '"Android"',
17
+ 'sec-ch-ua-platform-version': '"13.0.0"',
18
+ 'sec-ch-ua-model': '"RMX3085"',
19
+ 'sec-ch-ua-full-version-list': '"Chromium";v="139.0.7339.0", "Not;A=Brand";v="99.0.0.0"',
20
+ 'sec-ch-prefers-color-scheme': 'dark',
21
+ 'upgrade-insecure-requests': '1',
22
+ 'user-agent': 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Mobile Safari/537.36',
23
+ 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
24
+ 'sec-fetch-site': 'same-origin',
25
+ 'sec-fetch-mode': 'navigate',
26
+ 'sec-fetch-user': '?1',
27
+ 'sec-fetch-dest': 'document',
28
+ 'accept-encoding': 'gzip, deflate, br',
29
+ 'accept-language': 'id-ID,id;q=0.9,en-AU;q=0.8,en;q=0.7,en-US;q=0.6',
30
+ 'cookie': 'csrftoken=UhNYfmpbN4zFIUATif4lcT; datr=aisGabstXUMaPhnsc3rGDr3V; ig_did=8961CBBD-2C6B-486E-97C0-61557817C61A; ps_l=1; ps_n=1; mid=aZVbfgABAAHGlIdJc5uThx4NQ4Qv; wd=551x1096; dpr=1.962499976158142',
31
+ 'pragma': 'akamai-x-cache-on, akamai-x-cache-remote-on, akamai-x-check-cacheable, akamai-x-get-cache-key, akamai-x-get-extracted-values, status-id, akamai-x-get-true-cache-key, akamai-x-serial-no, akamai-x-get-request-id,akamai-x-get-nonces,akamai-x-get-client-ip,akamai-x-feo-trace'
32
+ }
33
+
34
+ async function instagram(username) {
35
+ const r = await axios.get(`https://www.instagram.com/${username}`, { headers })
36
+ const $ = cheerio.load(r.data)
37
+
38
+ const title = $('meta[property="og:title"]').attr('content') || ''
39
+ const description = $('meta[property="og:description"]').attr('content') || ''
40
+ const image = $('meta[property="og:image"]').attr('content') || ''
41
+ const url = $('meta[property="og:url"]').attr('content') || ''
42
+ const nameDescription = $('meta[name="description"]').attr('content') || ''
43
+
44
+ const followers = description.match(/([\d.,KMB]+)\s+(Pengikut|Followers)/i)?.[1] || '0'
45
+ const following = description.match(/([\d.,KMB]+)\s+(Mengikuti|Following)/i)?.[1] || '0'
46
+ const posts = description.match(/([\d.,KMB]+)\s+(Postingan|Posts)/i)?.[1] || '0'
47
+
48
+ const nameUsernameMatch = title.match(/^([^(]+)\s+\(([^)]+)\)/)
49
+ const name = nameUsernameMatch?.[1]?.trim() || ''
50
+ const parsedUsername = nameUsernameMatch?.[2]?.replace('@', '').trim() || username
51
+
52
+ const bioMatch = nameDescription.match(/(?:di Instagram|on Instagram):\s*["']?([^"']+)["']?$/i)
53
+ const bio = bioMatch?.[1] || ''
54
+
55
+ return {
56
+ name,
57
+ username: parsedUsername,
58
+ followers,
59
+ following,
60
+ posts,
61
+ bio,
62
+ profilePic: image,
63
+ url: url || `https://www.instagram.com/${username}`
64
+ }
65
+ }
66
+
67
+ module.exports = instagram
package/src/novaai.js ADDED
@@ -0,0 +1,34 @@
1
+ /*
2
+ Base : https://play.google.com/store/apps/details?id=com.apporigins.NovaAI
3
+ By : ZennzXD
4
+ Created : 1 Mei 2026
5
+ */
6
+
7
+ const headers = {
8
+ 'User-Agent': 'okhttp/4.10.0',
9
+ 'Accept-Encoding': 'gzip',
10
+ 'platform': 'Android',
11
+ 'version': '1.4.0',
12
+ 'language': 'in',
13
+ 'content-type': 'application/json; charset=utf-8'
14
+ }
15
+
16
+ async function novaAi(text) {
17
+ const payload = {
18
+ question_text: text,
19
+ conversation: {
20
+ conversation_items: []
21
+ }
22
+ }
23
+
24
+ const res = await fetch('https://us-central1-nova-ai---android.cloudfunctions.net/app/ai-response/v2', {
25
+ method: 'POST',
26
+ headers: headers,
27
+ body: JSON.stringify(payload)
28
+ })
29
+
30
+ const data = await res.json()
31
+ return data
32
+ }
33
+
34
+ module.exports = novaAi
@@ -0,0 +1,72 @@
1
+ /*
2
+ Base : https://id.pinterest.com/
3
+ Author : ZenzzXD
4
+ Jangan lupa selalu tes code nya
5
+ inspired by wolep : https://pastebin.com/NLpQ1REf
6
+ */
7
+
8
+ const axios = require('axios')
9
+
10
+ const headers = {
11
+ 'User-Agent': 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Mobile Safari/537.36',
12
+ 'Accept-Language': 'id-ID,id;q=0.9,en-AU;q=0.8,en;q=0.7,en-US;q=0.6',
13
+ 'Content-Type': 'application/json',
14
+ 'x-csrftoken': 'daaaed19c58a2787b0d6a23620be18e1',
15
+ 'Cookie': 'csrftoken=daaaed19c58a2787b0d6a23620be18e1; _auth=1'
16
+ }
17
+
18
+ async function parsePinterestId(url) {
19
+ let finalUrl = url
20
+ if (/pin\.it/i.test(url)) {
21
+ const r = await axios.head(url, { maxRedirects: 5 })
22
+ finalUrl = r.request?.res?.responseUrl || r.config?.url
23
+ }
24
+ return finalUrl.match(/\/pin\/(\d+)/)?.[1]
25
+ }
26
+
27
+ function serialize(d1, d2) {
28
+ const a = d1?.data?.v3GetPinQueryv2?.data
29
+ const b = d2?.data?.v3GetPinQueryv2?.data
30
+
31
+ const user = {
32
+ fullName: b?.pinner?.fullName || b?.nativeCreator?.fullName || a?.closeupAttribution?.fullName || a?.nativeCreator?.fullName || '(unknown)',
33
+ username: b?.pinner?.username || a?.nativeCreator?.username || a?.pinner?.username || '(unknown)'
34
+ }
35
+
36
+ const post = {
37
+ title: b?.title?.trim() || b?.closeupUnifiedDescription?.trim() || b?.description?.trim() || '(no title)',
38
+ description: b?.description?.trim() || b?.closeupUnifiedDescription?.trim() || '',
39
+ likesCount: b?.totalReactionCount || 0,
40
+ commentCount: b?.aggregatedPinData?.commentCount || 0,
41
+ createdAt: b?.createdAt || '(unknown)'
42
+ }
43
+
44
+ const v = b?.storyPinData?.pages?.[0]?.blocks?.[0]?.videoDataV2?.videoList720P?.v720P
45
+ || b?.videos?.videoList?.v720P
46
+
47
+ const content = {
48
+ images: Object.keys(a || {}).filter(k => k.startsWith('images_')).map(k => ({ ...a[k], name: k.replace('images_', '') })),
49
+ videos: v ? [v] : []
50
+ }
51
+
52
+ return { user, post, content }
53
+ }
54
+
55
+ async function pinterest(pinurl) {
56
+ const pinId = await parsePinterestId(pinurl)
57
+
58
+ const [r1, r2] = await Promise.all([
59
+ axios.post('https://id.pinterest.com/_/graphql/', {
60
+ queryHash: '5444a9d6e1f023c6785830bbadc6f60fe2bb7a8775b86f77905d400cfb06991b',
61
+ variables: { pinId, isAuth: true, isDesktop: false, isUnauth: false, shouldPrefetchStoryPinFragment: false, shouldSkipImageViewerOnPageQuery: true }
62
+ }, { headers }),
63
+ axios.post('https://id.pinterest.com/_/graphql/', {
64
+ queryHash: 'a03317b3c9329575ec06fe3aeff2a3f194dae93a4eaaf4d16eab671fd2efd198',
65
+ variables: { pinId, isAuth: true, isDesktop: false, isUnauth: false, shouldDefer: false, shouldFetchAIInsight: false, shouldShowSeoDrawerOption: false }
66
+ }, { headers })
67
+ ])
68
+
69
+ return serialize(r1.data, r2.data)
70
+ }
71
+
72
+ module.exports = pinterest
@@ -0,0 +1,32 @@
1
+ const fs = require('fs')
2
+
3
+ async function pixa(img) {
4
+ const form = new FormData()
5
+ form.append('image', new Blob([fs.readFileSync(img)], { type: 'image/jpeg' }), img.split('/').pop())
6
+ form.append('format', 'png')
7
+ form.append('model', 'v1')
8
+
9
+ const res = await fetch('https://api2.pixelcut.app/image/matte/v1', {
10
+ method: 'POST',
11
+ headers: {
12
+ 'User-Agent': 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Mobile Safari/537.36',
13
+ 'Accept': 'application/json, text/plain, */*',
14
+ 'sec-ch-ua': '"Chromium";v="139", "Not;A=Brand";v="99"',
15
+ 'x-locale': 'en',
16
+ 'x-client-version': 'web:pixa.com:4a5b0af2',
17
+ 'sec-ch-ua-mobile': '?1',
18
+ 'sec-ch-ua-platform': '"Android"',
19
+ 'origin': 'https://www.pixa.com',
20
+ 'sec-fetch-site': 'cross-site',
21
+ 'sec-fetch-mode': 'cors',
22
+ 'sec-fetch-dest': 'empty',
23
+ 'referer': 'https://www.pixa.com/',
24
+ 'accept-language': 'id-ID,id;q=0.9,en-AU;q=0.8,en;q=0.7,en-US;q=0.6'
25
+ },
26
+ body: form
27
+ })
28
+
29
+ return Buffer.from(await res.arrayBuffer())
30
+ }
31
+
32
+ module.exports = pixa
@@ -0,0 +1,37 @@
1
+ /*
2
+ Base : https://play.google.com/store/apps/details?id=com.raahim2.Sharpify
3
+ By : ZennzXD
4
+ Created : 2 Mei 2026
5
+ */
6
+
7
+ const fs = require('fs')
8
+
9
+ const headers = {
10
+ 'User-Agent': 'okhttp/4.9.2',
11
+ 'Accept-Encoding': 'gzip'
12
+ }
13
+
14
+ const listmodel = {
15
+ enhance: 'https://sharpify-api.vercel.app/api/enhance/auto_enhance',
16
+ upscale: 'https://sharpify-api.vercel.app/api/enhance/upscale',
17
+ removebg: 'https://sharpify-api.vercel.app/api/enhance/bgrem'
18
+ }
19
+
20
+ async function sharpify(img, model) {
21
+ const form = new FormData()
22
+ const fileBuffer = fs.readFileSync(img)
23
+ const blob = new Blob([fileBuffer], { type: 'image/jpeg' })
24
+
25
+ form.append('file', blob, 'source.jpg')
26
+
27
+ const res = await fetch(listmodel[model], {
28
+ method: 'POST',
29
+ headers: headers,
30
+ body: form
31
+ })
32
+
33
+ const data = await res.json()
34
+ return data
35
+ }
36
+
37
+ module.exports = sharpify
@@ -0,0 +1,65 @@
1
+ const axios = require('axios')
2
+ const cheerio = require('cheerio')
3
+
4
+ async function threadsdl(url) {
5
+ const get = await axios.get('https://sssthreads.net/')
6
+ const cookies = get.headers['set-cookie'].map(v => v.split(';')[0]).join('; ')
7
+ const $get = cheerio.load(get.data)
8
+ const csrf = $get('meta[name="csrf-token"]').attr('content')
9
+
10
+ const res = await axios.post('https://sssthreads.net/fetch-data',{ url },
11
+ {
12
+ headers: {
13
+ 'Content-Type': 'application/json',
14
+ 'X-CSRF-TOKEN': csrf,
15
+ origin: 'https://sssthreads.net',
16
+ referer: 'https://sssthreads.net/',
17
+ Cookie: cookies
18
+ }
19
+ }
20
+ )
21
+
22
+ const $ = cheerio.load(res.data.html)
23
+
24
+ const author = {
25
+ username: $('.author-name').text().trim() || null,
26
+ avatar: $('.author-avatar').attr('src') || null,
27
+ caption: $('.post-description').text().trim() || null
28
+ }
29
+
30
+ const media = []
31
+
32
+ $('.media-item').each((_, el) => {
33
+ const thumb = $(el).find('.thumbnail-img').attr('data-src') || null
34
+
35
+ const links = $(el).find('.download-link')
36
+ let video = null
37
+ let mp3 = null
38
+ let image = null
39
+
40
+ links.each((__, a) => {
41
+ const href = $(a).attr('href')
42
+ const text = $(a).text().toLowerCase()
43
+
44
+ if (text.includes('video')) video = href
45
+ else if (text.includes('mp3')) mp3 = href
46
+ else if (text.includes('photo')) image = href
47
+ })
48
+
49
+ if (video || image) {
50
+ media.push({
51
+ type: video ? 'video' : 'image',
52
+ thumbnail: thumb,
53
+ download: video || image,
54
+ mp3: mp3
55
+ })
56
+ }
57
+ })
58
+
59
+ return {
60
+ author,
61
+ media
62
+ }
63
+ }
64
+
65
+ module.exports = threadsdl
@@ -0,0 +1,39 @@
1
+ /*
2
+ Base : https://ssstweet.com
3
+ Author : ZenzzXD
4
+ */
5
+
6
+ const axios = require('axios')
7
+
8
+ const headers = {
9
+ 'host': 'api-v1.menarailpost.com',
10
+ 'sec-ch-ua': '"Chromium";v="139", "Not;A=Brand";v="99"',
11
+ 'sec-ch-ua-platform': '"Android"',
12
+ 'sec-ch-ua-mobile': '?1',
13
+ 'user-agent': 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Mobile Safari/537.36',
14
+ 'content-type': 'application/json',
15
+ 'accept': '*/*',
16
+ 'origin': 'https://ssstweet.com',
17
+ 'sec-fetch-site': 'cross-site',
18
+ 'sec-fetch-mode': 'cors',
19
+ 'sec-fetch-dest': 'empty',
20
+ 'referer': 'https://ssstweet.com/',
21
+ 'accept-language': 'id-ID,id;q=0.9,en-AU;q=0.8,en;q=0.7,en-US;q=0.6'
22
+ }
23
+
24
+ async function ssstweet(url) {
25
+ try {
26
+ const r = await axios.post('https://api-v1.menarailpost.com/v1/info',
27
+ { url },
28
+ { headers }
29
+ )
30
+ return r.data
31
+ } catch (error) {
32
+ return {
33
+ status: false,
34
+ message: error.message
35
+ }
36
+ }
37
+ }
38
+
39
+ module.exports = ssstweet