@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 +101 -0
- package/index.js +25 -0
- package/index.mjs +1 -0
- package/package.json +23 -0
- package/src/applemusicdl.js +63 -0
- package/src/geniusdetail.js +44 -0
- package/src/geniussearch.js +42 -0
- package/src/igdl.js +53 -0
- package/src/igstalk.js +67 -0
- package/src/novaai.js +34 -0
- package/src/pinterestdownload.js +72 -0
- package/src/pixaremovebg.js +32 -0
- package/src/sharpify.js +37 -0
- package/src/threadsdownload.js +65 -0
- package/src/twetterdownload.js +39 -0
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
|
+
[](https://badge.fury.io/js/@zenaveline%2Fscraper)
|
|
6
|
+
[](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
|
package/src/sharpify.js
ADDED
|
@@ -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
|