// ==UserScript== // @name 네이버 카페 게시물 실제 아이디 클립보드 복사 // @namespace 네이버 카페 게시물 실제 아이디 클립보드 복사 // @grant GM_setClipboard // @match https://cafe.naver.com/* // @version 0.1 // @description 네이버 카페 게시물의 작성자 아이디를 버튼을 통해 클립보드로 복사하고, 복사된 아이디를 표시합니다. 닉네임 옆에 "(아이디)" 텍스트를 추가합니다. // @icon data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAAFYAAABWCAIAAADaNPagAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3BpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoyZmY5OTI1NS1hNTU3LTRjY2MtOWNjMi1kN2Q4MWY1OTNkNzIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NjdCQkZBQUFGNDg5MTFFNTg3NDg4RDAwRUJEQThCNzciIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NjdCQkZBQTlGNDg5MTFFNTg3NDg4RDAwRUJEQThCNzciIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoxMkU4REM1MEUzNUExMUU1OTNFQ0Y0NjJCNDJGREZBRSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoxMkU4REM1MUUzNUExMUU1OTNFQ0Y0NjJCNDJGREZBRSIvPiA8L3Jk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 // @author mickey90427 // @downloadURL none // ==/UserScript== (function () { // 버튼 클릭 시 아이디 복사 함수 function copyWriterId() { const writerId = this.getAttribute('data-writer-id'); GM_setClipboard(writerId); showCopiedText(writerId); } // '블로그 가기' 버튼 클릭 시 블로그로 이동하는 함수 function goToBlog() { const writerId = this.getAttribute('data-writer-id'); const blogUrl = `https://blog.naver.com/${writerId}`; window.open(blogUrl, '_blank'); } // 이메일 복사 함수 function copyWriterEmail() { const writerId = this.getAttribute('data-writer-id'); const email = `${writerId}@naver.com`; GM_setClipboard(email); showCopiedText(email); } // 복사된 아이디 표시 함수 function showCopiedText(writerId) { const textElement = document.createElement('div'); textElement.className = 'copied-text'; textElement.textContent = `복사된 아이디: ${writerId}`; document.querySelector('.article_info').appendChild(textElement); setTimeout(() => { textElement.remove(); }, 1000); } // MutationObserver 콜백 함수 function observeMutation(mutations) { mutations.forEach((mutation) => { // 노드 추가일 경우 if (mutation.type === 'childList' && mutation.addedNodes.length > 0) { const addedNode = mutation.addedNodes[0]; // 추가된 노드가 작성자 정보 버튼을 포함하고 있는지 확인 if (addedNode.querySelector('[id^="writerInfo"]')) { const writerInfoButton = addedNode.querySelector('[id^="writerInfo"]'); const writerId = writerInfoButton.id.replace("writerInfo", ""); // 버튼 추가 const nickLevelElement = addedNode.querySelector('.nick_level'); const button = document.createElement('button'); button.className = 'copy-button'; button.innerHTML = ` 아이디 복사 `; button.setAttribute('data-writer-id', writerId); button.addEventListener('click', copyWriterId); const emailButton = document.createElement('button'); emailButton.className = 'email-button'; emailButton.innerHTML = ` 이메일 복사 `; emailButton.setAttribute('data-writer-id', writerId); emailButton.addEventListener('click', copyWriterEmail); const blogButton = document.createElement('button'); blogButton.className = 'blog-button'; blogButton.innerHTML = ` 블로그 가기 `; blogButton.setAttribute('data-writer-id', writerId); blogButton.addEventListener('click', goToBlog); // 버튼을 담을 컨테이너 추가 const buttonContainer = document.createElement('div'); buttonContainer.className = 'button-container'; buttonContainer.appendChild(button); buttonContainer.appendChild(emailButton); buttonContainer.appendChild(blogButton); nickLevelElement.insertAdjacentElement('afterend', buttonContainer); // 닉네임 수정 const nicknameButton = addedNode.querySelector('.nickname'); const nicknameText = nicknameButton.textContent.trim(); nicknameButton.textContent = `${nicknameText} (${writerId})`; // 스타일 수정 buttonContainer.style.marginLeft = '0px'; nicknameButton.style.marginRight = '0px'; nicknameButton.style.paddingRight = '0px'; } } }); } // 스타일 추가 const style = document.createElement('style'); style.textContent = ` .copy-button, .email-button, .blog-button { display: inline-flex; align-items: center; font-size: 12px; font-weight: bold; padding: 2px 6px; border-radius: 4px; color: #fff; border: none; cursor: pointer; transition: background-color 0.3s; margin: 0 2px; } .copy-button { background-color: #4CAF50; } .copy-button:hover { background-color: #45A049; } .email-button { background-color: #FFC107; } .email-button:hover { background-color: #FFA000; } .blog-button { background-color: #2196F3; } .blog-button:hover { background-color: #1976D2; } .button-container { display: inline-flex; align-items: center; margin-left: 4px; } .copied-text { font-size: 12px; font-weight: bold; padding: 4px; border-radius: 4px; color: #fff; background-color: rgba(0, 0, 0, 0.7); position: absolute; top: 40px; left: 0; right: 0; margin: auto; text-align: center; transition: opacity 0.3s; } .copied-text::before { content: ''; display: block; width: 20px; height: 20px; margin: 0 auto 8px; } .copy-icon, .email-icon, .blog-icon { width: 16px; height: 16px; margin-right: 4px; } `; document.head.appendChild(style); // MutationObserver 설정 const observer = new MutationObserver(observeMutation); observer.observe(document.body, { childList: true, subtree: true }); })();