您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
쿠폰 편하게 적자
当前为
// ==UserScript== // @name 니마갤 쿠폰 자동입력툴 // @namespace http://tampermonkey.net/ // @version 1.0.1 // @description 쿠폰 편하게 적자 // @author 니마갤파딱 // @match *://www.blablalink.com/cdk* // @grant none // @license MIT // ==/UserScript== (function() { 'use strict'; const SHEET_ID = '1iN8RiOLftZMtxM-AjdmY2BT0SpgSnacurpDl1oTV6UQ'; const API_URL = `https://docs.google.com/spreadsheets/d/${SHEET_ID}/gviz/tq?tqx=out:json`; let normalCoupons = []; let normalCouponsText = []; let resetCoupons = []; let resetCouponsText = []; function fetchSpreadsheetData() { fetch(API_URL) .then(response => response.text()) .then(data => { try { const jsonData = JSON.parse(data.substr(47).slice(0, -2)); const rows = jsonData.table.rows; normalCoupons = rows.map(row => row.c[0]?.v || "").filter(Boolean); normalCouponsText = rows.map(row => row.c[1]?.v || "").filter(Boolean); resetCoupons = rows.map(row => row.c[2]?.v || "").filter(Boolean); resetCouponsText = rows.map(row => row.c[3]?.v || "").filter(Boolean); console.log("📜 일반 쿠폰 리스트:", normalCoupons); console.log("🔄 리세용 쿠폰 리스트:", resetCoupons); displayCouponButtons(); } catch (error) { console.error("🚨 JSON 파싱 오류:", error); } }) .catch(error => console.error("🚨 스프레드시트 데이터를 가져오는 중 오류 발생:", error)); } function displayCouponButtons() { let couponContainer = document.getElementById("coupon-buttons-container"); if (!couponContainer) { couponContainer = document.createElement("div"); couponContainer.id = "coupon-buttons-container"; couponContainer.style.marginTop = "10px"; const autoButton = document.getElementById("auto-input-btn"); if (autoButton) { autoButton.parentNode.insertBefore(couponContainer, autoButton.nextSibling); } else { document.body.appendChild(couponContainer); } } couponContainer.innerHTML = ""; const showReset = document.getElementById("reset-coupon-checkbox").checked; if(showReset){ let resetCount = 0; resetCoupons.forEach(coupon => { const button = document.createElement("button"); button.textContent = coupon + " (" + resetCouponsText[resetCount] + ")"; button.style.display = "block"; button.style.margin = "5px auto"; button.style.padding = "8px 12px"; button.style.backgroundColor = "#ffbb00"; button.style.border = "none"; button.style.cursor = "pointer"; button.style.width = "80%"; button.style.borderRadius = "5px"; button.style.textAlign = "center"; button.addEventListener("click", () => insertCoupon(coupon)); couponContainer.appendChild(button); resetCount++; }); } let couponCount = 0; normalCoupons.forEach(coupon => { const button = document.createElement("button"); button.textContent = coupon + " (" + normalCouponsText[couponCount] + ")"; button.style.display = "block"; button.style.margin = "5px auto"; button.style.padding = "8px 12px"; button.style.backgroundColor = "#ffcc00"; button.style.border = "none"; button.style.cursor = "pointer"; button.style.width = "80%"; button.style.borderRadius = "5px"; button.style.textAlign = "center"; button.addEventListener("click", () => insertCoupon(coupon)); couponContainer.appendChild(button); couponCount++; }); } function insertCoupon(coupon) { const textarea = document.querySelector("textarea[placeholder='CDK를 입력하세요.']"); if (textarea) { textarea.value = coupon; textarea.dispatchEvent(new Event('input', { bubbles: true })); console.log("✅ 쿠폰 입력 완료:", coupon); setTimeout(clickConfirmButton, 500); } else { console.warn("❌ 입력할 textarea를 찾을 수 없습니다."); } } function clickConfirmButton() { const confirmButton = document.querySelector("div[data-cname='index'].cursor-pointer"); if (confirmButton) { confirmButton.click(); console.log("✅ 확인 버튼 클릭 완료"); waitForPopupAndContinue(); } else { console.warn("❌ 확인 버튼을 찾을 수 없습니다."); } } function waitForPopupAndContinue() { const observer = new MutationObserver((mutations, obs) => { const closeButton = [...document.querySelectorAll("div[data-cname='index']")].find(btn => btn.textContent.includes("닫기")); if (closeButton) { setTimeout(() => { closeButton.click(); console.log("✅ 팝업 닫기 완료"); obs.disconnect(); }, 500); } }); observer.observe(document.body, { childList: true, subtree: true }); } function addUIElements() { const confirmButton = document.querySelector("div[data-cname='index'].cursor-pointer"); if (!confirmButton || document.getElementById("auto-input-btn")) return; const reportLink = document.createElement("div"); reportLink.textContent = "만료 쿠폰 등 제보"; reportLink.className = confirmButton.className; reportLink.id = "auto-input-btn"; reportLink.style.marginTop = "10px"; reportLink.style.backgroundColor = "#ffaa00"; reportLink.style.color = "white"; reportLink.addEventListener("click", () => window.open("https://gall.dcinside.com/mgallery/board/view?id=gov&no=2733748")); const autoButton = document.createElement("div"); autoButton.textContent = "쿠폰 가져오기"; autoButton.className = confirmButton.className; autoButton.id = "auto-input-btn"; autoButton.style.marginTop = "10px"; autoButton.style.backgroundColor = "#ffcc00"; autoButton.style.color = "white"; autoButton.addEventListener("click", fetchSpreadsheetData); const checkboxContainer = document.createElement("div"); checkboxContainer.style.display = "flex"; checkboxContainer.style.alignItems = "center"; checkboxContainer.style.marginTop = "5px"; checkboxContainer.style.justifyContent = "flex-start"; const checkbox = document.createElement("input"); checkbox.type = "checkbox"; checkbox.id = "reset-coupon-checkbox"; checkbox.style.marginRight = "5px"; checkbox.style.width = "16px"; checkbox.style.height = "16px"; checkbox.addEventListener("change", displayCouponButtons); const label = document.createElement("label"); label.htmlFor = "reset-coupon-checkbox"; label.textContent = "리세용 쿠폰 표시"; label.style.fontSize = "14px"; checkboxContainer.appendChild(checkbox); checkboxContainer.appendChild(label); confirmButton.parentNode.insertBefore(reportLink, confirmButton.nextSibling); confirmButton.parentNode.insertBefore(autoButton, confirmButton.nextSibling); confirmButton.parentNode.insertBefore(checkboxContainer, autoButton.nextSibling); } const observer = new MutationObserver(addUIElements); observer.observe(document.body, { childList: true, subtree: true }); window.addEventListener("load", addUIElements); })();