이거 그냥 콘솔에 붙여 넣으시면 적당히 됩니다. AI로 대충 만든거라 성능은 그냥저냥이에요.
멈추는거는 걍 새로고침 ㄱㄱ
(async function stableMokokoCake() {
console.log("%c[최종 보완 모드 시작]", "color: #00ff00; font-weight: bold;");
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
async function safeConfirm() {
// 팝업 확인 버튼이 나타날 때까지 대기 (최대 3초)
for (let i = 0; i < 12; i++) {
const confirmBtn = document.querySelector('button.lui-modal__confirm');
if (confirmBtn && confirmBtn.offsetParent !== null) {
await delay(300); // 팝업 애니메이션 안정화 대기
confirmBtn.click();
return true;
}
await delay(250);
}
return false;
}
while (true) {
// 1. 클릭 가능한 상자만 필터링
// - .button--open-gift 클래스 보유
// - .is-complete 클래스 미보유 (이미 연 상자 제외)
// - disabled 속성이 false인 것
// - 실제로 화면에 보이는 것 (display: none 제외)
let boxes = Array.from(document.querySelectorAll('.button--open-gift')).filter(btn =>
!btn.classList.contains('is-complete') &&
!btn.disabled &&
btn.offsetParent !== null
);
if (boxes.length > 0) {
for (let box of boxes) {
// 한 번 더 상태 체크 (루프 도중 변했을 가능성 대비)
if (box.classList.contains('is-complete')) continue;
console.log("🎁 상자 클릭 시도...");
box.click();
// 팝업 두 번 돌파 (획득 확인 -> 완료 확인)
await safeConfirm();
await delay(500);
await safeConfirm();
await delay(800); // 서버 반영 시간 확보
}
} else {
// 2. 남은 상자가 없을 때 '다음 회차' 버튼 확인
const nextBtn = document.querySelector('.button--next-cake, .btn-next-cake, [class*="next-cake"]');
if (nextBtn && nextBtn.offsetParent !== null) {
console.log("✨ 현재 케이크 완료! 다음 단계로 이동합니다.");
nextBtn.click();
await safeConfirm();
await delay(2500); // 새 케이크 판 로딩 대기
continue;
} else {
console.log("✅ 열 수 있는 상자가 더 이상 없거나 포인트가 부족합니다.");
break;
}
}
// 3. 포인트 소진 체크
const pointText = document.querySelector('.txt--point')?.innerText || "0";
const currentPoint = parseInt(pointText.replace(/[^0-9]/g, ""));
if (currentPoint < 2) { // 상자 하나당 최소 2포인트 가정 (이벤트 규정에 맞게 조절 가능)
console.log("❌ 포인트 부족으로 종료합니다.");
break;
}
await delay(1000);
}
console.log("%c[작업 종료]", "color: #ff0000; font-weight: bold;");
})();