Dokumentasi lengkap untuk repository: HASYIM56/bot-translator
Ringkasan singkat: ini adalah bot WhatsApp berbasis Baileys (nodejs) yang menyediakan banyak utilitas — khususnya fitur terjemahan (.translate) — serta manajemen grup, pengunduhan media (YouTube / TikTok / MediaFire), manipulasi profile, auto-react, anti-delete, dan banyak lagi. Dirancang untuk berjalan di server Linux (Alpine kompatibel) dan memanfaatkan ffmpeg serta utilitas Python (yt-dlp) untuk beberapa fungsi.
- Apa itu bot whatsapp?
- Instalasinya
- Fitur Bot Whatsapp
- Fitur utama:
.translate(Penerjemah WA Translator) - Daftar lengkap perintah / fitur
- Fitur utama:
- Struktur Project
- Penjelasan file / folder penting
- Konfigurasi & File Persisten
- Penggunaan & Contoh Perintah
- Catatan Keamanan & Etika
- License
Bot WhatsApp ini adalah aplikasi Node.js yang menggunakan pustaka Baileys untuk berinteraksi dengan Web/Cloud WhatsApp. Tujuannya:
- Menyediakan penerjemah pesan via perintah
.translate(fitur utama). - Menyediakan alat admin grup (kick, promote, demote, tagall, lock/unlock, dsb).
- Mengelola media: konversi stiker, voice-note, download YouTube/TikTok/MediaFire.
- Fitur pendukung: anti-delete (recover deleted messages), autoreact, self-react, auto-read, realtime bio/updater, auto-block pada panggilan masuk, dan masih banyak lagi. Ringkas: bot multifungsi untuk otomatisasi dan utilitas chatting WhatsApp.
- Node.js >= 18 (direkomendasikan Node 18 LTS)
- npm (disertakan dengan Node)
- Python (untuk skrip downloader: yt-dlp) — versi terbaru disarankan (3.10/3.11+)
- ffmpeg (system binary) — diperlukan untuk konversi audio/video
- Sistem berkas: akses untuk membuat folder
session/,config/, dan folder permanen/HASYIM56/*
Docker/Alpine: jika menggunakan Alpine, instal paket sistem untuk ffmpeg dan Python sesuai distribusi.
- Clone repo:
git clone https://github.com/HASYIM56/bot-translator.git cd bot-translator - Install Node.js dependencies:
npm install
- Install Python dependency (yt-dlp):
- Sistem dengan pip:
pip install -U yt-dlp
- Jika menggunakan virtualenv, aktifkan environment lalu install:
python -m venv venv source venv/bin/activate pip install -U yt-dlp
- Sistem dengan pip:
- Pastikan ffmpeg tersedia:
- Debian/Ubuntu:
sudo apt update && sudo apt install -y ffmpeg - Alpine:
apk add --no-cache ffmpeg
- Alternatif: repo sudah memiliki dependency
ffmpeg-statictapi beberapa helper Python dan skrip CLI mengharapkan ffmpeg system-wide; sangat disarankan menginstall ffmpeg di OS.
- Debian/Ubuntu:
- Menjalankan bot:
Saat pertama kali, scan QR code di terminal (qrcode-terminal ditampilkan).
npm start
- npm dependencies (dari package.json):
- @whiskeysockets/baileys — WhatsApp Web protocol client
- axios — HTTP client
- ffmpeg-static — static binary helper (fallback)
- pino — logger
- qrcode-terminal — menampilkan QR di terminal
- sharp — image processing (sticker, profile images)
- node-fetch — fetch (dipakai di modul qrcode.js)
- h56-translator — modul penerjemah (dipakai untuk .translate)
- wa-sticker-formatter — opsi untuk membuat stiker profesional
- mediafire — (opsional) helper library
- pip / python:
- yt-dlp — untuk downloader TikTok / YouTube (dipakai di tiktok.py / youtube.py)
- (opsional) ffmpeg system binary diperlukan untuk transcode; tidak di-install via pip
Catatan: beberapa script (tiktok.py / youtube.py) mengeluarkan progress JSON via stderr yang dipakai untuk menampilkan progress di chat. Pastikan python tersedia di PATH, atau edit script untuk path python spesifik.
Fitur utama (ditandai):
- .translate — Fitur utama: penerjemah pesan (support banyak bahasa). (Fitur utama dari WA Translator)
Daftar lengkap perintah / fitur (berdasarkan source code):
- .menu — Tampilkan menu (ini)
- .dev — Informasi developer & kontak
- .public / .private — Ubah mode akses bot (public / private)
- .kickall — Keluarkan semua member kecuali owners & bot (Owner Utama)
- .spam — Kirim pesan berulang (Owner Utama)
- .spamreport <nomor_target> <jumlah_report> — Jalankan mass report terhadap nomor (Only Owner Utama) — menyediakan cancel (.spamreport cancel)
- .autoreact on/off — Toggle AutoReact (Owner Utama)
- .antidelete on/off — Toggle anti-delete (Owner)
- .block / .unblock — Blokir / buka blokir nomor (Only Owner Utama)
- .kick — Keluarkan satu member (Owner)
- .admin — Promosikan member jadi admin (Owner)
- .unadmin — Copot hak admin (Owner)
- .setpp — Set profile picture bot (Owner Utama)
- .setpppanjang — Set profile picture panjang (Owner Utama) — tanpa canvas, menyesuaikan ukuran dan kompresi
- .setppgrup — Set photo grup (Owner / admin)
- .hidetag — Kirim pesan dengan mention semua (Owner)
- .tagall — Mention semua member (Owner Utama)
- .closegroup / .opengroup — Lock / Unlock group (admin)
- .deletemsg — Hapus pesan (Owner + bot harus admin) — perbaikan robust delete
- .stiker — Ubah gambar menjadi stiker (JPEG/PNG/WEBP), dukungan wa-sticker-formatter dan fallback sharp/ffmpeg
- .audiotovn — Konversi audio menjadi Voice Note (OGG/OPUS) (reply audio)
- .addmember — Tambah member via nomor (Owner)
- .qrcode <url/teks> — Generate QR code (menggunakan API eksternal, simpan di /HASYIM56/qrcode)
- .viewonce — Recover media view-once (reply view-once message)
- .createviewonce — take photo media data in view-once form and re-send it by the bot as view-once media (reply view-once message)
- .urltopdf detail
- .ttdownload [resolusi] — Download TikTok (menggunakan tiktok.py / yt-dlp) — private chat only
- .ttsearch — Cari pengguna TikTok (via module tiktok.js)
- .fwd on/off — Forward Many Times Mode (Owner Utama)
- .ytmp4 — Download YouTube -> MP4 (private chat only; menggunakan youtube.py)
- .ytmp3 — Download YouTube -> MP3 (private chat only; menggunakan youtube.py)
- .audiofake [reply / mention] — Buat audio palsu (fake-duration) dan kirim sebagai voice-note (Owner)
- .mediafire — Download file dari MediaFire (diproteksi private chat)
- Realtime / background behaviors:
-
Auto-react otomatis pada pesan masuk (initial + done)
-
Self-react (bot bereaksi pada pesan yang dikirimnya secara dua tahap)
-
Auto-read (menandai pesan sebagai dibaca secara batch)
-
Recording indicator (tunjukkan presence recording saat mengirim pesan)
-
Realtime bio updater (update profile status / about dengan runtime)
-
Auto-block on incoming calls (otomatis reject & block nomor yang telepon bot; pengecualian owner)
-
Anti-delete: menyimpan salinan pesan masuk & re-send saat user menghapus pesan
-
Integrasi block manager: persist blocked list ke config/blocked-user.json
-
.githubsearch
-
Deskripsi singkat
- Perintah:
.githubsearch <username> - Fungsi: Mengambil dan menampilkan ringkasan profil GitHub publik dari sebuah username menggunakan library scraping (
h56-github-scrapper). Informasi yang dikembalikan meliputi nama, bio, lokasi (jika ada), jumlah repository publik, jumlah followers / following, URL profil, serta daftar 3–5 repository unggulan (diurutkan menurut bintang).
Contoh penggunaan
- .githubsearch torvalds
- .githubsearch octocat
Output (format ringkasan)
- 👤 Username :
- 📝 Nama : <display name atau "-">
- 💬 Bio : <bio atau "-">
- 📍 Lokasi :
- 📦 Repos publik :
- 👥 Followers : • ➡ Following:
- 🔗 Profil :
- 🏆 Top repositories: • () ⭐ • Forks: —
Perilaku & catatan penting
- Handler berupaya mengekstrak followers/following dari beberapa lokasi struktur hasil scraping (field
profileataustats). Jika angka followers/following tampil 0, penyebab umum:- Versi library
h56-github-scrapperlebih baru/lebih lama yang mengubah struktur output — perbaikan handler membaca dari beberapa kemungkinan key telah ditambahkan. - Rate limit, koneksi, atau perubahan format GitHub dapat memengaruhi scraping.
- Versi library
- Bila avatar (foto profil) tersedia, bot akan mencoba mengunduh dan mengirimkannya sebelum mengirim ringkasan teks.
- Jika scraping gagal (user tidak ditemukan, jaringan, atau parsing error), bot mengirim pesan bantuan/penjelasan (contoh: "Username tidak ditemukan" atau "Masalah koneksi").
- Handler melakukan validasi username (maks 39 karakter, tidak diawali/diakhiri tanda
-, huruf/angka/dash) untuk menghindari request yang jelas invalid.
Instalasi dependensi (minimal untuk fitur .githubsearch)
- Untuk menjalankan fitur .githubsearch saja, pastikan menginstal dependensi berikut di dalam proyek:
-
atau
npm install h56-github-scrapper
npm install axios h56-github-scrapper
- Rekomendasi: apabila menjalankan seluruh bot (seluruh file yang ada di repo), instal dependensi proyek secara penuh:
Catatan:
npm install @whiskeysockets/baileys axios qrcode-terminal pino sharp ffmpeg-static wa-sticker-formatter h56-github-scrapper h56-translator
sharpmemerlukan toolchain native (libvips) — ikuti petunjuk instalasi sharp jika terjadi error pada instalasi.ffmpeg-staticmenyediakan binari ffmpeg; pada beberapa sistem Anda mungkin perlu menginstal ffmpeg secara terpisah.wa-sticker-formatterbersifat opsional; handler stiker memiliki fallback jika library tersebut tidak tersedia.
Konfigurasi / timeout
- Handler menggunakan timeout pendek saat mengunduh avatar (default 12s). Jika lingkungan server lambat, sesuaikan timeout pada pemanggilan axios di file
githubSearch.js. - Jika Anda sering melihat nilai followers/following tidak muncul atau selalu 0, update package
h56-github-scrapperdan pastikan versi yang kompatibel digunakan. Jika perlu, laporkan issue ke repo package tersebut.
Troubleshooting singkat
- Followers/Following selalu muncul 0:
- Pastikan
h56-github-scrapperterinstal dan up-to-date. - Coba jalankan script scraping contoh (lihat dokumentasi package atau contoh CLI) untuk memastikan package mengembalikan
profile.followersdanprofile.following. - Jika paket mengubah shape output, handler dapat diupdate untuk membaca dari
result.profile.followers,result.profile.followers_count,result.stats.followers, atauresult.stats.followers_count. (Handler dalam repo sudah mencoba beberapa key umum.)
- Pastikan
- Avatar tidak dikirim:
- Periksa koneksi internet dan izin outbound dari server (port/akses).
- Periksa error di log; kesalahan unduh avatar tidak menghentikan pengiriman ringkasan teks.
- Error parsing JSON dari
h56-github-scrapper:- Perbarui package; tambahkan logging untuk isi
resultyang dikembalikan untuk diagnostic.
- Perbarui package; tambahkan logging untuk isi
Contoh pesan bantuan yang muncul pada input invalid
- Jika username kosong:
Format: .githubsearch <username> Contoh: .githubsearch torvalds - Jika username tidak valid:
Username GitHub tidak valid. Pastikan hanya menggunakan huruf, angka, dan tanda '-' (tidak diawal/akhir). Contoh: torvalds
Privasi & etika
- Fitur ini melakukan scraping terhadap profil publik GitHub. Pastikan penggunaan mematuhi ketentuan layanan GitHub.
- Hindari penggunaan berulang (mass scraping) yang dapat menyebabkan pemblokiran IP atau tindakan rate-limiting.
Catatan: beberapa perintah hanya dapat dijalankan oleh Owner Utama (nomor yang ditentukan di index.js sebagai OWNER_NUMBER) atau akun terdaftar di config/owners.json.
Perintah: .urltopdf <url> [opsi]
Contoh:
.urltopdf https://example.com.urltopdf https://example.com filename=laporan.pdf format=Letter landscape=true margin=10,10,10,10
Ringkasan
- Mengonversi halaman web (URL) menjadi file PDF lalu mengirimkannya sebagai dokumen lewat WhatsApp.
- Handler ada di
handlers/urlToPdf.js. - Dirancang agar ramah pengguna: memberikan notifikasi start, pengecekan ukuran, dan feedback error yang informatif.
Endpoint API yang digunakan
- Default API endpoint:
https://h56-pdf-tools-api.netlify.app/api/url-to-pdf- Handler mengirim POST JSON berisi:
{ url, filename, format, landscape, margin? } - API diharapkan merespon dengan konten PDF (Content-Type: application/pdf) atau JSON error.
- Timeout permintaan default pada bot: 30 detik (dapat diubah lewat opsi).
- Handler mengirim POST JSON berisi:
Opsi yang didukung pada perintah
filename=<nama.pdf>— Nama file PDF yang akan dikirim (sintaks: tanpa spasi/karakter ilegal; bot akan men-sanitize).format=<A4|Letter|...>— Tipe kertas; defaultA4.landscape=true|false— Orientasi; defaultfalse(portrait).margin=top,right,bottom,left— Margin dalam mm; contoh:margin=10,10,10,10
Alur kerja singkat
- Bot memvalidasi URL (harus
http://atauhttps://). - Bot mengirim permintaan ke API dengan payload sesuai opsi.
- Bot menerima hasil:
- Jika API mengembalikan PDF: bot membaca body sebagai bytes, memeriksa ukuran vs batas upload (default 100 MB), lalu mengirim PDF sebagai dokumen.
- Jika API mengembalikan JSON error atau status non-200: bot menampilkan pesan error yang informatif.
- File sementara disimpan di folder temp yang dikonfigurasi (
os.tmpdir()default) dan dihapus setelah pengiriman.
Batas ukuran & waktu
- Batas upload WhatsApp di-batasi oleh bot ke 100 MB secara default (konfigurasi:
MAX_UPLOAD_SIZEdi handler). - Permintaan ke API diproteksi dengan timeout (default 30s); jika API lambat, perintah akan membatalkan dan memberi tahu pengguna.
Pesan & kesalahan umum
URL tidak valid: URL tidak diawalihttp(s)://.Layanan konversi mengembalikan error: HTTP <kode>: API mengembalikan error HTTP/JSON.File PDF terlalu besar: hasil konversi melebihi batas yang dapat dikirim lewat WhatsApp.Request timeout saat menghubungi layanan konversi PDF.: API tidak merespon dalam batas waktu.
Rekomendasi & operasi lanjutan
- Jika API publik tidak andal, Anda dapat mengganti
API_ENDPOINTpada pemanggilan handler (lihat pemanggilan dariindex.js) atau menjalankan service sendiri yang menerima payload{url, filename, format, landscape, margin}dan mengembalikan PDF bytes. - Untuk server produksi, pastikan service API dapat menangani rendering (headless browser / wkhtmltopdf / puppeteer) dan mengatur limit memory/cpu sesuai kebutuhan.
- Jika ingin menyesuaikan timeout atau ukuran maksimum, ubah opsi yang dikirim ke
urlToPdfHandlerpadaindex.js.
Link cepat
- Untuk daftar dependensi (npm & pip) yang dibutuhkan oleh proyek, lihat: Click here for full dependencies
Root:
- index.js
- File utama yang menginisiasi socket Baileys, registrasi handler, pengaturan command, integrasi modul lain.
- block.js
- Modul untuk persisten blocked-user list, patching updateBlockStatus / updateBlocklist, monkey-patch sendMessage suppression saat reply to blocked user di grup, dan blockManager API.
- Menyimpan data ke: config/blocked-user.json
- mediafire.js
- Handler
.mediafireuntuk mengunduh file MediaFire secara robust, progress, dan penyimpanan sementara di /HASYIM56/mediafire.
- Handler
- qrcode.js
- Utility generateQRCode() dan base64ToBuffer() — memanggil external API dan menyimpan salinan ke /HASYIM56/qrcode.
- realtime-bio.js
- Helper modular untuk update realtime profile status (about). Mengembalikan handle interval dengan .stop().
- tiktok.py / youtube.py
- Skrip Python untuk mengunduh media (yt-dlp) dengan progress structured pada stderr.
- package.json
- Daftar dependency npm & metadata.
- config/ (folder)
- owners.json — daftar owner tambahan (bisa array atau object { owners: [...] })
- access-mode.json — menyimpan "public" / "private"
- blocked-user.json — persistent blocklist (diproduksi oleh block.js)
- autoreact.json — status autoreact
- antidelete.json — status antidelete
- session/ (folder)
- otentikasi multi-file yang digunakan Baileys (dibuat oleh useMultiFileAuthState)
- /HASYIM56 (permanent media folder) — (root path
/HASYIM56, pastikan server mengizinkan)- youtube/ — file hasil unduhan youtube/ttdownload
- qrcode/ — hasil QR code
- mediafire/ — file hasil download mediafire
- audio/ — file audio & voice-note temporer / sample
- sticker/ — temporary / generated sticker files
Penjelasan singkat tiap path:
- index.js: orchestrator utama, attach event listeners, command dispatch, inisialisasi socket.
- block.js: menjaga blocked-user.json, menyediakan API sock.blockManager.* dan integrasi patch pada sock.updateBlockStatus/updateBlocklist.
- mediafire.js: scraping direct-link MediaFire, downloadToFile dengan progress, dan kirim file sebagai document.
- qrcode.js: memanggil API pembuatan QR dan mengembalikan data URL -> buffer.
- realtime-bio.js: modul terpisah agar index.js lebih rapi; mengatur interval update about.
- tiktok.py / youtube.py: skrip Python yang dipanggil oleh index.js untuk mengunduh media; dirancang agar mengeluarkan progress parseable.
- package.json: dependency & script start.
- config/: folder konfigurasi persistent; gunakan untuk pengaturan akses & fitur.
- OWNER_NUMBER (di index.js) — ubah sesuai nomor owner utama Anda (format international, contoh: 6281234567890)
- owners.json — tambahkan owner tambahan atau gunakan default.
- access-mode.json — mode operasi bot: "public" atau "private"
- autoreact.json — enable/disable auto-react
- antidelete.json — enable/disable antidelete
- blocked-user.json — dikelola oleh block.js, berisi list JID yang diblokir persistently
- session/ — kredensial Baileys
Tanggal perbaikan: 2026-02-02
Perbaikan pada proses load auth / session (useMultiFileAuthState) yang ditambahkan untuk mencegah akumulasi sesi lama, race condition pada startup, dan potensi memory/delay ketika bot dinyalakan kembali setelah lama tidak aktif.
Ringkasan singkat
- Tujuan perbaikan: mengurangi gangguan startup, mencegah instance ganda menimpa satu session, menghindari pemuatan kredensial/usang yang menyebabkan timeout atau perilaku tak terduga, serta menyediakan mekanisme operasional untuk arsip/restore session.
- Pendekatan: mekanisme lock file, deteksi sesi stale (berdasarkan last-modified), archival otomatis ke folder session_archives, dan pembersihan/penyelesaian lock saat proses keluar (SIGINT/SIGTERM/beforeExit).
Apa yang berubah (teknis, singkat)
- .session-lock.json
- Saat bot memulai, ia akan mencoba memperoleh lock file di folder session.
- Lock menyimpan pid lokal, timestamp mulai, dan versi node untuk diagnosa.
- Jika lock sedang dipegang oleh proses yang hidup → startup baru akan gagal cepat (fail-fast) dan memberikan pesan jelas ke operator.
- Jika lock ditemukan stale (PID mati atau terlalu tua berdasarkan TTL), lock otomatis dibersihkan dan startup melanjutkan.
- Archival session lama
- Jika isi folder session belum dimodifikasi lebih dari batas TTL default (7 hari), folder session akan diarsipkan ke folder session_archives/session_YYYY-MM-DD_HH-MM-SS_xxx.
- Arsip dilakukan dengan rename (jika memungkinkan) atau copy+remove (fallback untuk cross-device filesystem).
- Setelah arsip dibuat, folder session baru kosong dibuat sehingga proses auth baru (scan QR) dapat berjalan bersih.
- Flush dan release lock saat proses keluar
- Pada SIGINT/SIGTERM/beforeExit bot akan mencoba flush credentials (saveCreds) dan melepaskan session lock.
- Tujuannya mencegah orphan lock yang memblokir restart.
Nilai default (lokal di kode)
- SESSION_MAX_AGE_MS = 7 hari (sesi lama diarsipkan apabila folder session tidak berubah selama 7 hari)
- SESSION_LOCK_TTL_MS = 1 hari (lock lebih tua dianggap stale)
- Lokasi arsip: session_archives berada satu level di luar folder session (contoh: jika session = ./session, arsip = ./session_archives)
- Lock file: .session-lock.json di dalam folder session
Operasional / Cara kerja (lebih rinci)
- Saat start:
- Bot mencoba acquireSessionLock():
- Jika lock tidak ada → buat lock berisi { pid, startedAt, nodeVersion }.
- Jika lock ada: periksa apakah PID hidup. Jika hidup dan usianya < TTL → startup gagal (log & exit).
- Jika pid mati atau lock terlalu tua → hapus lock dan coba akuisisi lagi.
- Bot mencoba acquireSessionLock():
- Setelah lock diperoleh:
- Cek last modification time pada file di folder session.
- Jika tidak ada file (session baru) → lanjut normal.
- Jika ada dan usianya > SESSION_MAX_AGE_MS → pindahkan keseluruhan folder ke session_archives dan buat folder session kosong baru.
- Panggil useMultiFileAuthState(SESSION_FOLDER) seperti sebelumnya untuk melanjutkan authentication.
- Saat proses menerima SIGINT/SIGTERM/beforeExit → bot memanggil saveCreds() (best-effort) lalu melepaskan lock file.
Manfaat praktis
- Startup cepat dan deterministik: tidak akan mencoba memuat kredensial session yang sudah rusak/usang yang menyebabkan timeouts.
- Mencegah multiple instances: lock file meminimalkan resiko dua proses mengakses session yang sama secara bersamaan.
- Audit & rollback: sesi lama tidak dihapus, melainkan diarsipkan sehingga operator masih bisa memulihkan bila perlu.
- Fail-fast ketika ada instance lain aktif: membantu operator mengetahui jika ada proses lain masih berjalan (lebih baik daripada menghadapi hangs/kesalahan tak jelas).
Instruksi Operasional (operator)
- Jika saat start muncul pesan lock (Unable to acquire session lock):
- Pemeriksaan cepat:
- cek apakah ada proses bot lain berjalan (ps aux | grep node atau systemd service).
- jika tidak ada, periksa file .session-lock.json di folder session dan lihat pid/timestamp.
- Manual recovery:
- Hapus file .session-lock.json jika yakin tidak ada instance lain; atau
- Jika sesi lama ingin dipaksa di-archive, jalankan:
- mv session session_manual_archive_YYYYMMDD && mkdir session
- Pemeriksaan cepat:
- Melakukan restore session lama:
- Jika Anda perlu mengembalikan arsip session (mis. untuk memulihkan auth lama), copy folder yang diarsipkan kembali ke lokasi session (pastikan tidak ada lock aktif).
- Mengubah TTL / policy:
- Kode default mengatur 7 hari / 1 hari TTL. Jika ingin konfigurasi dinamis, disarankan menambahkan file konfigurasi baru (contoh: config/session.json) dan menyesuaikan kode loadAuthState untuk membaca nilai-nilai tersebut.
Troubleshooting umum terkait sesi
- "Startup gagal: lock held by pid XXX" — pastikan tidak ada proses lain, atau jika proses itu tidak valid, hapus .session-lock.json secara manual.
- "Scan QR lagi diperlukan setelah upgrade" — ini normal jika folder session di-arsipkan (mis. lama/usang). Lakukan scan QR pada terminal untuk mengautentikasi kembali.
- "Sesi diarsipkan otomatis" — periksa folder session_archives/ untuk menemukan salinan lama. File tidak dihapus agar operator bisa audit/restore.
- "Lock tidak hilang setelah crash" — proses crash mungkin meninggalkan lock. Hapus .session-lock.json secara manual jika yakin tidak ada instance berjalan.
Rekomendasi best-practices
- Jalankan bot dengan tooling process manager (systemd / pm2 / docker) sehingga exit signals ditangani dengan rapi dan restart tidak mewariskan lock/partial state.
- Tetapkan cron housekeeping untuk memonitor folder session_archives (rotasi/pembersihan arsip usia > X hari) agar disk tidak terisi.
- Simpan konfigurasi TTL di config/session.json jika Anda perlu behavior berbeda di lingkungan dev vs prod.
Catatan keamanan & privacy
- Arsip session mengandung file authentication Baileys (credentials). Pastikan arsip disimpan di lokasi yang aman dan akses dibatasi.
- Jangan unggah session_archives ke layanan publik tanpa sanitasi.
- Jika ingin aman benar, hapus arsip yang tidak diperlukan atau simpan backup terenkripsi.
Contoh pesan operator saat encountering lock (yang kini lebih informatif)
- "[SESSION] Lock held by pid 12345 (age 3600s). Another instance likely running. If no instance, remove ./session/.session-lock.json and restart."
- "[SESSION] Archived stale session to ./session_archives/session_2026-02-02T12-00-00-abc123 — scan QR to re-auth."
Catatan pengembang
- Perubahan implementasi dibuat non-intrusive: logika command/event tidak diubah. Hanya bagian loadAuthState / main yang ditingkatkan agar startup lebih aman dan dapat dioperasikan.
- Jika Anda ingin, saya dapat menambahkan:
- command admin untuk
!session status,!session unlock, dan!session archive(hanya Owner Utama). - pembacaan TTL/paths dari config/session.json.
- unit test kecil untuk skenario lock/archival pada environment CI.
- command admin untuk
Dengan tambahan dokumentasi ini, operator dan tim dev akan memiliki panduan jelas tentang bagaimana session/auth dikelola dan langkah apa yang harus diambil ketika mendapati masalah startup terkait session.
-
Start bot:
npm start
Scan QR yang ditampilkan pada terminal.
-
Contoh: Terjemah
.translate en Halo duniaBot akan menerjemahkan "Halo dunia" ke Bahasa Inggris. (Fitur utama:
.translate) -
Contoh: Download YouTube (private chat)
.ytmp4 https://www.youtube.com/watch?v=XXXX 720p -
Contoh: Convert audio to VN:
- Reply audio message dengan caption:
.audiotovn
- Reply audio message dengan caption:
-
Contoh: Recover view-once
- Reply pesan view-once dengan caption:
.viewonce
- Reply pesan view-once dengan caption:
-
Contoh: Toggle auto-react (Owner Utama)
.autoreact off .autoreact on -
Contoh: Block nomor (Owner Utama)
- Reply pesan user with
.blockatau.block 0812345...
- Reply pesan user with
- Beberapa fitur (mis. .spamreport, .spam, .spamreport) dapat disalahgunakan. Gunakan hanya untuk tujuan pengujian yang etis dan patuhi kebijakan platform.
- Jangan membagikan folder
session/atau file kredensial. - Pastikan bot dijalankan di lingkungan aman; file media besar dapat mengisi disk — siapkan rotasi & pembersihan.
- Hati-hati menggunakan fitur auto-block untuk panggilan masuk; owner harus dikecualikan.
- Jika ffmpeg tidak ditemukan: pastikan ffmpeg terinstal system-wide atau PATH mengarah ke binary.
- Error saat yt-dlp: pastikan
yt-dlpterinstal di Python environment yang dipanggil (pythondi PATH). - Permission denied saat menyimpan ke /HASYIM56: jalankan bot dengan hak akses yang tepat atau ubah path ke folder yang dapat ditulis.
- Jika Baileys mengeluarkan error auth: hapus folder
session/dan scan ulang QR.
Project ini dilisensikan di bawah MIT License — lihat file LICENSE di repo.
Terima kasih telah menggunakan Bot Whatsapp Translator. Untuk kontribusi, issues, atau pull-request, silakan kunjungi: https://github.com/HASYIM56/bot-translator
Jika Anda butuh dokumentasi lebih mendalam (contoh konfigurasi owners.json, penjelasan environment variables, atau Dockerfile/Compose), saya bisa bantu membuatkan tambahan tersebut.
Catatan: bagian ini menambah dokumentasi teknis khusus untuk perintah .translate. Semua fitur dan teks di dokumen utama tidak diubah.
Perintah .translate menerjemahkan teks yang diberikan ke bahasa target. Handler menggunakan modul h56-translator (diekspos sebagai translate) bersama fallback internal pada daftar bahasa (TRANSLATE_LANGUAGES). Handler bersifat robust terhadap beberapa bentuk respons dari layanan penerjemah dan memberikan pesan kesalahan yang ramah pengguna jika terjadi masalah.
- Pemanggilan:
.translate <kode_target> <teks> - Contoh:
.translate en Halo dunia.translate list— menampilkan daftar bahasa yang didukung
- Perintah tunduk pada mekanisme BOT_ACCESS_MODE yang diterapkan di handler utama (mode
privateakan membatasi pengguna yang dapat memanggil). - Perintah tidak dibatasi hanya untuk owner; siapa pun dapat memanggil selama mode akses mengizinkan.
Berikut adalah tabel ringkasan fungsi dan langkah-langkah yang terjadi ketika perintah .translate dipanggil. Kolom menjelaskan lokasi/komponen, tujuan, input, output, dan catatan kesalahan/fallback.
| Langkah | Fungsi / Lokasi (file) | Tujuan | Input | Output | Catatan / Error handling |
|---|---|---|---|---|---|
| 1 | messages.upsert handler (index.js) | Deteksi perintah dan ekstraksi argumen | pesan teks utuh (dari user) | args, cmd, target, textToTranslate |
Mengabaikan bila BOT_ACCESS_MODE == "private" dan pengirim bukan main owner / fromMe |
| 2 | Validasi argumen (index.js) | Pastikan ada kode target dan teks | args array |
validasi pass/fail | Jika args.length < 3 -> kirim panduan penggunaan |
| 3 | .translate list branch (index.js) | Kirim daftar bahasa | cmd .translate list |
daftar bahasa (dari h56SupportedLanguages atau TRANSLATE_LANGUAGES) | Jika modul h56-translator menyediakan list, gunakan; jika gagal, gunakan peta fallback |
| 4 | Notify user (index.js) | Informasikan proses penerjemahan sedang berlangsung | — | kirim pesan "⏳ Sedang menerjemahkan, mohon tunggu..." | Non-blocking, memberi umpan balik UX |
| 5 | Panggil layanan penerjemah (h56-translator) | Lakukan terjemahan sebenarnya | textToTranslate, target |
result (bisa string atau object) |
Bungkus panggilan dengan try/catch; bila error -> kirim pesan kesalahan yang ramah |
| 6 | Normalisasi hasil (index.js) | Ekstrak translatedText, sourceLang, targetLang dari result |
result |
translatedText, sourceLang, targetLang |
Mendukung banyak bentuk respons: string, {translatedText}, {data:{translatedText}}, {translation}, dsb. |
| 7 | Service status check (index.js) | Tangani error service (jika ada) | result.serviceStatus atau result.raw.serviceStatus |
Kirim pesan error yang sesuai | Jika serviceStatus === "error" -> saring error dan kirim pesan yang relevan ke user |
| 8 | Compose reply (index.js) | Buat pesan akhir dengan info sumber & target | translatedText, sourceLang, targetLang |
teks balasan | Mencari nama bahasa menggunakan h56SupportedLanguages atau map TRANSLATE_LANGUAGES untuk tampilan lebih ramah |
| 9 | Kirim hasil (index.js) | Kirim hasil terjemahan ke chat | from, translatedText, metadata |
sock.sendMessage(from, { text }) |
Meng-quote pesan asli jika tersedia |
| 10 | Fallback dan error reporting | Menangani kegagalan tak terduga | exceptions dari pemanggilan library | pesan error ramah ke user; log server | Menangkap network/library errors dan menginformasikan user untuk mencoba lagi nanti |
- Pesan masuk diproses di event
messages.upsert(typenotify). Jika pesan sesuai pola.translate ..., handler mengekstrak target bahasa dan teks sumber. - Jika argumen tidak lengkap, bot membalas dengan panduan penggunaan:
.translate <kode_target> <teks>dan contoh. - Jika sub-argumen
listdiminta, bot mencoba menggunakanh56SupportedLanguagesdari modulh56-translator. Bila tidak tersedia, fallback ke konstantaTRANSLATE_LANGUAGES. - Bot mengirim pemberitahuan sementara "⏳ Sedang menerjemahkan, mohon tunggu..." untuk memberi respons cepat ke pengguna.
- Bot memanggil fungsi
h56Translate(textToTranslate, target). Pemanggilan ini dibungkus dengan try/catch. Jika pemanggilan gagal (mis. network error), bot mengirim pesan error informatif. - Hasil dari
h56Translatedapat berupa:- string: langsung dianggap teks terjemahan;
- object dengan properti
translatedText; - object kompleks dengan nested
data.translatedTextatautranslation. Handler melakukan ekstraksi fleksibel untuk mendukung banyak bentuk respons.
- Jika respons memiliki status layanan
serviceStatus === "error", handler membacaresult.errordan mengirim pesan yang menyatakan kode dan pesan error layanan. - Jika berhasil, handler menyusun pesan final yang menampilkan bahasa sumber (jika tersedia) beserta nama bahasa (jika dapat ditemukan), bahasa target, dan teks terjemahan.
- Hasil dikirim ke chat yang sama, biasanya dengan
{ quoted: msg }sehingga pengguna melihat konteks. - Semua error ditangani secara ramah: log di server untuk debugging, sementara pengguna mendapatkan pesan singkat dan disarankan untuk mencoba lagi nanti.
- Permintaan:
.translate en Halo dunia - Contoh respons sukses (teks):
🌐 Translate Result From: auto — Indonesian To: en — English Hello world - Contoh respons error layanan:
❌ Translate service error: (quota_exceeded) Batas harian terlampaui. - Contoh respons kegagalan panggilan:
❌ Terjadi kesalahan saat menerjemahkan: network error / service unavailable
- Jika
h56SupportedLanguagestersedia, itu dipakai untuk validasi; jika tidak,TRANSLATE_LANGUAGESlokal berfungsi sebagai fallback. - Jika
h56Translatemengembalikan struktur tak terduga, handler:- mencoba beberapa jalur ekstraksi (
translatedText,data.translatedText,translation, result string), - bila tidak menemukan teks, menginformasikan user bahwa terjemahan gagal.
- mencoba beberapa jalur ekstraksi (
- Jika target bahasa tidak dikenal, bot akan menyarankan
.translate list. - Handler memperlakukan empty/whitespace teks sebagai input invalid dan mengembalikan panduan penggunaan.
- Semua panggilan jaringan dibungkus di try/catch supaya tidak crash; pesan error yang dikirim ke user ringkas dan sopan.
- Pastikan paket
h56-translatorterpasang dan dapat mengakses layanan eksternal jika diperlukan. - Untuk pengalaman terbaik, gunakan
.translate listpada saat pertama kali untuk melihat kode bahasa yang didukung. - Dalam mode
private, hanya Owner Utama (atau akun yang sesuai) yang dapat memanggil perintah jika BOT_ACCESS_MODE di-set keprivate.