您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Tự động trích xuất nội dung truyện từ truyen.tangthuvien.net
当前为
// ==UserScript== // @name Chapter Downloader // @namespace http://tampermonkey.net/ // @version 1.2 // @description Tự động trích xuất nội dung truyện từ truyen.tangthuvien.net // @author TangThuVienExtractor // @match https://truyen.tangthuvien.net/doc-truyen/*/* // @grant none // ==/UserScript== (function() { 'use strict'; // Biến toàn cục để theo dõi trạng thái trích xuất tự động let isAutomaticExtraction = false; // Tạo panel ở bên phải trang function createPanel() { // Tạo container chính cho panel const panel = document.createElement('div'); panel.style.position = 'fixed'; panel.style.top = '100px'; panel.style.right = '20px'; panel.style.width = '300px'; panel.style.backgroundColor = '#f9f9f9'; panel.style.border = '1px solid #ddd'; panel.style.borderRadius = '5px'; panel.style.padding = '10px'; panel.style.zIndex = '9999'; panel.style.display = 'flex'; panel.style.flexDirection = 'column'; panel.style.gap = '10px'; panel.style.boxShadow = '0 0 10px rgba(0, 0, 0, 0.1)'; // Tạo tiêu đề panel const title = document.createElement('h3'); title.textContent = 'Trích xuất nội dung truyện'; title.style.margin = '0 0 10px 0'; title.style.textAlign = 'center'; title.style.borderBottom = '1px solid #ddd'; title.style.paddingBottom = '10px'; panel.appendChild(title); // Tạo textarea để hiển thị nội dung đã trích xuất const textarea = document.createElement('textarea'); textarea.style.width = '100%'; textarea.style.height = '200px'; textarea.style.padding = '8px'; textarea.style.borderRadius = '3px'; textarea.style.border = '1px solid #ddd'; textarea.style.marginBottom = '10px'; textarea.style.resize = 'vertical'; panel.appendChild(textarea); // Lấy nội dung đã lưu từ localStorage (nếu có) const savedContent = localStorage.getItem('tangthuvien_extracted_content'); if (savedContent) { textarea.value = savedContent; } // Tạo container cho các nút const buttonContainer = document.createElement('div'); buttonContainer.style.display = 'flex'; buttonContainer.style.flexDirection = 'column'; buttonContainer.style.gap = '5px'; panel.appendChild(buttonContainer); // Tạo nút bắt đầu trích xuất const startButton = document.createElement('button'); startButton.textContent = 'Bắt đầu lấy text'; startButton.style.padding = '8px'; startButton.style.backgroundColor = '#4caf50'; startButton.style.color = 'white'; startButton.style.border = 'none'; startButton.style.borderRadius = '3px'; startButton.style.cursor = 'pointer'; startButton.addEventListener('click', function() { if (!isAutomaticExtraction) { isAutomaticExtraction = true; startButton.textContent = 'Đang trích xuất...'; startButton.style.backgroundColor = '#ff9800'; // Bắt đầu quá trình trích xuất tự động autoExtractAndNavigate(); } else { isAutomaticExtraction = false; startButton.textContent = 'Bắt đầu lấy text'; startButton.style.backgroundColor = '#4caf50'; } }); buttonContainer.appendChild(startButton); // Tạo nút xóa nội dung const clearButton = document.createElement('button'); clearButton.textContent = 'Xóa nội dung'; clearButton.style.padding = '8px'; clearButton.style.backgroundColor = '#f44336'; clearButton.style.color = 'white'; clearButton.style.border = 'none'; clearButton.style.borderRadius = '3px'; clearButton.style.cursor = 'pointer'; clearButton.addEventListener('click', function() { textarea.value = ''; localStorage.removeItem('tangthuvien_extracted_content'); // Hiển thị thông báo const notification = document.createElement('div'); notification.textContent = 'Đã xóa nội dung'; notification.style.position = 'fixed'; notification.style.bottom = '20px'; notification.style.right = '20px'; notification.style.backgroundColor = '#f44336'; notification.style.color = 'white'; notification.style.padding = '10px'; notification.style.borderRadius = '5px'; notification.style.zIndex = '10000'; document.body.appendChild(notification); // Xóa thông báo sau 3 giây setTimeout(() => { document.body.removeChild(notification); }, 3000); }); buttonContainer.appendChild(clearButton); // Tạo nút sao chép nội dung const copyButton = document.createElement('button'); copyButton.textContent = 'Sao chép nội dung'; copyButton.style.padding = '8px'; copyButton.style.backgroundColor = '#2196f3'; copyButton.style.color = 'white'; copyButton.style.border = 'none'; copyButton.style.borderRadius = '3px'; copyButton.style.cursor = 'pointer'; copyButton.addEventListener('click', function() { textarea.select(); document.execCommand('copy'); // Hiển thị thông báo const notification = document.createElement('div'); notification.textContent = 'Đã sao chép nội dung'; notification.style.position = 'fixed'; notification.style.bottom = '20px'; notification.style.right = '20px'; notification.style.backgroundColor = '#2196f3'; notification.style.color = 'white'; notification.style.padding = '10px'; notification.style.borderRadius = '5px'; notification.style.zIndex = '10000'; document.body.appendChild(notification); // Xóa thông báo sau 3 giây setTimeout(() => { document.body.removeChild(notification); }, 3000); }); buttonContainer.appendChild(copyButton); // Thêm panel vào body document.body.appendChild(panel); // Trả về các phần tử để sử dụng sau này return { panel, textarea, startButton }; } // Hàm trích xuất nội dung chương hiện tại function extractCurrentChapterContent() { const panelElements = document.querySelector('textarea'); const startButton = document.querySelector('button'); if (!panelElements || !startButton) { console.error('Không tìm thấy panel hoặc textarea'); return false; } // Lấy tiêu đề chương const chapterTitle = document.querySelector('h2'); if (!chapterTitle) { console.error('Không tìm thấy tiêu đề chương'); return false; } // Lấy nội dung chương const chapterContentSelector = '.box-chap'; const chapterContent = document.querySelector(chapterContentSelector); if (!chapterContent) { console.error('Không tìm thấy nội dung chương'); return false; } // Xử lý nội dung let contentText = chapterContent.innerText || chapterContent.textContent; contentText = contentText.trim(); // Thêm nội dung vào textarea let currentContent = panelElements.value || ''; // Thêm dấu phân cách nếu đã có nội dung trước đó if (currentContent !== '') { currentContent += '\n\n------------\n\n'; } // Thêm tiêu đề và nội dung currentContent += chapterTitle.innerText + '\n\n' + contentText; // Cập nhật textarea và lưu vào localStorage panelElements.value = currentContent; localStorage.setItem('tangthuvien_extracted_content', currentContent); // Hiển thị thông báo const notification = document.createElement('div'); notification.textContent = 'Đã trích xuất: ' + chapterTitle.innerText; notification.style.position = 'fixed'; notification.style.bottom = '20px'; notification.style.right = '320px'; notification.style.backgroundColor = '#4caf50'; notification.style.color = 'white'; notification.style.padding = '10px'; notification.style.borderRadius = '5px'; notification.style.zIndex = '10000'; document.body.appendChild(notification); // Xóa thông báo sau 3 giây setTimeout(() => { document.body.removeChild(notification); }, 3000); return true; } // Hàm tự động trích xuất và chuyển trang function autoExtractAndNavigate() { if (!isAutomaticExtraction) { return; } // Trích xuất nội dung chương hiện tại const extractionSuccess = extractCurrentChapterContent(); if (extractionSuccess) { // Tìm nút chuyển đến chương tiếp theo const nextButton = document.querySelector('.bot-next_chap.bot-control'); // Kiểm tra xem có thông báo "Bạn đã đọc đến chương mới nhất" hay không const pageContent = document.body.innerText; if (pageContent.includes('Bạn đã đọc đến chương mới nhất')) { // Kết thúc quá trình khi thấy thông báo này isAutomaticExtraction = false; const startButton = document.querySelector('button'); if (startButton) { startButton.textContent = 'Bắt đầu lấy text'; startButton.style.backgroundColor = '#4caf50'; } // Hiển thị thông báo hoàn thành const notification = document.createElement('div'); notification.textContent = 'Đã hoàn thành trích xuất toàn bộ truyện!'; notification.style.position = 'fixed'; notification.style.bottom = '20px'; notification.style.right = '320px'; notification.style.backgroundColor = '#4caf50'; notification.style.color = 'white'; notification.style.padding = '10px'; notification.style.borderRadius = '5px'; notification.style.zIndex = '10000'; document.body.appendChild(notification); // Xóa thông báo sau 5 giây setTimeout(() => { document.body.removeChild(notification); }, 5000); return; } if (nextButton) { // Hiển thị thông báo const notification = document.createElement('div'); notification.textContent = 'Đang chuyển đến chương tiếp theo...'; notification.style.position = 'fixed'; notification.style.bottom = '20px'; notification.style.right = '320px'; notification.style.backgroundColor = '#ff9800'; notification.style.color = 'white'; notification.style.padding = '10px'; notification.style.borderRadius = '5px'; notification.style.zIndex = '10000'; document.body.appendChild(notification); // Xóa thông báo sau 2 giây setTimeout(() => { document.body.removeChild(notification); }, 1000); // Nhấp vào nút chuyển trang nextButton.click(); // Đợi 2 giây để trang mới tải xong, sau đó tiếp tục quá trình setTimeout(() => { // Kiểm tra xem nút có bị ẩn hay không const startButton = document.querySelector('button'); // Nếu không tìm thấy nút hoặc nút không đúng trạng thái, // bắt đầu trực tiếp quá trình trích xuất // Hiển thị thông báo đang đợi trang tải const notification = document.createElement('div'); notification.textContent = 'Đợi trang tải xong...'; notification.style.position = 'fixed'; notification.style.bottom = '20px'; notification.style.right = '320px'; notification.style.backgroundColor = '#FFA500'; notification.style.color = 'white'; notification.style.padding = '10px'; notification.style.borderRadius = '5px'; notification.style.zIndex = '10000'; document.body.appendChild(notification); // Xóa thông báo và bắt đầu trích xuất sau 2 giây setTimeout(() => { document.body.removeChild(notification); autoExtractAndNavigate(); }, 1000); }, 1000); } else { // Nếu không tìm thấy nút chuyển trang isAutomaticExtraction = false; const startButton = document.querySelector('button'); if (startButton) { startButton.textContent = 'Bắt đầu lấy text'; startButton.style.backgroundColor = '#4caf50'; } // Hiển thị thông báo const notification = document.createElement('div'); notification.textContent = 'Không tìm thấy nút chuyển trang'; notification.style.position = 'fixed'; notification.style.bottom = '20px'; notification.style.right = '320px'; notification.style.backgroundColor = '#f44336'; notification.style.color = 'white'; notification.style.padding = '10px'; notification.style.borderRadius = '5px'; notification.style.zIndex = '10000'; document.body.appendChild(notification); // Xóa thông báo sau 5 giây setTimeout(() => { document.body.removeChild(notification); }, 5000); } } else { // Nếu trích xuất thất bại isAutomaticExtraction = false; const startButton = document.querySelector('button'); if (startButton) { startButton.textContent = 'Bắt đầu lấy text'; startButton.style.backgroundColor = '#4caf50'; } // Hiển thị thông báo const notification = document.createElement('div'); notification.textContent = 'Trích xuất thất bại'; notification.style.position = 'fixed'; notification.style.bottom = '20px'; notification.style.right = '320px'; notification.style.backgroundColor = '#f44336'; notification.style.color = 'white'; notification.style.padding = '10px'; notification.style.borderRadius = '5px'; notification.style.zIndex = '10000'; document.body.appendChild(notification); // Xóa thông báo sau 5 giây setTimeout(() => { document.body.removeChild(notification); }, 5000); } } // Khởi tạo panel khi trang đã tải xong window.addEventListener('load', function() { // Đợi 1 giây để đảm bảo trang đã tải hoàn toàn setTimeout(() => { createPanel(); }, 1000); }); })();