██╗ ██╗ █████╗ ████████╗████████╗██████╗ ██████╗ ██╗
██║ ██║██╔══██╗╚══██╔══╝╚══██╔══╝██╔══██╗██╔══██╗██║
██║ █╗ ██║███████║ ██║ ██║ ██████╔╝██║ ██║██║
██║███╗██║██╔══██║ ██║ ██║ ██╔═══╝ ██║ ██║██║
╚███╔███╔╝██║ ██║ ██║ ██║ ██║ ██████╔╝███████╗
╚══╝╚══╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝
📖 Wattpad Story Downloader
Simpan cerita favoritmu jadi file .txt atau .docx, lengkap atau per chapter, secara offline.
✨ Tentang Project
WattPDL adalah script Python ringan yang mengunduh chapter dari cerita Wattpad pilihanmu, lalu menyimpannya sebagai file .txt atau dokumen Word .docx yang bersih dan rapi. Kamu bisa unduh seluruh cerita jadi satu file, semua chapter terpisah dalam satu .zip, atau cukup chapter tertentu yang kamu pilih sendiri. Tidak perlu login, tidak perlu API key, cukup link atau ID ceritanya.
"Karena cerita yang bagus layak dibaca kapan saja, bahkan tanpa internet."
🎯 Fitur
| Fitur | Keterangan |
|---|---|
| 🎨 Tampilan CLI rapi | Panel, tabel info cerita, dan warna berkat library rich |
| 🧩 4 mode unduh | Semua jadi 1 file, semua terpisah dalam .zip, pilih beberapa chapter, atau cukup 1 chapter |
| 📄 2 pilihan format | Simpan sebagai .txt polos atau dokumen Word .docx |
| 📁 Pilih folder simpan | Default ke folder Downloads sistem, bisa dikustomisasi |
| 🔄 Auto-retry | Chapter gagal dicoba ulang hingga 3× sebelum dilewati |
| 📊 Progress bar animasi | Spinner, persentase, jumlah chapter, dan estimasi waktu tersisa |
| 📋 Ringkasan akhir | Panel laporan chapter yang gagal (jika ada) setelah selesai |
| 🗂 Nama file aman | Karakter ilegal otomatis dihapus dari nama file |
| 🔗 Link sumber tersimpan | URL cerita dicantumkan di header file hasil |
| ⚡ Tanpa login | Pakai endpoint publik Wattpad, jadi tidak butuh akun |
| ↻ Resume otomatis | Kalau proses terhenti di tengah jalan, jalankan ulang cerita yang sama — chapter yang sudah berhasil tidak diunduh ulang |
| ⚙️ Ingat preferensi | Folder simpan & format file terakhir otomatis dipakai lagi di sesi berikutnya |
| 🤖 Mode non-interaktif | Bisa dijalankan lewat argumen command line untuk scripting/otomatisasi, tanpa perlu jawab prompt |
📦 Requirements
- Python 3.9 atau lebih baru
- Koneksi internet
- Library:
requests,rich,python-docx— otomatis terinstall barengwattpdl, tidak perlu diinstall manual
Belum pernah pakai terminal? Ikuti ini dulu
🪟 Cara buka terminal di Windows
- Tekan tombol Windows, ketik
PowerShell, lalu tekan Enter - Jendela hitam/biru akan terbuka. Itu tempat kamu mengetik perintah
- Semua perintah
python ...ataupip ...di panduan ini diketik di jendela itu, lalu tekan Enter
🍎 Cara buka terminal di macOS
- Tekan Cmd + Spasi, ketik
Terminal, lalu tekan Enter - Ketik perintah-perintah di panduan ini di situ, lalu tekan Enter
🐧 Cara buka terminal di Linux
Tekan Ctrl + Alt + T, atau cari aplikasi "Terminal" di menu aplikasi.
Belum punya Python?
- Buka python.org/downloads dan unduh versi terbaru
- Khusus Windows: saat instalasi, centang dulu kotak "Add Python to PATH" di layar pertama sebelum klik Install. Kalau ini kelewat, perintah
pythonnanti tidak akan dikenali - Setelah selesai install, buka terminal (lihat panduan di atas) lalu cek dengan:
python --version
# atau
python3 --version
Kalau muncul angka versi (misal Python 3.12.1), berarti sudah siap.
🚀 Instalasi
Cara A: Install dari PyPI (paling gampang)
pip install wattpdl
Kalau
piptidak dikenali, coba:python -m pip install wattpdl
Kalau muncul error
externally-managed-environment(biasanya di Linux):pip install wattpdl --break-system-packages
Setelah terinstall, command wattpdl langsung bisa dipakai dari terminal mana saja — lanjut ke bagian Cara Pakai.
Cara B: Install dari source (untuk development / mau lihat/ubah kode)
1. Ambil kode project ini
Punya Git terinstall
git clone https://github.com/nekonaru/wattpdl.git
cd wattpdl
Tidak punya Git
- Buka halaman repository di GitHub
- Klik tombol hijau
Code→ pilihDownload ZIP - Ekstrak file ZIP yang terunduh ke folder pilihanmu
- Di terminal, masuk ke folder hasil ekstrak, contoh:
cd Downloads/wattpdl-main
2. Install dalam mode "editable"
pip install -e .
Sama seperti Cara A, tambahkan
--break-system-packagesdi akhir kalau muncul errorexternally-managed-environment.
Ini juga mendaftarkan command wattpdl, tapi mengambil kodenya langsung dari folder ini — cocok kalau kamu mau modifikasi kode dan langsung lihat hasilnya tanpa install ulang.
🖥️ Cara Pakai
Jalankan:
wattpdl
Kalau kamu install dari source tanpa
pip install -e ., jalankan lewatpython -m wattpdldari dalam foldersrc/— tapi cara Editable Install di atas lebih direkomendasikan.
Masukkan link atau ID cerita saat diminta:
Link atau ID cerita Wattpad: https://www.wattpad.com/story/123456789-judul-cerita
atau cukup ID-nya:
Link atau ID cerita Wattpad: 123456789
Pilih mode unduh:
1 Semua chapter → 1 file gabungan
2 Semua chapter → file terpisah per chapter, dikemas .zip
3 Pilih beberapa chapter → 1 file gabungan
4 Pilih 1 chapter saja
Pilih mode [1/2/3/4] (1):
- Mode 1: cara paling umum, seluruh cerita jadi satu file rapi dari chapter pertama sampai terakhir
- Mode 2: cocok kalau mau baca per chapter terpisah, hasilnya satu
.zipberisi file per chapter - Mode 3: muncul daftar semua judul chapter bernomor, lalu ketik nomor yang mau diunduh, bisa gabung koma dan rentang, contoh:
1,3,5-8 - Mode 4: muncul daftar semua judul chapter, ketik satu nomor untuk unduh chapter itu saja
Pilih format file:
1 Teks polos (.txt)
2 Dokumen Word (.docx)
Pilih format file [1/2] (1):
Pilih folder penyimpanan:
Folder default: C:\Users\user\Downloads
Tekan Enter untuk pakai folder itu, atau ketik path lain:
Tekan Enter untuk simpan di Downloads, atau ketik path kustom seperti:
- Windows:
D:\Cerita\Wattpad - Linux/macOS:
/home/user/cerita
Tunggu proses selesai:
⠋ Chapter 24... ████████████████░░░░░░░░░░░░░░ 53.3% 24/45 0:00:12 sisa 0:00:11
Done! 🎉
╔══════ 🎉 Berhasil! Semua chapter tersimpan ══════╗
║ 📁 File tersimpan di C:\Users\user\Downloads\Judul_Cerita.txt ║
║ ✅ Berhasil 45/45 ║
║ ⏱️ Waktu total 2m 18d ║
╚═══════════════════════════════════════════════════╝
↻ Resume Otomatis
Kalau proses unduh terhenti di tengah jalan (koneksi putus, terminal ditutup, laptop mati), setiap chapter yang sudah berhasil diunduh tersimpan otomatis di ~/.wattpdl/progress/<id_cerita>.json.
Jalankan lagi dengan cerita yang sama (ID/link sama), dan WattPDL akan:
- Melewati chapter yang sudah berhasil (dipakai dari cache, tidak fetch ulang)
- Hanya mengunduh chapter yang belum berhasil / gagal sebelumnya
File progress otomatis dihapus setelah semua chapter berhasil diunduh dalam satu sesi. Kalau mau paksa unduh ulang dari awal, hapus manual folder ~/.wattpdl/progress/.
⚙️ Preferensi Tersimpan
Folder simpan dan format file terakhir yang kamu pilih otomatis tersimpan di ~/.wattpdl/config.json, dan dipakai lagi sebagai default di sesi berikutnya — gak perlu isi ulang tiap kali jalanin script.
🤖 Mode Non-Interaktif (Scripting/Otomatisasi)
Selain mode tanya-jawab, WattPDL juga bisa dijalankan lewat argumen command line — cocok buat dijadwalkan (cron/Task Scheduler) atau dipanggil dari script lain.
wattpdl --id 398440633 --mode 1 --format docx
Argumen yang tersedia:
| Argumen | Keterangan |
|---|---|
--id |
ID atau link cerita Wattpad. Mengisi ini mengaktifkan mode non-interaktif. |
--mode {1,2,3,4} |
1 = semua jadi 1 file, 2 = semua terpisah .zip, 3 = pilih beberapa chapter, 4 = pilih 1 chapter |
--format {txt,docx} |
Format file output. Default: dari config tersimpan, atau txt |
--chapters |
Nomor chapter untuk --mode 3, contoh: 1,3,5-8 |
--chapter |
Nomor chapter untuk --mode 4, contoh: 5 |
--output-dir |
Folder penyimpanan custom. Default: dari config tersimpan, atau folder Downloads |
Contoh lain:
# Unduh semua chapter sebagai .zip terpisah
wattpdl --id 398440633 --mode 2 --format txt
# Unduh chapter 1, 3, dan 5-8 saja, jadi 1 file gabungan
wattpdl --id 398440633 --mode 3 --chapters 1,3,5-8 --format docx
# Unduh chapter 10 saja, simpan ke folder custom
wattpdl --id 398440633 --mode 4 --chapter 10 --output-dir "D:\Cerita Wattpad"
# Lihat semua opsi
wattpdl --help
📂 Struktur Output
Nama dan bentuk file yang dihasilkan tergantung mode & format yang kamu pilih:
| Mode | Format .txt |
Format .docx |
|---|---|---|
| 1 - Semua, gabungan | Judul_Cerita.txt |
Judul_Cerita.docx |
| 2 - Semua, terpisah | Judul_Cerita.zip (isi: .txt per chapter) |
Judul_Cerita.zip (isi: .docx per chapter) |
| 3 - Beberapa chapter | Judul_Cerita_pilihan.txt |
Judul_Cerita_pilihan.docx |
| 4 - Satu chapter | Judul_Cerita_Ch003_Nama_Chapter.txt |
Judul_Cerita_Ch003_Nama_Chapter.docx |
Isi file gabungan (mode 1 & 3): judul cerita, penulis, dan sumber di bagian atas, lalu tiap chapter dipisah dengan penanda #####.
Judul Cerita
oleh Nama Penulis
Sumber : https://www.wattpad.com/story/123456789
==================================================
##### Judul Chapter 1 #####
Isi teks chapter 1...
##### Judul Chapter 2 #####
Isi teks chapter 2...
Di versi .docx, judul cerita jadi heading utama dan tiap chapter otomatis jadi Heading 1 dengan halaman baru, tinggal buka di Word atau Google Docs dan langsung enak dibaca.
Isi zip (mode 2): satu file per chapter, bernomor urut sesuai posisi di cerita, plus 000_info.txt/000_info.docx berisi judul, penulis, dan sumber. Ekstensi file di dalam zip mengikuti format yang dipilih saat menjalankan script (.txt atau .docx):
Judul_Cerita.zip
├── 000_info.txt
├── 001_Judul_Chapter_1.txt
├── 002_Judul_Chapter_2.txt
└── ...
🗺️ Default Folder per OS
| Sistem Operasi | Folder Default |
|---|---|
| 🪟 Windows | C:\Users\<namauser>\Downloads |
| 🍎 macOS | /Users/<namauser>/Downloads |
| 🐧 Linux | /home/<namauser>/Downloads |
⚠️ Troubleshooting
| Masalah | Solusi |
|---|---|
ModuleNotFoundError: No module named 'requests' |
Jalankan pip install requests |
ModuleNotFoundError: No module named 'rich' |
Jalankan pip install rich |
Library 'python-docx' belum terinstall |
Jalankan pip install python-docx (cuma dibutuhkan kalau memilih format .docx) |
Error 404 / "Tidak ada chapter ditemukan" |
Pastikan ID/link benar & cerita tidak di-private |
| Folder tidak bisa dibuat | Cek path valid & kamu punya izin tulis di sana |
| Proses macet di satu chapter | Cek koneksi internet, jalankan ulang, progress akan lanjut |
📝 Catatan Penting
- ID cerita adalah angka di URL Wattpad, tepat setelah
/story/ - Script memakai endpoint publik, tidak butuh login atau API key
- Jeda 0.5 detik antar chapter sudah diatur untuk menghindari rate limit server, jangan dihapus
- Script ini hanya untuk membaca cerita milik sendiri atau cerita publik secara offline. Hormati hak cipta penulis
🛠️ Dibuat dengan
🗂️ Struktur Project
wattpdl/
├── src/
│ └── wattpdl/
│ ├── __init__.py # metadata package (__version__)
│ ├── __main__.py # entry untuk `python -m wattpdl`
│ ├── app.py # orkestrasi alur program (main())
│ ├── api.py # komunikasi ke Wattpad public API
│ ├── writers.py # konversi teks & penulisan file .txt/.docx/.zip
│ ├── cli.py # tampilan terminal (rich), interaksi dengan user
│ ├── cli_args.py # parsing argumen untuk mode non-interaktif
│ ├── config.py # simpan preferensi user (folder simpan, format)
│ └── progress.py # cache progress unduhan untuk fitur resume
├── requirements.txt # daftar dependency (untuk referensi manual)
├── pyproject.toml # metadata package + build config + ruff
├── tests/
│ ├── __init__.py
│ └── test_wattpdl.py # unit test (pytest)
├── .github/
│ └── workflows/
│ ├── tests.yml # CI: test, lint, & build check otomatis
│ └── publish.yml # auto-publish ke PyPI saat rilis baru
├── CONTRIBUTING.md # panduan kontribusi
├── LICENSE
└── README.md
Prinsip pemisahan modul:
api.py— tidak tahu apa-apa soal tampilan (rich), murni fetch datawriters.py— tidak melakukan request jaringan, murni konversi & tulis filecli.py— semua interaksi dengan user & tampilan progress barcli_args.py— parsing & validasi argumen command line, tidak ada logika bisnisconfig.py/progress.py— baca-tulis file JSON di~/.wattpdl/, tidak tahu soal CLI atau jaringanapp.py— menyatukan semuanya, tanpa logika bisnis sendiri (dipanggil lewat commandwattpdlsetelah install)
🧪 Testing
Ada unit test untuk fungsi-fungsi inti (parsing ID cerita, validasi nama file, parsing pilihan chapter, konversi HTML ke teks, config, progress/resume, parsing argumen CLI, dll).
pip install -e .[dev]
pytest tests/ -v
ruff check .
🤝 Kontribusi
Mau bantu kembangin WattPDL? Baca CONTRIBUTING.md untuk struktur project dan alur kontribusi.
❓ FAQ
Apakah ini legal / aman dipakai?
Script ini memakai endpoint publik Wattpad yang sama seperti saat kamu baca cerita lewat browser, jadi tidak meng-hack apa pun. Tapi gunakan secara bertanggung jawab: unduh untuk bacaan pribadi/offline, dan hormati hak cipta penulis. Jangan sebar ulang atau jual isi cerita orang lain.
Apakah butuh akun Wattpad?
Tidak. Tidak perlu login atau API key sama sekali.
Cerita private / dihapus, bisa diunduh?
Tidak. Script hanya bisa mengakses cerita yang memang publik.
Prosesnya lama, kenapa?
Ada jeda 0.5 detik antar chapter (sengaja, biar tidak membebani server Wattpad). Untuk cerita ratusan chapter, wajar kalau prosesnya makan waktu beberapa menit.
Mode dan format mana yang sebaiknya dipilih?
- Mau baca dari awal sampai akhir kayak buku → Mode 1, format
.txtatau.docxsama-sama enak - Mau tiap chapter jadi file sendiri-sendiri → Mode 2
- Cuma butuh beberapa chapter tertentu (misal lagi ulang baca bagian tertentu) → Mode 3
- Cuma penasaran satu chapter → Mode 4
- Mau edit atau print rapi pakai Word → pilih format
.docx - Mau file kecil dan simpel, atau mau dibaca di aplikasi e-reader/notes → pilih format
.txt
👤 Author
| Nicolas Dwi Dharma |
| github.com/nekonaru |
📄 License
Distributed under the MIT License. See LICENSE for more information.
Made with by Nicolas Dwi Dharma
Star ⭐ repo ini kalau project ini membantumu!
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file wattpdl-1.0.0.tar.gz.
File metadata
- Download URL: wattpdl-1.0.0.tar.gz
- Upload date:
- Size: 27.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
56590727f22995424e0031f1b609cc00a452a7b6a6d29944e4290071b7522596
|
|
| MD5 |
ef77b2974d43066d57000e7fb1ef6b5a
|
|
| BLAKE2b-256 |
7c7d0ca7d3cbb0bbd043a24bbee1259bd7fb36b7fe1d71ccc1b80377e68f1596
|
Provenance
The following attestation bundles were made for wattpdl-1.0.0.tar.gz:
Publisher:
publish.yml on nekonaru/wattpdl
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
wattpdl-1.0.0.tar.gz -
Subject digest:
56590727f22995424e0031f1b609cc00a452a7b6a6d29944e4290071b7522596 - Sigstore transparency entry: 2353041533
- Sigstore integration time:
-
Permalink:
nekonaru/wattpdl@95d01bc35a28679a3b02c2f85b8ac1f0814fe2a5 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/nekonaru
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@95d01bc35a28679a3b02c2f85b8ac1f0814fe2a5 -
Trigger Event:
release
-
Statement type:
File details
Details for the file wattpdl-1.0.0-py3-none-any.whl.
File metadata
- Download URL: wattpdl-1.0.0-py3-none-any.whl
- Upload date:
- Size: 21.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ec8dae3f7e00144d18f3c26fb8f0cc61872822ef97560a5c4c0026e70f1131e8
|
|
| MD5 |
ccff64d335d722de73e7b5179268cbc9
|
|
| BLAKE2b-256 |
77adf1d38e9af65bbb0b86a0558c7890b7de97bde280eb510d7f97376c735b09
|
Provenance
The following attestation bundles were made for wattpdl-1.0.0-py3-none-any.whl:
Publisher:
publish.yml on nekonaru/wattpdl
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
wattpdl-1.0.0-py3-none-any.whl -
Subject digest:
ec8dae3f7e00144d18f3c26fb8f0cc61872822ef97560a5c4c0026e70f1131e8 - Sigstore transparency entry: 2353041724
- Sigstore integration time:
-
Permalink:
nekonaru/wattpdl@95d01bc35a28679a3b02c2f85b8ac1f0814fe2a5 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/nekonaru
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@95d01bc35a28679a3b02c2f85b8ac1f0814fe2a5 -
Trigger Event:
release
-
Statement type: