Copy-Text

Merge and copy

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

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

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 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);
})();