您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Tự động lấy nội dung từ chương hiện tại đến chương cuối cùng trên truyen.tangthuvien.vn
当前为
// ==UserScript== // @name Chapter Downloader // @namespace http://tampermonkey.net/ // @version 3.0 // @description Tự động lấy nội dung từ chương hiện tại đến chương cuối cùng trên truyen.tangthuvien.vn // @author You // @match https://truyen.tangthuvien.vn/doc-truyen/* // @grant none // ==/UserScript== (function () { 'use strict'; let chapterUrls = []; let currentChapterIndex = 0; let isAutoDownloading = false; const panel = document.createElement('div'); panel.id = 'reader-panel'; panel.style.cssText = ` position: fixed; top: 10%; right: 10px; width: 300px; background-color: #f8f8f8; border: 1px solid #ccc; border-radius: 5px; padding: 10px; z-index: 9999; box-shadow: 0 0 10px rgba(0,0,0,0.2); font-family: Arial, sans-serif; `; const textarea = document.createElement('textarea'); textarea.id = 'content-textarea'; textarea.style.cssText = ` width: 100%; height: 300px; margin-bottom: 10px; padding: 8px; border: 1px solid #ddd; border-radius: 4px; resize: vertical; `; const startButton = document.createElement('button'); startButton.textContent = 'Bắt đầu'; startButton.style.cssText = ` width: 100%; padding: 8px; margin-bottom: 10px; background-color: #4CAF50; color: white; border: none; border-radius: 4px; cursor: pointer; `; const buttonRow1 = document.createElement('div'); buttonRow1.style.cssText = `display: flex; justify-content: space-between; margin-bottom: 10px;`; const getTextButton = document.createElement('button'); getTextButton.textContent = 'Lấy Text'; getTextButton.style.cssText = ` flex: 1; padding: 8px; margin-right: 5px; background-color: #2196F3; color: white; border: none; border-radius: 4px; cursor: pointer; `; const nextChapterButton = document.createElement('button'); nextChapterButton.textContent = 'Chương Tiếp'; nextChapterButton.style.cssText = ` flex: 1; padding: 8px; margin-left: 5px; background-color: #ff9800; color: white; border: none; border-radius: 4px; cursor: pointer; `; const buttonRow2 = document.createElement('div'); buttonRow2.style.cssText = `display: flex; justify-content: space-between;`; const clearButton = document.createElement('button'); clearButton.textContent = 'Xoá'; clearButton.style.cssText = ` flex: 1; padding: 8px; margin-right: 5px; background-color: #f44336; color: white; border: none; border-radius: 4px; cursor: pointer; `; const copyButton = document.createElement('button'); copyButton.textContent = 'Sao Chép'; copyButton.style.cssText = ` flex: 1; padding: 8px; margin-left: 5px; background-color: #9c27b0; color: white; border: none; border-radius: 4px; cursor: pointer; `; buttonRow1.appendChild(getTextButton); buttonRow1.appendChild(nextChapterButton); buttonRow2.appendChild(clearButton); buttonRow2.appendChild(copyButton); panel.appendChild(textarea); panel.appendChild(startButton); panel.appendChild(buttonRow1); panel.appendChild(buttonRow2); const shortcutsInfo = document.createElement('div'); shortcutsInfo.style.cssText = `font-size: 11px; color: #666; margin-top: 10px; padding-top: 5px; border-top: 1px solid #ddd;`; shortcutsInfo.innerHTML = `<b>Phím tắt:</b> Alt+G (Lấy text), Alt+N (Chương tiếp), Alt+S (Tự động), Alt+C (Sao chép)`; panel.appendChild(shortcutsInfo); document.body.appendChild(panel); const savedContent = localStorage.getItem('chapterDownloaderContent'); if (savedContent) { textarea.value = savedContent; } function saveContent() { localStorage.setItem('chapterDownloaderContent', textarea.value); } textarea.addEventListener('input', saveContent); function extractChapterContent() { const titleElement = document.querySelector('h2'); const contentElement = document.querySelector('.box-chap'); if (titleElement && contentElement) { const title = titleElement.innerText.trim(); const content = contentElement.innerText.trim(); if (textarea.value) { textarea.value += '\n\n------------\n\n' + title + '\n\n' + content; } else { textarea.value = title + '\n\n' + content; } saveContent(); return true; } else { return false; } } function startAutoDownloading() { if (!isAutoDownloading) return; if (chapterUrls.length === 0) { const allLinks = Array.from(document.querySelectorAll('a[href*="/doc-truyen/"]')); const filteredLinks = allLinks.map(a => a.href).filter((href, index, self) => href.includes('chuong') && self.indexOf(href) === index); chapterUrls = filteredLinks; const currentUrl = window.location.href.split('?')[0]; currentChapterIndex = chapterUrls.findIndex(url => url === currentUrl); if (currentChapterIndex === -1) { console.log('Không tìm thấy chương hiện tại trong danh sách!'); isAutoDownloading = false; return; } } if (currentChapterIndex < chapterUrls.length) { const currentUrl = chapterUrls[currentChapterIndex]; console.log(`Đang tải chương ${currentChapterIndex + 1}/${chapterUrls.length}: ${currentUrl}`); if (window.location.href !== currentUrl) { window.location.href = currentUrl; return; } if (extractChapterContent()) { currentChapterIndex++; setTimeout(startAutoDownloading, 2000); } else { console.log('Không lấy được nội dung chương, dừng lại.'); isAutoDownloading = false; } } else { console.log('Đã tải xong tất cả chương!'); isAutoDownloading = false; startButton.textContent = 'Bắt đầu'; startButton.style.backgroundColor = '#4CAF50'; } } startButton.addEventListener('click', () => { isAutoDownloading = !isAutoDownloading; if (isAutoDownloading) { startButton.textContent = 'Dừng'; startButton.style.backgroundColor = '#f44336'; startAutoDownloading(); } else { startButton.textContent = 'Bắt đầu'; startButton.style.backgroundColor = '#4CAF50'; } }); getTextButton.addEventListener('click', () => extractChapterContent()); nextChapterButton.addEventListener('click', () => { const nextLink = document.querySelector('.bot-next_chap.bot-control'); if (nextLink) nextLink.click(); }); clearButton.addEventListener('click', () => { textarea.value = ''; saveContent(); }); copyButton.addEventListener('click', () => { textarea.select(); document.execCommand('copy'); const notification = document.createElement('div'); notification.textContent = 'Đã sao chép!'; notification.style.cssText = ` position: fixed; bottom: 20px; left: 50%; transform: translateX(-50%); background-color: rgba(0,0,0,0.8); color: white; padding: 10px 20px; border-radius: 4px; z-index: 10000; `; document.body.appendChild(notification); setTimeout(() => document.body.removeChild(notification), 2000); }); document.addEventListener('keydown', (e) => { if (e.target.tagName !== 'TEXTAREA' && e.target.tagName !== 'INPUT') { if (e.altKey && e.key === 'g') { extractChapterContent(); e.preventDefault(); } else if (e.altKey && e.key === 'n') { const nextLink = document.querySelector('.bot-next_chap.bot-control'); if (nextLink) nextLink.click(); e.preventDefault(); } else if (e.altKey && e.key === 's') { startButton.click(); e.preventDefault(); } else if (e.altKey && e.key === 'c') { textarea.select(); document.execCommand('copy'); e.preventDefault(); } } }); })();