Copy-Text

Merge and copy

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Copy-Text
// @version      1.0
// @description  Merge and copy
// @author       Ep Tien Sinh
// @match        *://69shuba.cx/*/*
// @match        *://www.qidian.com/chapter/*
// @match        *://fanqienovel.com/reader/*
// @match        *://www.ixdzs8.tw/*
// @match        *://www.qimao.com/*/*
// @match        *://www.keleshuba.net/*
// @match        *://www.17k.com/*
// @match        *://www.piaotia.com/*/*/*/*
// @grant        GM_setClipboard
// @grant        GM_download
// @namespace https://greasyfork.org/users/1402485
// ==/UserScript==

(function() {
    'use strict';

    // Cấu hình cho từng trang bằng cách sử dụng một đối tượng
    var pageConfigs = [
        {
            urlContains: '69shuba.cx/*',
            headerSelector: 'body > div.container > div.mybox > div.txtnav > h1',
            contentSelector: 'body > div.container > div.mybox > div.txtnav',
            trashSelectors: [
                '#txtright',
                'div.contentadv',
                'div.bottom-ad',
                'div.txtinfo.hide720'
                // Thêm các selector 'rác' khác tại đây
            ]
        },
        {
            urlContains: 'www.qidian.com',
            headerSelector: '#reader-content > div.min-h-100vh.relative.z-1.bg-inherit > div > div.relative > div > h1',
            contentSelector: 'div.enable-review',
            trashSelectors: [
                '#reader-content > div > div > div.relative > div > div.text-s-gray-500.mt-4px.text-bo4.flex.items-center.flex-wrap',
                'span.review'
            ]
        },
        {
            urlContains: 'fanqienovel.com',
            headerSelector: 'div.muye-reader-box-header > h1',
            contentSelector: 'div.muye-reader-content'
        },
        {
            urlContains: 'ixdzs8.tw',
            headerSelector: '#page > article > h3',
            contentSelector: '#page > article > section'
        },
        {
            urlContains: 'www.qimao.com',
            headerSelector: '#__layout > div > div.wrapper.reader.reader-layout-theme > div.main > div > div > div > div.chapter-detail-wrap.reader-box > div.chapter-detail-wrap-info > h2',
            contentSelector: '#__layout > div > div.wrapper.reader.reader-layout-theme > div.main > div > div > div > div.chapter-detail-wrap.reader-box > div.chapter-detail-wrap-content > div.show-part > div'
        },
        {
            urlContains: 'www.keleshuba.net',
            headerSelector: '#nr_title',
            contentSelector: '#nr1',
            trashSelectors1: [
                'div[data-ad-slot="1016693305"]'
            ]
        },
        {
            urlContains: 'www.17k.com',
            headerSelector: '#nr_title',
            contentSelector: '#nr1',
            trashSelectors1: [
                'div[data-ad-slot="1016693305"]'
            ]
        },
        {
            urlContains: 'www.piaotia.com',
            headerSelector: '#content > h1',
            contentSelector: '#content',
            trashSelectors1: [
                '#content > div',
                '#content > table'
            ]
        },

        // Thêm cấu hình cho các trang khác tương tự
    ];

    function mergeAndCopy(config) {
        var headerElement = document.querySelector(config.headerSelector);
        var contentElement = document.querySelector(config.contentSelector);

        var trashSelectors = config.trashSelectors || [];
        trashSelectors.forEach(function(selector) {
            var trashElements = document.querySelectorAll(selector);
            trashElements.forEach(function(element) {
                element.remove();
            });
        });

        if (headerElement && contentElement) {
            var headerContent = headerElement.textContent.trim().replace(/\s{2,}/g, '\n');
            var contentHtml = contentElement.innerHTML;

            var contentText = contentHtml.replace(/ /g, ' ')
            .replace('(adsbygoogle = window.adsbygoogle || []).push({});', '')
            .replace(/<br\s*[\/]?>/gi, '\n')
            .replace(/<\/p>/gi, '\n')
            .replace(/<p[^>]*>/gi, '')
            .replace(/<[^>]+>/g, '');

            contentText = contentText.trim().replace(/\s{2,}/g, '\n').replace(/\n{3,}/g, '\n\n');

            var lines = contentText.split('\n');
            var headerPattern = headerContent.replace(/第\d+章/, '第\\d+章');
            var headerRegex = new RegExp(headerPattern);

            if (lines.length > 0 && headerRegex.test(lines[0].trim())) {
                lines[0] = lines[0].replace(headerRegex, '').trim();
            }
            contentText = lines.join('\n').trim();

            if (window.location.href.includes('www.qimao.com')) {
                var headerLines = headerContent.split('\n');
                if (headerLines.length > 1) {
                    headerContent = headerLines.join(' ').trim(); // Gộp hai dòng tiêu đề lại
                }
            }

            var mergedContent = headerContent + '\n\n' + contentText + '\n\n';
            var mergedLines = mergedContent.split('\n');
            if (window.location.href.includes('www.piaotia.com')) {
                if (mergedLines.length > 10) {
                    mergedContent = mergedLines.slice(10).join('\n');
                }
            }
            else if (window.location.href.includes('69shuba.cx')) {
                var wrongChapter = /^\d+\.\s*(第\d+章)/;
                var correctChapter = /^第\d+章/;

                var line = mergedLines[0].trim();

                if (wrongChapter.test(line)) {
                    mergedLines[0] = line.replace(wrongChapter, '$1').trim();
                }
                if (mergedLines.length > 2) {
                    var line3 = mergedLines[2].trim();
                    if (correctChapter.test(line3)) {
                        mergedLines.splice(2, 1);
                    }
                }

                mergedContent = mergedLines.join('\n');
            }

            return mergedContent;
        }
        return '';
    }

    function navigate(direction) {
        var buttonTexts = direction === 'next' ? ['下一章', '下一页'] : ['上一章', '上一页'];
        var button = null;

        buttonTexts.some(text => {
            button = Array.from(document.querySelectorAll('a, button, span')).find(el => el.textContent.trim() === text);
            return button !== undefined; // Dừng vòng lặp nếu tìm thấy
        });

        if (button) {
            if (button.tagName.toLowerCase() === 'a') {
                window.location.href = button.href;
            } else {
                button.click();
            }
        }
    }

    function applyPageConfig() {
        var currentUrl = window.location.href;
        var config = pageConfigs.find(function(config) {
            return currentUrl.includes(config.urlContains);
        });

        if (config) {
            return mergeAndCopy(config);
        }
        return '';
    }

    function getCurrentPageConfig() {
        var currentUrl = window.location.href;
        return pageConfigs.find(function(config) {
            return currentUrl.includes(config.urlContains);
        });
    }

    function checkNavigationButtons() {
        var nextTexts = ['下一章', '下一页'];
        var prevTexts = ['上一章', '上一页'];

        var nextButton = null;
        var backButton = null;

        nextTexts.some(text => {
            nextButton = Array.from(document.querySelectorAll('a, button, span')).find(el => el.textContent.trim() === text);
            return nextButton !== undefined;
        });

        prevTexts.some(text => {
            backButton = Array.from(document.querySelectorAll('a, button, span')).find(el => el.textContent.trim() === text);
            return backButton !== undefined;
        });

        if (nextButton) {
            nextButton.style.display = 'block';
        }

        if (backButton) {
            backButton.style.display = 'block';
        }
    }

    function checkNavigationButtonsOnLoad() {
        checkNavigationButtons();
    }

    var autoClickInterval;
    var isCopying = false;
    var copiedChapters = [];

    function startAutoClick() {
        autoClickInterval = setInterval(function() {

            if (!isCopying) {
                isCopying = true;

                var currentPageConfig = getCurrentPageConfig();
                if (currentPageConfig) {
                    var mergedContent = applyPageConfig();

                    if (!copiedChapters.includes(mergedContent)) {
                        appendToClipboard(mergedContent);
                        copiedChapters.push(mergedContent);
                    }
                }

                setTimeout(function() {
                    var nextButtonExists = checkNextButtonExists();

                    if (!nextButtonExists) {
                        // Dừng auto-click nếu không còn chương tiếp theo
                        stopAutoClick();
                        return;
                    }
                    navigate('next');
                    setTimeout(function() {
                        isCopying = false;
                    }, 1000); // Tăng thêm thời gian chờ sau khi chuyển chương để đảm bảo quá trình copy hoàn thành
                }, 800); // Chuyển chương sau 0.8 giây
            }
        }, 1500); // Điều chỉnh thời gian chờ để tránh copy lặp lại (tăng lên 1.5 giây)

        autoClickButton.textContent = 'Stop Auto';
        localStorage.setItem('autoClickRunning', 'true');
    }

    function checkNextButtonExists() {
        var buttonTexts = ['下一章', '下一页']; // Các văn bản cho nút "Next"
        var nextButton = null;

        buttonTexts.some(text => {
            nextButton = Array.from(document.querySelectorAll('a, button, span')).find(el => el.textContent.trim() === text);
            return nextButton !== undefined;
        });
        return nextButton !== undefined;
    }

    function clearClipboardAndStartAutoClick() {
        navigator.clipboard.writeText('').then(function() {
            startAutoClick();
        }, function(err) {
        });
    }

    function appendToClipboard(newContent) {
        navigator.clipboard.readText().then(function(currentContent) {
            const combinedContent = currentContent + newContent;
            navigator.clipboard.writeText(combinedContent).then(function() {
            }, function(err) {
            });
        }, function(err) {
        });
    }

    function stopAutoClick() {
        clearInterval(autoClickInterval);
        autoClickInterval = null;
        autoClickButton.textContent = 'Auto Click';

        localStorage.removeItem('autoClickRunning');

        var headerText = 'clipboard';
        navigator.clipboard.readText().then(clipboardContent => {

            if (clipboardContent) {
                var blob = new Blob([clipboardContent], { type: 'text/plain' });
                let downloadLink = window.URL.createObjectURL(blob);
                let downloadArgs = {
                    url: downloadLink,
                    name: `${headerText}.txt`
                };
                GM_download(downloadArgs);
            }
        }).catch(err => {
        });
    }

    var copyNextButton = createButton('Copy & Next', '50px', '490px', function() {
        var mergedContent = applyPageConfig(); // Lấy nội dung hợp nhất
        GM_setClipboard(mergedContent);
        setTimeout(function() {
            navigate('next');
        }, 1000);
    });
    document.body.appendChild(copyNextButton);

    var autoClickButton = createButton('Auto Click', '50px', '370px', function() {
        if (!autoClickInterval) {
            clearClipboardAndStartAutoClick();
        } else {
            stopAutoClick();
        }
    });
    document.body.appendChild(autoClickButton);

    var nextButton = createButton('Next Chương', '10px', '490px', function() {
        navigate('next');
        checkNavigationButtons();
    });
    document.body.appendChild(nextButton);

    var backButton = createButton('Back Chương', '10px', '370px', function() {
        navigate('back');
        checkNavigationButtons();
    });
    document.body.appendChild(backButton);

    function createButton(text, bottom, left, clickHandler) {
        var button = document.createElement('button');
        button.textContent = text;
        button.style.position = 'fixed';
        button.style.bottom = bottom;
        button.style.left = left;
        button.style.zIndex = '9999';
        button.style.width = '110px';
        button.style.height = '35px';
        button.style.backgroundColor = text.includes('Next') ? 'green' : 'blue';
        button.style.color = 'white';

        button.addEventListener('mousedown', function() {
            button.style.backgroundColor = 'yellow';
            button.style.color = 'black';
        });

        button.addEventListener('mouseup', function() {
            button.style.backgroundColor = text.includes('Next') ? 'green' : 'blue';
            button.style.color = 'white';
        });

        button.addEventListener('click', clickHandler);

        return button;
    }

    if (localStorage.getItem('autoClickRunning') === 'true') {
        startAutoClick();
    }

    function main() {
        checkNavigationButtonsOnLoad();
        applyPageConfig();
    }
    document.addEventListener('DOMContentLoaded', main);
})();