// ==UserScript==
// @name         검색 결과 자동 수집기
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  검색 결과를 자동으로 방문하고 데이터를 수집하는 스크립트입니다.
// @author       
// @match        https://www.google.com/search*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // 사용자 설정
    const settings = {
        delayBetweenRequests: 2000, // 요청 사이의 딜레이 (밀리초)
        maxPages: 5, // 방문할 최대 페이지 수
    };

    // 변수 초기화
    let currentPage = 1;
    let totalPages = settings.maxPages;
    let visitedUrls = new Set();
    let data = [];
    let isCollecting = false;

    // UI 생성
    function createUI() {
        const uiContainer = document.createElement('div');
        uiContainer.id = 'script-ui';
        uiContainer.style.position = 'fixed';
        uiContainer.style.top = '10px';
        uiContainer.style.right = '10px';
        uiContainer.style.padding = '10px';
        uiContainer.style.backgroundColor = 'white';
        uiContainer.style.border = '1px solid #ccc';
        uiContainer.style.zIndex = '9999';

        const progressLabel = document.createElement('div');
        progressLabel.id = 'progress-label';
        progressLabel.textContent = '진행률: 0%';

        const dataTable = document.createElement('table');
        dataTable.id = 'data-table';
        dataTable.style.width = '100%';
        dataTable.style.borderCollapse = 'collapse';

        const headerRow = document.createElement('tr');
        const headers = ['사이트 이름', '주소', '설명'];
        headers.forEach(text => {
            const th = document.createElement('th');
            th.textContent = text;
            th.style.border = '1px solid #ccc';
            th.style.padding = '5px';
            headerRow.appendChild(th);
        });
        dataTable.appendChild(headerRow);

        uiContainer.appendChild(progressLabel);
        uiContainer.appendChild(dataTable);
        document.body.appendChild(uiContainer);
    }

    // 진행률 업데이트
    function updateProgress() {
        const progressLabel = document.getElementById('progress-label');
        const percent = Math.min(((currentPage - 1) / totalPages) * 100, 100).toFixed(2);
        progressLabel.textContent = `진행률: ${percent}% (페이지 ${currentPage}/${totalPages})`;
    }

    // 데이터 테이블 업데이트
    function updateDataTable() {
        const dataTable = document.getElementById('data-table');

        // 기존 행 삭제
        while (dataTable.rows.length > 1) {
            dataTable.deleteRow(1);
        }

        // 데이터 추가
        data.forEach(item => {
            const row = dataTable.insertRow();
            const nameCell = row.insertCell();
            const urlCell = row.insertCell();
            const descCell = row.insertCell();

            nameCell.textContent = item.name;
            urlCell.textContent = item.url;
            descCell.textContent = item.description;

            [nameCell, urlCell, descCell].forEach(cell => {
                cell.style.border = '1px solid #ccc';
                cell.style.padding = '5px';
            });
        });
    }

    // 광고 사이트 검사 (간단한 예시로 구현)
    function isAdSite(url) {
        const adKeywords = ['ads', 'advertisement', 'sponsored'];
        return adKeywords.some(keyword => url.includes(keyword));
    }

    // 로그 저장
    function log(message) {
        console.log(`[로그]: ${message}`);
        // 필요한 경우 로그를 서버나 파일에 저장하도록 구현할 수 있습니다.
    }

    // 사이트 정보 수집
    async function collectSiteInfo(links) {
        for (let i = 0; i < links.length; i++) {
            const link = links[i];
            const url = link.href;

            // 중복 및 광고 사이트 검사
            if (visitedUrls.has(url) || isAdSite(url)) {
                log(`건너뜀: ${url}`);
                continue;
            }

            visitedUrls.add(url);

            try {
                // 사이트 방문 및 정보 수집
                const response = await fetch(url);
                const htmlText = await response.text();
                const parser = new DOMParser();
                const doc = parser.parseFromString(htmlText, 'text/html');

                const title = doc.querySelector('title') ? doc.querySelector('title').innerText : '제목 없음';
                const descriptionMeta = doc.querySelector('meta[name="description"]');
                const description = descriptionMeta ? descriptionMeta.content : '설명 없음';

                data.push({
                    name: title,
                    url: url,
                    description: description,
                });

                updateDataTable();
                log(`수집 완료: ${url}`);

                // 딜레이 추가
                await new Promise(resolve => setTimeout(resolve, settings.delayBetweenRequests));
            } catch (error) {
                log(`에러 발생: ${url} - ${error.message}`);
            }
        }
    }

    // 다음 페이지로 이동
    function goToNextPage() {
        const nextButton = document.querySelector('#pnnext');
        if (nextButton && currentPage < totalPages) {
            currentPage++;
            updateProgress();
            nextButton.click();
        } else {
            isCollecting = false;
            log('수집 완료');
        }
    }

    // 수집 프로세스 시작
    async function startCollecting() {
        if (isCollecting) return;
        isCollecting = true;

        while (isCollecting) {
            updateProgress();
            const links = Array.from(document.querySelectorAll('a')).filter(a => a.href && a.href.startsWith('http'));
            await collectSiteInfo(links);
            goToNextPage();
            await new Promise(resolve => setTimeout(resolve, 2000)); // 페이지 로딩 대기
        }
    }

    // UI 생성 및 수집 시작
    createUI();
    startCollecting();

})();                                                                  이 코드에서 정령 문제가 없다 생각하니? 문제가 있지 않겠니?