您需要先安装一个扩展,例如 篡改猴、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();
- }
- }
- });
- })();