# 🕷️ botScraping — Node.js + Playwright Scraper & Sentiment Analyzer

> Toolkit scraping ringan berbasis **Node.js + Playwright** untuk mengumpulkan data dari media sosial (X.com) dan menganalisis sentimen komentar secara lokal — tanpa server, tanpa cloud berbayar.

---

## 📁 Struktur File

```
botScraping/
├── scraper.js              # Scraper dasar (profil X.com → CSV)
├── sentiment_scraper.js    # Scraper + Analisis Sentimen (pencarian topik)
├── words_id.js             # Kosakata sentimen Bahasa Indonesia
├── data_scraping.csv       # Output scraper.js
├── hasil_sentimen.csv      # Output sentiment_scraper.js
└── README.md               # Dokumentasi ini
```

---

## ⚙️ Persyaratan Sistem

| Kebutuhan | Versi Minimum |
|-----------|---------------|
| Node.js   | v18+          |
| npm       | v9+           |
| OS        | Windows / Linux / macOS |

---

## 🚀 Instalasi

Jalankan perintah berikut sekali saja di folder project:

```bash
npm install playwright sentiment
npx playwright install chromium
```

---

## 🔑 Cara Mendapatkan `auth_token` X.com

> Wajib diisi agar script tidak terkena *login wall* dari X.com.

1. Buka browser Chrome/Firefox → login ke **[x.com](https://x.com)**
2. Tekan `F12` → tab **Application** → **Cookies** → `https://x.com`
3. Cari cookie bernama **`auth_token`** → salin nilainya
4. Tempelkan nilainya di script yang digunakan:

```js
const X_AUTH_TOKEN = 'isi_token_kamu_di_sini';
```

> ⚠️ **Jangan bagikan `auth_token` ke siapapun.** Token ini setara dengan password sesi login kamu.

---

## 📄 Script 1 — `scraper.js`

Scraper dasar untuk mengambil tweet dari **halaman profil** X.com.

### Konfigurasi

```js
const TARGET_URL   = 'https://x.com/username';   // Profil yang di-scrape
const WAIT_FOR     = 'article[data-testid="tweet"]';
const OUTPUT_FILE  = 'data_scraping.csv';
const X_AUTH_TOKEN = 'isi_token_kamu';
```

### Menjalankan

```bash
node scraper.js
```

### Output CSV (`data_scraping.csv`)

| Kolom | Keterangan |
|-------|-----------|
| `teks` | Isi tweet |
| `tautan` | Link permanen tweet |
| `like` | Jumlah like |
| `retweet` | Jumlah retweet |
| `scraped_at` | Waktu scraping (WIB) |

---

## 🧠 Script 2 — `sentiment_scraper.js`

Scraper + analisis sentimen untuk **pencarian topik/keyword** di X.com.  
Mengklasifikasikan setiap tweet sebagai **POSITIF**, **NEGATIF**, atau **NETRAL** beserta persentasenya.

### Konfigurasi

```js
const KEYWORD      = 'covid19';    // Topik yang dicari (bisa diganti bebas)
const MAX_TWEET    = 80;           // Maks tweet yang dikumpulkan
const SCROLL_TIMES = 8;            // Jumlah scroll (lebih besar = lebih banyak data)
const X_AUTH_TOKEN = 'isi_token_kamu';
```

### Menjalankan

```bash
node sentiment_scraper.js
```

### Contoh Output Terminal

```
╔══════════════════════════════════════════════════════════╗
║         HASIL ANALISIS SENTIMEN — "COVID19"
╠══════════════════════════════════════════════════════════╣
║  Total data terkumpul : 76
║
║  😊 POSITIF  ████████████░░░░░░░░░░░░░░░░░░  32 (42.1%)
║  😠 NEGATIF  ████████░░░░░░░░░░░░░░░░░░░░░░  21 (27.6%)
║  😐 NETRAL   ██████░░░░░░░░░░░░░░░░░░░░░░░░  23 (30.3%)
║
╠══════════════════════════════════════════════════════════╣
║  🏆 TOP 3 KOMENTAR TERBAIK (paling positif):
║  [1] Skor: +5.2 | Alhamdulillah sudah sembuh dari covid, tetap semangat…
║  [2] Skor: +4.8 | Vaksin itu bagus dan terbukti efektif melindungi kita…
║  [3] Skor: +3.6 | Terima kasih para tenaga kesehatan yang sudah berjuang…
║
╠══════════════════════════════════════════════════════════╣
║  💀 TOP 3 KOMENTAR TERBURUK (paling negatif):
║  [1] Skor: -6.1 | Hoaks! Vaksin itu berbahaya dan mematikan, jangan percaya…
║  [2] Skor: -5.4 | Pemerintah gagal total menangani pandemi ini, bencana besar…
║  [3] Skor: -4.2 | Kasian yang meninggal akibat covid, sistem kesehatan kacau…
╚══════════════════════════════════════════════════════════╝
```

### Output CSV (`hasil_sentimen.csv`)

| Kolom | Keterangan |
|-------|-----------|
| `user` | Nama akun |
| `teks` | Isi tweet |
| `tautan` | Link permanen tweet |
| `like` / `retweet` / `reply` | Metrik engagement |
| `sentimen` | `POSITIF` / `NEGATIF` / `NETRAL` |
| `skor_sentimen` | Angka skor (positif = baik, negatif = buruk) |
| `comparative` | Skor rata-rata per kata |
| `kata_positif` | Kata-kata pemicu skor positif |
| `kata_negatif` | Kata-kata pemicu skor negatif |
| `keyword` | Topik pencarian |
| `scraped_at` | Waktu scraping (WIB) |

---

## 🗂️ `words_id.js` — Kosakata Sentimen Indonesia

Berisi daftar kata positif dan negatif dalam **Bahasa Indonesia** yang diinjeksikan ke library `sentiment` agar analisis lebih akurat untuk konten berbahasa Indonesia.

```
Positif: bagus, hebat, mantap, sembuh, divaksin, alhamdulillah, ...
Negatif: bahaya, hoaks, gagal, parah, meninggal, korupsi, bodoh, ...
```

> Kamu bisa menambahkan kata baru langsung di file `words_id.js` untuk menyesuaikan dengan topik tertentu.

---

## 🔄 Cara Ganti Topik

Cukup ubah satu variabel di `sentiment_scraper.js`:

```js
const KEYWORD = 'covid19';      // ← ganti sesuka hati
// Contoh lain:
// const KEYWORD = 'pemilu 2024';
// const KEYWORD = 'bbm naik';
// const KEYWORD = 'kpk';
// const KEYWORD = 'timnas indonesia';
```

---

## ⚠️ Disclaimer & Etika Scraping

- Script ini dibuat **hanya untuk keperluan riset, edukasi, dan analisis data**.
- Jangan gunakan untuk spam, manipulasi, atau tujuan yang melanggar [Terms of Service X.com](https://twitter.com/en/tos).
- Batasi frekuensi scraping agar tidak membebani server platform.
- Data yang dikumpulkan **tidak boleh dijual atau disebarluaskan** tanpa izin pemilik akun.

---

## 🛠️ Troubleshooting

| Masalah | Solusi |
|---------|--------|
| `Timeout 15000ms exceeded` | Selector tidak ditemukan — cek apakah `auth_token` sudah benar |
| `X_AUTH_TOKEN belum diisi` | Isi nilai `auth_token` di bagian konfigurasi script |
| `Cannot find module 'sentiment'` | Jalankan `npm install sentiment` |
| `Cannot find module 'playwright'` | Jalankan `npm install playwright` |
| Data terkumpul sedikit | Tambah nilai `SCROLL_TIMES` atau `MAX_TWEET` |
| Teks berantakan di Excel | Buka Excel → Data → From Text/CSV → pilih delimiter `;` |

---

## 📌 Catatan Teknis

- **Headless mode**: browser berjalan di background tanpa GUI untuk menghemat RAM.
- **BOM UTF-8**: file CSV menggunakan byte-order mark agar karakter Indonesia terbaca benar di Excel.
- **Analisis bilingual**: skor sentimen menggabungkan kosakata Bahasa Indonesia (60%) + Bahasa Inggris (40%).
- **Deduplikasi**: tweet yang sama tidak akan dihitung dua kali meskipun muncul saat scroll.

---

*Dibuat dengan ❤️ menggunakan Node.js + Playwright + Sentiment.js*
