您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Tự động tải tối đa 200 chương trên truyen.tangthuvien.vn với giao diện hiển thị rõ tiến trình
当前为
- // ==UserScript==
- // @name Chapter Downloader Auto
- // @namespace http://tampermonkey.net/
- // @version 3.1
- // @description Tự động tải tối đa 200 chương trên truyen.tangthuvien.vn với giao diện hiển thị rõ tiến trình
- // @match https://truyen.tangthuvien.vn/doc-truyen/*
- // @grant none
- // ==/UserScript==
- (function () {
- 'use strict';
- const MAX_CHAPTERS = 200;
- let downloadedCount = parseInt(localStorage.getItem('dl_count') || '0');
- let isAutoDownloading = localStorage.getItem('dl_active') === 'true';
- // UI Elements
- const panel = document.createElement('div');
- const textarea = document.createElement('textarea');
- const startBtn = document.createElement('button');
- const statusDiv = document.createElement('div');
- // Setup UI
- panel.style.cssText = `
- position: fixed; top: 10%; right: 10px; z-index: 9999;
- width: 320px; background: #fff; border: 1px solid #ccc; padding: 10px;
- font-family: Arial, sans-serif; font-size: 14px;
- `;
- textarea.style.cssText = `width: 100%; height: 250px; margin-bottom: 10px;`;
- startBtn.style.cssText = `width: 100%; margin-bottom: 10px; padding: 10px;`;
- statusDiv.style.cssText = `margin-bottom: 10px; color: #333; font-weight: bold;`;
- startBtn.textContent = isAutoDownloading ? `⏸ Dừng (${downloadedCount}/${MAX_CHAPTERS})` : '▶️ Bắt đầu';
- panel.appendChild(textarea);
- panel.appendChild(startBtn);
- panel.appendChild(statusDiv);
- document.body.appendChild(panel);
- // Load previous content
- textarea.value = localStorage.getItem('dl_content') || '';
- function saveContent() {
- localStorage.setItem('dl_content', textarea.value);
- localStorage.setItem('dl_count', downloadedCount.toString());
- }
- function setStatus(msg) {
- statusDiv.textContent = msg;
- }
- function extractChapterContent() {
- const title = document.querySelector('h2')?.innerText.trim();
- const content = document.querySelector('.box-chap')?.innerText.trim();
- if (title && content) {
- textarea.value += `\n\n------------\n\n${title}\n\n${content}`;
- downloadedCount++;
- saveContent();
- setStatus(`✅ Đã lấy: ${title}`);
- return true;
- } else {
- setStatus('❌ Không thể lấy nội dung chương.');
- return false;
- }
- }
- function goToNextChapter() {
- const next = document.querySelector('.bot-next_chap.bot-control') ||
- [...document.querySelectorAll('a')].find(a => /tiếp|next/i.test(a.textContent));
- if (next && next.href) {
- localStorage.setItem('dl_active', 'true');
- localStorage.setItem('dl_count', downloadedCount.toString());
- setStatus('➡️ Đang chuyển sang chương tiếp...');
- setTimeout(() => location.href = next.href, 1500);
- return true;
- } else {
- setStatus('❌ Không tìm thấy nút chương tiếp theo.');
- return false;
- }
- }
- async function autoDownloadLoop() {
- if (downloadedCount >= MAX_CHAPTERS) {
- isAutoDownloading = false;
- localStorage.setItem('dl_active', 'false');
- startBtn.textContent = '▶️ Bắt đầu';
- setStatus(`🏁 Đã tải xong ${MAX_CHAPTERS} chương.`);
- return;
- }
- if (extractChapterContent()) {
- startBtn.textContent = `⏸ Dừng (${downloadedCount}/${MAX_CHAPTERS})`;
- goToNextChapter(); // Sẽ reload lại trang và tiếp tục
- } else {
- isAutoDownloading = false;
- localStorage.setItem('dl_active', 'false');
- startBtn.textContent = '▶️ Bắt đầu';
- }
- }
- startBtn.addEventListener('click', () => {
- isAutoDownloading = !isAutoDownloading;
- localStorage.setItem('dl_active', isAutoDownloading ? 'true' : 'false');
- startBtn.textContent = isAutoDownloading ? `⏸ Dừng (${downloadedCount}/${MAX_CHAPTERS})` : '▶️ Bắt đầu';
- if (isAutoDownloading) autoDownloadLoop();
- });
- if (isAutoDownloading) {
- setStatus('🔁 Tiếp tục tải chương...');
- setTimeout(autoDownloadLoop, 1500);
- } else {
- setStatus('💤 Đang chờ bắt đầu...');
- }
- })();