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 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
+ [![npm](https://img.shields.io/npm/v/indo-scraper)](https://www.npmjs.com/package/indo-scraper)
6
+ [![npm downloads](https://img.shields.io/npm/dm/indo-scraper)](https://www.npmjs.com/package/indo-scraper)
7
+ [![license](https://img.shields.io/npm/l/indo-scraper)](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
+ }
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
+ }