Novel downloader with Cloudflare bypass using undetected-chromedriver.
- ✅ Cloudflare Bypass - Automatically bypasses Cloudflare protection
- ✅ Modern GUI - Beautiful PyQt5 dark-themed interface
- ✅ Plugin Architecture - Easy to add support for new novel sites
- ✅ Session Management - Saves login sessions for reuse
- 🎨 Modern Dark Theme - Sleek Catppuccin Mocha color scheme
- 🔍 Novel Search - Search and browse novels with detailed results
- 📖 Novel Details - View cover, description, rating, genres, and chapter list
- 📥 Smart Downloads - Download with progress tracking, pause/resume, and retry logic
- 📁 Custom Output - Choose where to save your downloaded novels
- 🔐 Optional Login - Auto-hides login for sites that don't require it
- 📚 Rich Metadata - Includes title, author, description, and genres
- 🖼️ Cover Images - Automatically downloads and embeds cover art
- 📑 Table of Contents - Proper chapter navigation
- 🎯 Clean Content - Removes ads and unwanted text
pip install -r requirements.txtThe script uses undetected-chromedriver which makes Chrome undetectable to anti-bot systems like Cloudflare. It will:
- Launch Chrome with anti-detection
- Navigate to the login page
- Auto-solve any Cloudflare challenges
- Log you in
- Save your session to
selenium_session.pkl
After the first successful login, your session is saved to selenium_session.pkl. You can load these cookies in future sessions to skip the login process.
If you get a Chrome version error, the driver will auto-download the correct version.
Make sure you're not using a VPN or proxy that's flagged by Cloudflare.
Check your credentials in the .env file.
Seraph-Novel-DL uses a simple plugin system to support multiple novel websites. Each plugin implements a standard interface defined by BasePlugin.
- Create plugin file:
plugins/yoursite_com.py - Inherit from BasePlugin:
from plugins.base_plugin import BasePlugin
class YourSitePlugin(BasePlugin):
@property
def name(self) -> str:
return "YourSite"
@property
def requires_login(self) -> bool:
return True # or False if login is optional
# Implement required methods:
# - initialize(driver)
# - login(driver, email, password)
# - search_novel(driver, query)
# - get_novel_details(driver)
# - load_chapters(driver)
# - download_chapter(driver, url, title)- Create locators:
locators/yoursite_com/folder with CSS selectors - Register plugin: Add to
PLUGINSdict inmain.py
PLUGINS = {
"novelbin": NovelBinPlugin,
"yoursite": YourSitePlugin, # Add here
}Seraph-Novel-DL/
├── gui.py # PyQt5 GUI application
├── main.py # Core functions and plugin registry
├── requirements.txt # Python dependencies
├── .env # Your credentials (optional)
├── plugins/ # Website plugins
│ ├── base_plugin.py # Plugin interface
│ └── novelbin_com.py # NovelBin implementation
├── locators/ # CSS selectors for each site
│ └── novelbin_com/
│ ├── login.py
│ ├── main_page.py
│ ├── novel_page.py
│ └── chapter_page.py
└── output/ # Downloaded EPUB files
undetected-chromedriver- Bypasses bot detectionselenium- Browser automationPyQt5- Modern GUI frameworkebooklib- EPUB file generationpython-dotenv- Environment variable management
Inspired by Novel-Grabber by Flameish.