Copy-Text

Merge and copy

// ==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);
})();