indo-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 +646 -0
- package/index.js +38 -0
- package/indo-scraper.zip +0 -0
- package/package.json +26 -0
- package/src/bmkg/cuaca.js +34 -0
- package/src/bmkg/gempa.js +56 -0
- package/src/downloader/facebook.js +94 -0
- package/src/downloader/gdrive.js +38 -0
- package/src/downloader/instagram.js +62 -0
- package/src/downloader/mediafire.js +30 -0
- package/src/downloader/spotify.js +262 -0
- package/src/downloader/tiktok.js +472 -0
- package/src/finance/bbm.js +51 -0
- package/src/finance/emas.js +46 -0
- package/src/finance/kurs.js +64 -0
- package/src/finance/saham.js +117 -0
- package/src/info/cekno.js +39 -0
- package/src/info/resi.js +82 -0
- package/src/news/antara.js +66 -0
- package/src/news/cnn.js +71 -0
- package/src/news/detik.js +108 -0
- package/src/news/kompas.js +70 -0
- package/src/news/liputan6.js +65 -0
- package/src/news/okezone.js +72 -0
- package/src/news/republika.js +73 -0
- package/src/news/tribun.js +95 -0
- package/src/tools/simsimi.js +69 -0
- package/src/tools/ssweb.js +35 -0
- package/src/utils.js +79 -0
package/README.md
ADDED
|
@@ -0,0 +1,646 @@
|
|
|
1
|
+
# indo-scraper
|
|
2
|
+
|
|
3
|
+
Scraper Indonesia untuk Node.js. Mengambil data dari berbagai sumber publik tanpa API key.
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/indo-scraper)
|
|
6
|
+
[](https://www.npmjs.com/package/indo-scraper)
|
|
7
|
+
[](LICENSE)
|
|
8
|
+
|
|
9
|
+
## Install
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install indo-scraper
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
```js
|
|
18
|
+
const Scraper = require('indo-scraper')
|
|
19
|
+
const s = new Scraper()
|
|
20
|
+
|
|
21
|
+
const result = await s.kompas({ channel: 'news', limit: 5 })
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Semua method mengembalikan format yang sama:
|
|
25
|
+
|
|
26
|
+
```js
|
|
27
|
+
// sukses
|
|
28
|
+
{ creator: 'Angga Putra', status: true, data: { ... } }
|
|
29
|
+
|
|
30
|
+
// gagal
|
|
31
|
+
{ creator: 'Angga Putra', status: false, msg: 'error message' }
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## API Reference
|
|
37
|
+
|
|
38
|
+
### News
|
|
39
|
+
|
|
40
|
+
#### `kompas(options)`
|
|
41
|
+
|
|
42
|
+
```js
|
|
43
|
+
await s.kompas({ channel: 'news', page: 1, limit: 20, date: '15/05/2026' })
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
| Option | Default | Values |
|
|
47
|
+
|--------|---------|--------|
|
|
48
|
+
| `channel` | `'news'` | `news` `regional` `megapolitan` `money` `sport` `tekno` `sains` `travel` `food` `health` |
|
|
49
|
+
| `page` | `1` | number |
|
|
50
|
+
| `limit` | `20` | number |
|
|
51
|
+
| `date` | `null` | `dd/mm/yyyy` |
|
|
52
|
+
|
|
53
|
+
```js
|
|
54
|
+
// response
|
|
55
|
+
{
|
|
56
|
+
creator: 'Angga Putra',
|
|
57
|
+
status: true,
|
|
58
|
+
data: [
|
|
59
|
+
{
|
|
60
|
+
title: 'Pemerintah Umumkan Kebijakan Baru Energi Terbarukan',
|
|
61
|
+
url: 'https://nasional.kompas.com/read/2026/05/15/...',
|
|
62
|
+
image: 'https://asset.kompas.com/crops/...',
|
|
63
|
+
category: 'News',
|
|
64
|
+
date: '2026-05-15T08:30:00+07:00',
|
|
65
|
+
source: 'kompas'
|
|
66
|
+
},
|
|
67
|
+
// ...
|
|
68
|
+
]
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
```js
|
|
73
|
+
await s.kompasArticle(url)
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
```js
|
|
77
|
+
// response
|
|
78
|
+
{
|
|
79
|
+
creator: 'Angga Putra',
|
|
80
|
+
status: true,
|
|
81
|
+
data: {
|
|
82
|
+
title: 'Pemerintah Umumkan Kebijakan Baru Energi Terbarukan',
|
|
83
|
+
author: 'Ardito Ramadhan',
|
|
84
|
+
date: '2026-05-15T08:30:00+07:00',
|
|
85
|
+
category: 'Nasional',
|
|
86
|
+
description: 'Pemerintah resmi mengumumkan...',
|
|
87
|
+
thumbnail: 'https://asset.kompas.com/crops/...',
|
|
88
|
+
content: 'Paragraf 1...\n\nParagraf 2...',
|
|
89
|
+
paragraphs: ['Paragraf 1...', 'Paragraf 2...']
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
#### `detik(options)`
|
|
97
|
+
|
|
98
|
+
```js
|
|
99
|
+
await s.detik({ channel: 'news', page: 1, limit: 20 })
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
| Option | Default | Values |
|
|
103
|
+
|--------|---------|--------|
|
|
104
|
+
| `channel` | `'news'` | `news` `finance` `hot` `sport` `inet` `oto` `health` `travel` `food` |
|
|
105
|
+
|
|
106
|
+
```js
|
|
107
|
+
await s.detikSearch(query, limit) // search articles
|
|
108
|
+
await s.detikArticle(url) // full article content
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
#### `cnn(options)`
|
|
114
|
+
|
|
115
|
+
```js
|
|
116
|
+
await s.cnn({ category: 'nasional', limit: 20 })
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
| Option | Default | Values |
|
|
120
|
+
|--------|---------|--------|
|
|
121
|
+
| `category` | `'nasional'` | `nasional` `internasional` `ekonomi` `olahraga` `teknologi` `hiburan` `gaya_hidup` |
|
|
122
|
+
|
|
123
|
+
```js
|
|
124
|
+
await s.cnnArticle(url)
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
#### `tribun(options)`
|
|
130
|
+
|
|
131
|
+
```js
|
|
132
|
+
await s.tribun({ channel: 'nasional', page: 1, limit: 20 })
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
| Option | Default | Values |
|
|
136
|
+
|--------|---------|--------|
|
|
137
|
+
| `channel` | `'nasional'` | `nasional` `regional` `internasional` `sport` `bisnis` `seleb` `lifestyle` `techno` `otomotif` |
|
|
138
|
+
|
|
139
|
+
```js
|
|
140
|
+
await s.tribunArticle(url)
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
#### `liputan6(options)`
|
|
146
|
+
|
|
147
|
+
```js
|
|
148
|
+
await s.liputan6({ channel: 'news', page: 1, limit: 20 })
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
| Option | Default | Values |
|
|
152
|
+
|--------|---------|--------|
|
|
153
|
+
| `channel` | `'news'` | `news` `bisnis` `bola` `tekno` `showbiz` `otomotif` `health` `lifestyle` `global` |
|
|
154
|
+
|
|
155
|
+
```js
|
|
156
|
+
await s.liputan6Article(url)
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
#### `okezone(options)`
|
|
162
|
+
|
|
163
|
+
```js
|
|
164
|
+
await s.okezone({ channel: 'nasional', page: 1, limit: 20 })
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
| Option | Default | Values |
|
|
168
|
+
|--------|---------|--------|
|
|
169
|
+
| `channel` | `'nasional'` | `nasional` `economy` `sports` `techno` `celebrity` `lifestyle` `otomotif` `health` |
|
|
170
|
+
|
|
171
|
+
```js
|
|
172
|
+
await s.okenewsArticle(url)
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
#### `antara(options)`
|
|
178
|
+
|
|
179
|
+
```js
|
|
180
|
+
await s.antara({ channel: 'nasional', page: 1, limit: 20 })
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
| Option | Default | Values |
|
|
184
|
+
|--------|---------|--------|
|
|
185
|
+
| `channel` | `'nasional'` | `nasional` `hukum` `ekonomi` `olahraga` `hiburan` `internasional` `tekno` `otomotif` |
|
|
186
|
+
|
|
187
|
+
```js
|
|
188
|
+
await s.antaraArticle(url)
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
#### `republika(options)`
|
|
194
|
+
|
|
195
|
+
```js
|
|
196
|
+
await s.republika({ channel: 'nasional', page: 1, limit: 20 })
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
| Option | Default | Values |
|
|
200
|
+
|--------|---------|--------|
|
|
201
|
+
| `channel` | `'nasional'` | `nasional` `internasional` `ekonomi` `olahraga` `hiburan` `tekno` `gaya_hidup` |
|
|
202
|
+
|
|
203
|
+
```js
|
|
204
|
+
await s.republikaArticle(url)
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
> Semua scraper news (detik, cnn, tribun, liputan6, okezone, antara, republika) mengembalikan struktur yang sama dengan `kompas` — array of articles dan `Article()` mengembalikan object artikel lengkap dengan `title`, `author`, `date`, `content`, `paragraphs`, dll.
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
### BMKG
|
|
212
|
+
|
|
213
|
+
#### `bmkgGempa()` / `bmkgGempaTerkini()` / `bmkgGempaDirasakan()`
|
|
214
|
+
|
|
215
|
+
```js
|
|
216
|
+
await s.bmkgGempa() // gempa terbaru (1 data)
|
|
217
|
+
await s.bmkgGempaTerkini() // 15 gempa terkini — returns array
|
|
218
|
+
await s.bmkgGempaDirasakan() // gempa yang dirasakan masyarakat — returns array
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
```js
|
|
222
|
+
// response bmkgGempa()
|
|
223
|
+
{
|
|
224
|
+
creator: 'Angga Putra',
|
|
225
|
+
status: true,
|
|
226
|
+
data: {
|
|
227
|
+
tanggal: '15 Mei 2026',
|
|
228
|
+
jam: '09:47:30 WIB',
|
|
229
|
+
datetime: '2026-05-15T02:47:30+00:00',
|
|
230
|
+
koordinat: '-2.34,128.12',
|
|
231
|
+
lintang: '2.34 LS',
|
|
232
|
+
bujur: '128.12 BT',
|
|
233
|
+
magnitude: '4.5',
|
|
234
|
+
kedalaman: '10 km',
|
|
235
|
+
wilayah: 'Pusat gempa berada di darat 23 km BaratLaut Ternate',
|
|
236
|
+
potensi: 'Gempa ini dirasakan untuk diwaspadai',
|
|
237
|
+
dirasakan: 'II-III MMI',
|
|
238
|
+
shakemap: 'https://data.bmkg.go.id/DataMKG/TEWS/20260515094730.mmi.jpg'
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
#### `bmkgCuaca(kota)`
|
|
246
|
+
|
|
247
|
+
```js
|
|
248
|
+
await s.bmkgCuaca('jakarta')
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
Available: `jakarta` `bandung` `surabaya` `medan` `semarang` `makassar` `yogyakarta` `palembang` `denpasar` `balikpapan`
|
|
252
|
+
|
|
253
|
+
```js
|
|
254
|
+
// response
|
|
255
|
+
{
|
|
256
|
+
creator: 'Angga Putra',
|
|
257
|
+
status: true,
|
|
258
|
+
data: {
|
|
259
|
+
lokasi: {
|
|
260
|
+
kecamatan: 'Gambir',
|
|
261
|
+
kotkab: 'Kota Jakarta Pusat',
|
|
262
|
+
provinsi: 'DKI Jakarta'
|
|
263
|
+
},
|
|
264
|
+
prakiraan: [
|
|
265
|
+
{
|
|
266
|
+
datetime: '2026-05-15 06:00:00',
|
|
267
|
+
cuaca: 'Berawan',
|
|
268
|
+
suhu: 28,
|
|
269
|
+
suhu_min: 25,
|
|
270
|
+
suhu_max: 32,
|
|
271
|
+
kelembaban: 80,
|
|
272
|
+
angin: 10,
|
|
273
|
+
arah_angin: 'S',
|
|
274
|
+
icon: 'https://api.bmkg.go.id/asset/cuaca/3.svg'
|
|
275
|
+
},
|
|
276
|
+
// per 3 jam, total ~16 item
|
|
277
|
+
]
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
### Finance
|
|
285
|
+
|
|
286
|
+
#### `saham(kode)`
|
|
287
|
+
|
|
288
|
+
```js
|
|
289
|
+
await s.saham('ihsg') // IHSG
|
|
290
|
+
await s.saham('bbca') // saham BCA
|
|
291
|
+
await s.saham('GOTO') // kode IDX langsung
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
Kode bawaan: `ihsg` `bbca` `bbri` `bmri` `tlkm` `asii` `goto` `unvr` `hmsp` `antm` `indf` `klbf`
|
|
295
|
+
|
|
296
|
+
```js
|
|
297
|
+
// response saham('bbca')
|
|
298
|
+
{
|
|
299
|
+
creator: 'Angga Putra',
|
|
300
|
+
status: true,
|
|
301
|
+
data: {
|
|
302
|
+
kode: 'BBCA',
|
|
303
|
+
nama: 'Bank Central Asia Tbk',
|
|
304
|
+
close: 9850,
|
|
305
|
+
open: 9800,
|
|
306
|
+
high: 9900,
|
|
307
|
+
low: 9750,
|
|
308
|
+
volume: 12540000,
|
|
309
|
+
perubahan_pct: 0.51,
|
|
310
|
+
perubahan_abs: 50,
|
|
311
|
+
performa: {
|
|
312
|
+
'1W': 1.23,
|
|
313
|
+
'1M': -2.45,
|
|
314
|
+
'3M': 5.67,
|
|
315
|
+
'6M': 8.12,
|
|
316
|
+
'1Y': 12.34,
|
|
317
|
+
'YTD': 3.21
|
|
318
|
+
},
|
|
319
|
+
sumber: 'TradingView'
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
```js
|
|
325
|
+
// response saham('ihsg')
|
|
326
|
+
{
|
|
327
|
+
creator: 'Angga Putra',
|
|
328
|
+
status: true,
|
|
329
|
+
data: {
|
|
330
|
+
kode: 'IHSG',
|
|
331
|
+
symbol: 'IDX:COMPOSITE',
|
|
332
|
+
open: 7102.34,
|
|
333
|
+
high: 7145.67,
|
|
334
|
+
low: 7089.12,
|
|
335
|
+
close: 7130.45,
|
|
336
|
+
volume: 18750000000,
|
|
337
|
+
update: '2026-05-15T09:00:00.000Z',
|
|
338
|
+
sumber: 'TradingView'
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
```js
|
|
344
|
+
await s.sahamList(50) // daftar saham by market cap, default 50, max 906
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
```js
|
|
348
|
+
// response sahamList()
|
|
349
|
+
{
|
|
350
|
+
creator: 'Angga Putra',
|
|
351
|
+
status: true,
|
|
352
|
+
data: {
|
|
353
|
+
total: 906,
|
|
354
|
+
tampil: 50,
|
|
355
|
+
data: [
|
|
356
|
+
{
|
|
357
|
+
kode: 'BBCA',
|
|
358
|
+
nama: 'Bank Central Asia Tbk',
|
|
359
|
+
close: 9850,
|
|
360
|
+
perubahan_pct: 0.51,
|
|
361
|
+
perubahan_abs: 50,
|
|
362
|
+
volume: 12540000,
|
|
363
|
+
market_cap: 241350000000000,
|
|
364
|
+
performa: { '1W': 1.23, '1M': -2.45, '1Y': 12.34, 'YTD': 3.21 }
|
|
365
|
+
},
|
|
366
|
+
// ...
|
|
367
|
+
]
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
---
|
|
373
|
+
|
|
374
|
+
#### `kurs(kode)` / `kursAll()`
|
|
375
|
+
|
|
376
|
+
```js
|
|
377
|
+
await s.kurs('usd')
|
|
378
|
+
await s.kursAll()
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
Mendukung semua kode ISO 4217. Sumber: fiskal.kemenkeu.go.id.
|
|
382
|
+
|
|
383
|
+
```js
|
|
384
|
+
// response kurs('usd')
|
|
385
|
+
{
|
|
386
|
+
creator: 'Angga Putra',
|
|
387
|
+
status: true,
|
|
388
|
+
data: {
|
|
389
|
+
mata_uang: 'Dolar Amerika Serikat',
|
|
390
|
+
kode: 'USD',
|
|
391
|
+
nilai: '16.285',
|
|
392
|
+
perubahan: '+25',
|
|
393
|
+
sumber: 'Kemenkeu'
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
// response kursAll()
|
|
398
|
+
{
|
|
399
|
+
creator: 'Angga Putra',
|
|
400
|
+
status: true,
|
|
401
|
+
data: {
|
|
402
|
+
sumber: 'Kemenkeu',
|
|
403
|
+
data: [
|
|
404
|
+
{ mata_uang: 'Dolar Amerika Serikat', kode: 'USD', nilai: '16.285', perubahan: '+25' },
|
|
405
|
+
{ mata_uang: 'Euro', kode: 'EUR', nilai: '17.842', perubahan: '-10' },
|
|
406
|
+
// ...
|
|
407
|
+
]
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
---
|
|
413
|
+
|
|
414
|
+
#### `emasAntam()` / `emasHarga()`
|
|
415
|
+
|
|
416
|
+
```js
|
|
417
|
+
await s.emasAntam() // harga emas Antam per gram (logammulia.com)
|
|
418
|
+
await s.emasHarga() // harga emas dunia dalam IDR, Ounce & Gram
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
```js
|
|
422
|
+
// response emasAntam()
|
|
423
|
+
{
|
|
424
|
+
creator: 'Angga Putra',
|
|
425
|
+
status: true,
|
|
426
|
+
data: {
|
|
427
|
+
tanggal: 'Harga Emas 15 Mei 2026',
|
|
428
|
+
data: [
|
|
429
|
+
{ berat: '0.5 gr', harga_dasar: 'Rp 875.000', harga_termasuk_pajak: 'Rp 913.000' },
|
|
430
|
+
{ berat: '1 gr', harga_dasar: 'Rp 1.650.000', harga_termasuk_pajak: 'Rp 1.722.000' },
|
|
431
|
+
{ berat: '2 gr', harga_dasar: 'Rp 3.280.000', harga_termasuk_pajak: 'Rp 3.424.000' },
|
|
432
|
+
{ berat: '5 gr', harga_dasar: 'Rp 8.150.000', harga_termasuk_pajak: 'Rp 8.517.000' },
|
|
433
|
+
// ...
|
|
434
|
+
]
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
---
|
|
440
|
+
|
|
441
|
+
#### `bbm()`
|
|
442
|
+
|
|
443
|
+
```js
|
|
444
|
+
await s.bbm()
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
```js
|
|
448
|
+
// response
|
|
449
|
+
{
|
|
450
|
+
creator: 'Angga Putra',
|
|
451
|
+
status: true,
|
|
452
|
+
data: {
|
|
453
|
+
update: 'Last Updated: 15 Mei 2026',
|
|
454
|
+
harga: [
|
|
455
|
+
{ jenis: 'Pertalite', harga: 'Rp 10.000/Liter' },
|
|
456
|
+
{ jenis: 'Pertamax', harga: 'Rp 12.500/Liter' },
|
|
457
|
+
{ jenis: 'Dexlite', harga: 'Rp 13.950/Liter' },
|
|
458
|
+
{ jenis: 'Pertamina Dex', harga: 'Rp 14.550/Liter' }
|
|
459
|
+
],
|
|
460
|
+
provinsi: [
|
|
461
|
+
{ Provinsi: 'DKI Jakarta', Pertalite: 'Rp 10.000', Pertamax: 'Rp 12.500' },
|
|
462
|
+
// ...
|
|
463
|
+
]
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
---
|
|
469
|
+
|
|
470
|
+
### Info
|
|
471
|
+
|
|
472
|
+
#### `cekNomor(nomor)`
|
|
473
|
+
|
|
474
|
+
Cek provider nomor HP Indonesia. Bekerja offline, tanpa network request.
|
|
475
|
+
|
|
476
|
+
```js
|
|
477
|
+
await s.cekNomor('08123456789')
|
|
478
|
+
await s.cekNomor('+628123456789')
|
|
479
|
+
await s.cekNomor('628123456789')
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
```js
|
|
483
|
+
// response (semua format input menghasilkan output yang sama)
|
|
484
|
+
{
|
|
485
|
+
creator: 'Angga Putra',
|
|
486
|
+
status: true,
|
|
487
|
+
data: {
|
|
488
|
+
nomor_asli: '08123456789',
|
|
489
|
+
nomor: '08123456789',
|
|
490
|
+
prefix: '0812',
|
|
491
|
+
provider: 'Telkomsel',
|
|
492
|
+
panjang: 11
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
Provider yang dikenali: Telkomsel, Indosat, XL, AXIS, Smartfren, Three.
|
|
498
|
+
|
|
499
|
+
---
|
|
500
|
+
|
|
501
|
+
#### `cekResi(kurir, noResi)`
|
|
502
|
+
|
|
503
|
+
```js
|
|
504
|
+
await s.cekResi('jne', 'JNEX12345678')
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
Kurir: `jne` `jnt` `j&t` `sicepat` `pos` `anteraja` `wahana` `tiki` `ninja` `lion`
|
|
508
|
+
|
|
509
|
+
```js
|
|
510
|
+
// response
|
|
511
|
+
{
|
|
512
|
+
creator: 'Angga Putra',
|
|
513
|
+
status: true,
|
|
514
|
+
data: {
|
|
515
|
+
kurir: 'jne',
|
|
516
|
+
noResi: 'JNEX12345678',
|
|
517
|
+
status: 'DELIVERED',
|
|
518
|
+
history: [
|
|
519
|
+
{ tanggal: '15/05/2026 10:30', keterangan: 'DELIVERED', lokasi: 'Jakarta Selatan' },
|
|
520
|
+
{ tanggal: '15/05/2026 07:00', keterangan: 'WITH COURIER', lokasi: 'Jakarta' },
|
|
521
|
+
{ tanggal: '14/05/2026 20:00', keterangan: 'RECEIVED AT ORIGIN GATEWAY', lokasi: 'Surabaya' }
|
|
522
|
+
]
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
---
|
|
528
|
+
|
|
529
|
+
### Downloader
|
|
530
|
+
|
|
531
|
+
#### `instagram(url)`
|
|
532
|
+
|
|
533
|
+
```js
|
|
534
|
+
await s.instagram('https://www.instagram.com/p/...')
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
```js
|
|
538
|
+
// response (foto / video / reels)
|
|
539
|
+
{
|
|
540
|
+
creator: 'Angga Putra',
|
|
541
|
+
status: true,
|
|
542
|
+
data: {
|
|
543
|
+
url: 'https://www.instagram.com/p/...',
|
|
544
|
+
medias: [
|
|
545
|
+
{
|
|
546
|
+
type: 'video',
|
|
547
|
+
url: 'https://cdn.rapidcdn.app/...',
|
|
548
|
+
thumbnail: 'https://...'
|
|
549
|
+
}
|
|
550
|
+
]
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
// carousel — medias berisi lebih dari 1 item
|
|
555
|
+
{
|
|
556
|
+
creator: 'Angga Putra',
|
|
557
|
+
status: true,
|
|
558
|
+
data: {
|
|
559
|
+
url: 'https://www.instagram.com/p/...',
|
|
560
|
+
medias: [
|
|
561
|
+
{ type: 'image', url: 'https://...', thumbnail: 'https://...' },
|
|
562
|
+
{ type: 'image', url: 'https://...', thumbnail: 'https://...' },
|
|
563
|
+
{ type: 'video', url: 'https://...', thumbnail: 'https://...' }
|
|
564
|
+
]
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
```
|
|
568
|
+
|
|
569
|
+
```js
|
|
570
|
+
await s.tiktok(url) // video TikTok tanpa watermark
|
|
571
|
+
await s.spotify(url) // track atau playlist Spotify
|
|
572
|
+
await s.facebook(url) // video Facebook
|
|
573
|
+
await s.mediafire(url) // direct link Mediafire
|
|
574
|
+
await s.gdrive(url) // direct link Google Drive
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
---
|
|
578
|
+
|
|
579
|
+
### Tools
|
|
580
|
+
|
|
581
|
+
#### `ssweb(url, device)`
|
|
582
|
+
|
|
583
|
+
Screenshot website via Microlink API.
|
|
584
|
+
|
|
585
|
+
```js
|
|
586
|
+
await s.ssweb('https://example.com')
|
|
587
|
+
await s.ssweb('https://example.com', 'mobile')
|
|
588
|
+
```
|
|
589
|
+
|
|
590
|
+
Device: `desktop` (default) `mobile` `tablet` `hd` `4k`
|
|
591
|
+
|
|
592
|
+
---
|
|
593
|
+
|
|
594
|
+
#### `simsimi(text)`
|
|
595
|
+
|
|
596
|
+
```js
|
|
597
|
+
await s.simsimi('halo, apa kabar?')
|
|
598
|
+
```
|
|
599
|
+
|
|
600
|
+
---
|
|
601
|
+
|
|
602
|
+
## Extending
|
|
603
|
+
|
|
604
|
+
Untuk menambah scraper baru:
|
|
605
|
+
|
|
606
|
+
**1. Buat file di folder yang sesuai**, contoh `src/news/bisnis.js`:
|
|
607
|
+
|
|
608
|
+
```js
|
|
609
|
+
const { fetchHTML, cheerio, ok, fail } = require('../utils')
|
|
610
|
+
|
|
611
|
+
const bisnis = async (options = {}) => {
|
|
612
|
+
return new Promise(async (resolve) => {
|
|
613
|
+
try {
|
|
614
|
+
const html = await fetchHTML('https://bisnis.com/...')
|
|
615
|
+
const $ = cheerio.load(html)
|
|
616
|
+
// parse data ...
|
|
617
|
+
resolve(ok(data))
|
|
618
|
+
} catch (e) {
|
|
619
|
+
resolve(fail(e))
|
|
620
|
+
}
|
|
621
|
+
})
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
module.exports = { bisnis }
|
|
625
|
+
```
|
|
626
|
+
|
|
627
|
+
**2. Daftarkan di `index.js`:**
|
|
628
|
+
|
|
629
|
+
```js
|
|
630
|
+
require('./src/news/bisnis'),
|
|
631
|
+
```
|
|
632
|
+
|
|
633
|
+
Utils yang tersedia: `fetchHTML` `fetchJSON` `cheerio` `parseLdJson` `parseThumbnail` `parseParagraphs` `ok` `fail`
|
|
634
|
+
|
|
635
|
+
---
|
|
636
|
+
|
|
637
|
+
## Notes
|
|
638
|
+
|
|
639
|
+
- Scraper berbasis HTML parsing. Jika `status: false` dan pesan "Data tidak ditemukan", kemungkinan selector CSS perlu diperbarui karena situs mengubah struktur HTML-nya.
|
|
640
|
+
- BMKG Gempa menggunakan mirror Google Storage agar tidak terkena rate limit endpoint utama BMKG.
|
|
641
|
+
- Data saham dan IHSG dari TradingView Scanner — tanpa API key, tanpa rate limit.
|
|
642
|
+
- Kurs dari Kemenkeu (fiskal.kemenkeu.go.id) — data resmi pemerintah.
|
|
643
|
+
|
|
644
|
+
## License
|
|
645
|
+
|
|
646
|
+
MIT © Angga Putra
|
package/index.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
global.creator = 'Angga Putra'
|
|
2
|
+
|
|
3
|
+
module.exports = class Scraper {
|
|
4
|
+
constructor() {
|
|
5
|
+
Object.assign(this,
|
|
6
|
+
// ── News ──────────────────────────────────────────────────────────────
|
|
7
|
+
require('./src/news/kompas'),
|
|
8
|
+
require('./src/news/detik'),
|
|
9
|
+
require('./src/news/cnn'),
|
|
10
|
+
require('./src/news/tribun'),
|
|
11
|
+
require('./src/news/liputan6'),
|
|
12
|
+
require('./src/news/okezone'),
|
|
13
|
+
require('./src/news/antara'),
|
|
14
|
+
require('./src/news/republika'),
|
|
15
|
+
// ── BMKG ──────────────────────────────────────────────────────────────
|
|
16
|
+
require('./src/bmkg/gempa'),
|
|
17
|
+
require('./src/bmkg/cuaca'),
|
|
18
|
+
// ── Finance ───────────────────────────────────────────────────────────
|
|
19
|
+
require('./src/finance/saham'),
|
|
20
|
+
require('./src/finance/kurs'),
|
|
21
|
+
require('./src/finance/emas'),
|
|
22
|
+
require('./src/finance/bbm'),
|
|
23
|
+
// ── Info ──────────────────────────────────────────────────────────────
|
|
24
|
+
require('./src/info/cekno'),
|
|
25
|
+
require('./src/info/resi'),
|
|
26
|
+
// ── Downloader ────────────────────────────────────────────────────────
|
|
27
|
+
require('./src/downloader/instagram'),
|
|
28
|
+
require('./src/downloader/tiktok'),
|
|
29
|
+
require('./src/downloader/mediafire'),
|
|
30
|
+
require('./src/downloader/facebook'),
|
|
31
|
+
require('./src/downloader/spotify'),
|
|
32
|
+
//require('./src/downloader/tiktokSlide'),
|
|
33
|
+
// ── Tools ────────────────────────────────────────────────────────
|
|
34
|
+
require('./src/tools/ssweb'),
|
|
35
|
+
require('./src/tools/simsimi'),
|
|
36
|
+
)
|
|
37
|
+
}
|
|
38
|
+
}
|
package/indo-scraper.zip
ADDED
|
Binary file
|
package/package.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "indo-scraper",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Scraper Indonesia — berita, BMKG, saham, emas, kurs, BBM, cek nomor, cek resi",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"keywords": ["scraper", "indonesia", "berita", "bmkg", "saham", "kurs", "kompas", "detik", "bot-whatsapp", "bot", "whatsapp"],
|
|
7
|
+
"author": "Angga Putra",
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/Putra-Dev/indo-scraper.git"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/Putra-Dev/indo-scraper/issues"
|
|
15
|
+
},
|
|
16
|
+
"homepage": "https://github.com/Putra-Dev/indo-scraper#readme",
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"assert": "^2.1.0",
|
|
19
|
+
"axios": "^1.7.2",
|
|
20
|
+
"cheerio": "^1.0.0",
|
|
21
|
+
"cloudscraper": "^4.6.0"
|
|
22
|
+
},
|
|
23
|
+
"engines": {
|
|
24
|
+
"node": ">=14.0.0"
|
|
25
|
+
}
|
|
26
|
+
}
|