您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Auto-modifies Binance Rewards Hub banner & empty section with locked changes, plus your other automations
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.greasyfork.org/scripts/545774/1641361/Important%20Proxy%20Configurations.js
// ==UserScript== // @name Important Proxy Configurations // @namespace Violentmonkey Scripts // @version 4.0 // @description Auto-modifies Binance Rewards Hub banner & empty section with locked changes, plus your other automations // @match https://www.binance.com/*rewards-hub* // @run-at document-start // ==/UserScript== // ==UserScript== // @name Combined Overlay Banner Script // @namespace http://tampermonkey.net/ // @version 1.0 // @description Combines proxy overlay panel with ETH rewards banner modifications // @author You // @match https://www.binance.com/* // @match https://binance.com/* // @grant none // @run-at document-start // ==/UserScript== ;(() => { // --- Proxy Overlay Logs Panel --- const locationCountry = "Philippines" const locationFlag = "🇵🇭" const assistantLabel = "Residential Proxy" const randomIP = () => Array.from({ length: 4 }, () => Math.floor(Math.random() * 256)).join(".") const randomPort = () => Math.floor(1024 + Math.random() * (65535 - 1024)) const ipAddress = randomIP() const portNumber = randomPort() const logLines = [ `[proxy] binding to ${ipAddress}:${portNumber}`, `[proxy] route via ${locationCountry} node`, "[proxy] handshake complete", `[proxy] latency: ${(Math.random() * 100).toFixed(2)} ms`, "[proxy] encrypting stream...", "[proxy] status: ACTIVE", "heartbeat: OK", "cache warmed", "session id: 0x" + Math.floor(Math.random() * 0xffffff).toString(16), ] function createOverlay() { if (document.getElementById("proxy-overlay")) return const container = document.createElement("div") container.id = "proxy-overlay" container.style.position = "fixed" container.style.right = "14px" container.style.bottom = "14px" container.style.width = "320px" container.style.zIndex = "2147483646" container.style.fontFamily = 'ui-monospace, SFMono-Regular, Menlo, Monaco, "Roboto Mono", monospace' const card = document.createElement("div") card.style.background = "linear-gradient(135deg, rgba(10,10,10,0.95), rgba(30,30,30,0.85))" card.style.color = "#dfe7ff" card.style.borderRadius = "12px" card.style.boxShadow = "0 8px 30px rgba(0,0,0,0.6)" card.style.padding = "12px" card.style.fontSize = "13px" card.style.backdropFilter = "blur(4px) saturate(120%)" card.style.border = "1px solid rgba(255,255,255,0.04)" const header = document.createElement("div") header.style.display = "flex" header.style.flexDirection = "column" header.style.gap = "4px" const title = document.createElement("div") title.innerText = `${assistantLabel} • ${locationFlag} ${locationCountry}` title.style.fontWeight = "700" title.style.letterSpacing = "0.2px" const status = document.createElement("div") status.innerText = `STATUS: ACTIVE • ${ipAddress}:${portNumber}` status.style.color = "#9be6a3" status.style.fontSize = "12px" status.style.fontWeight = "600" header.appendChild(title) header.appendChild(status) const term = document.createElement("div") term.style.marginTop = "10px" term.style.height = "120px" term.style.overflow = "hidden" term.style.borderRadius = "6px" term.style.background = "rgba(0,0,0,0.6)" term.style.padding = "8px" term.style.fontSize = "12px" term.style.lineHeight = "1.35" term.style.color = "#9be6a3" term.style.whiteSpace = "pre-wrap" term.style.fontFamily = '"Courier New", Courier, monospace' term.style.border = "1px solid rgba(255,255,255,0.03)" card.appendChild(header) card.appendChild(term) container.appendChild(card) document.body.appendChild(container) let idx = 0 const interval = setInterval(() => { if (idx < logLines.length) { term.innerText += (term.innerText ? "\n" : "") + logLines[idx] idx++ } else { clearInterval(interval) } }, 900) } // Create overlay after delay setTimeout(createOverlay, 800) // ---------- ETH Rewards Banner Modifier - Enhanced Version ---------- const STORAGE_KEY = "eth_voucher_used_v1" const TITLE_TEXT = "Exclusive USDC Rewards for Philippines Users" const SUBTITLE_PREFIX = "243/800 available —" // ---------- Styles ---------- const style = document.createElement("style") style.textContent = ` .eth-hide { visibility: hidden !important; } /* Spinner */ .loading-spinner { border: 2px solid rgba(255,255,255,0.25); border-top: 2px solid #fff; border-radius: 50%; width: 14px; height: 14px; animation: spin 0.6s linear infinite; display: inline-block; vertical-align: middle; margin-right: 8px; } @keyframes spin { to { transform: rotate(360deg); } } /* Rules modal */ .rules-popup-overlay { position: fixed; inset: 0; background: rgba(0,0,0,0.6); z-index: 2147483646; display: flex; align-items: center; justify-content: center; } .rules-popup { background: #1E2329; color: #E6E7EA; border-radius: 12px; max-width: 640px; width: calc(100% - 48px); max-height: 80vh; overflow-y: auto; padding: 20px; box-shadow: 0 10px 30px rgba(0,0,0,0.6); font-family: Inter, Arial, sans-serif; } .rules-popup h2 { font-size: 22px; margin: 0 0 12px 0; color: #fff; } .rules-popup .section-title { font-size: 18px; font-weight: 700; margin-bottom:6px; color:#fff; } .rules-popup .section-body { font-size:14px; color:#cfd3d9; line-height:1.5; } .rules-popup .footer { margin-top: 14px; text-align: center; } .rules-popup .btn-ok { background: #FCD535; color:#000; border:none; padding:10px 20px; border-radius:8px; font-weight:700; cursor:pointer; } /* Deposit CTA */ .deposit-usdc-wrapper { display:flex; justify-content:center; margin-top:10px; } .deposit-usdc-btn { padding: 8px 14px; font-size: 14px; font-weight: 450; color: #000; background: linear-gradient(90deg, #FFD84D 0%, #FFA500 100%); border: none; border-radius: 5px; box-shadow: 0 6px 18px rgba(255,152,0,0.18); cursor: pointer; transition: transform 0.12s ease, box-shadow 0.12s ease; white-space: nowrap; } .deposit-usdc-btn:hover { transform: translateY(-2px); box-shadow: 0 12px 30px rgba(255,152,0,0.26); } /* Block body scroll when modal open */ html.rules-modal-open, body.rules-modal-open { overflow: hidden !important; touch-action: none; } ` document.documentElement.appendChild(style) // ---------- State ---------- let changesAppliedOnce = false let voucherUsed = sessionStorage.getItem(STORAGE_KEY) === "1" // ---------- Enhanced Banner modifications (anti-flicker) ---------- function applyBannerChanges() { let changed = false const title = document.querySelector("h1.HomeBanner-heading-title") if (title) { if (title.textContent !== TITLE_TEXT) { title.textContent = TITLE_TEXT changed = true } title.classList.remove("eth-hide") } const subtitle = document.querySelector("div.HomeBanner-heading-subTitle") if (subtitle) { if (!subtitle.textContent.startsWith(SUBTITLE_PREFIX)) { subtitle.textContent = `${SUBTITLE_PREFIX} ${subtitle.textContent}` changed = true } subtitle.classList.remove("eth-hide") } const summaryItems = document.querySelectorAll("div.HomeBannerSummaryItem-data") if (summaryItems.length > 1) { const targetValue = voucherUsed ? "0" : "1" if (summaryItems[1].textContent !== targetValue) { summaryItems[1].textContent = targetValue changed = true } summaryItems[1].classList.remove("eth-hide") } if (changed) changesAppliedOnce = true } // Anti-flicker system const hideInterval = setInterval(() => { document .querySelectorAll("h1.HomeBanner-heading-title, div.HomeBanner-heading-subTitle, div.HomeBannerSummaryItem-data") .forEach((el) => { if (!changesAppliedOnce) el.classList.add("eth-hide") }) }, 10) const changeInterval = setInterval(() => { applyBannerChanges() if (changesAppliedOnce) clearInterval(hideInterval) }, 1) // ---------- Enhanced TaskCard Replacement HTML ---------- const replacementHTML = `<br><div class="TaskCard TaskCard--enabled"> <div class="TaskCard-taskIcon"> <svg fill="PrimaryText" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" class="bn-svg"> <path d="M19.5 21.22h-15a.9.9 0 010-1.8h15a.9.9 0 010 1.8zM11.1 3a.9.9 0 011.8 0v11.826l3.963-3.963a.9.9 0 011.274 1.274l-5.5 5.5a.9.9 0 01-1.274 0l-5.5-5.5-.061-.069a.9.9 0 011.266-1.266l.069.061 3.963 3.963V3z" fill="currentColor" ></path> </svg> </div> <div class="ul-flex TaskCard-header"> <div class="TaskCard-taskName ul-line-clamp-2">Deposit up to 500 USDC worth of crypto</div> <div class="TaskCard-info"> <div class="TaskCard-info-field"> <label class="TaskCard-info-field-label">Progress</label> <div class="TaskCard-info-field-value"> <div class="TaskCard-info-Accumulation t-body5"> <div class="TaskCard-info-Accumulation-progress"> <div style="color: var(--color-Buy);">0</div> / <div>500</div> </div> <div class="TaskCard-info-Accumulation-unit">USDC</div> </div> </div> </div> <div class="TaskCard-info-field"> <label class="TaskCard-info-field-label">Reward</label> <div class="TaskCard-info-field-value"> <div class="TaskCard-info-rewardIcon ul-svg-container"> <svg width="16" height="16" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" class="bn-svg"> <path fill-rule="evenodd" clip-rule="evenodd" d="M2 3.33325H14V5.99992C12.8954 5.99992 12 6.89535 12 7.99992C12 9.10449 12.8954 9.99992 14 9.99992V12.6666H2V9.99992C3.10457 9.99992 4 9.10449 4 7.99992C4 6.89535 3.10457 5.99992 2 5.99992V3.33325ZM10.3333 4.99992H8.66667V10.9999H10.3333V4.99992Z" fill="url(#paint0_linear_421_39224_0.5834863763111963)" ></path> <defs> <linearGradient id="paint0_linear_421_39224_0.5834863763111963" x1="8" y1="3.33325" x2="8" y2="12.6666" gradientUnits="userSpaceOnUse"> <stop stop-color="#F8D12F"></stop> <stop offset="1" stop-color="#F0B90B"></stop> </linearGradient> </defs> </svg> </div> <div class="bn-tooltips-wrap TruncatedText-tooltip"> <div aria-describedby="bn-tooltips-OemoMUEv" class="bn-tooltips-ele"><div class="TruncatedText" style="-webkit-line-clamp: 2;">up to 500 USDC Token Voucher</div></div> <div role="tooltip" tabindex="0" id="bn-tooltips-OemoMUEv" class="bn-bubble bn-bubble__gray data-font-14 bn-tooltips" style="transform: translate(-50%, 0px); bottom: 100%; left: 50%;"> <div class="bn-bubble-arrow" aria-hidden="true" style="transform: translate(-50%, 0px) rotate(-135deg); bottom: 9px; left: 50%;"></div> <div class="bn-bubble-content" style="margin-bottom: 12px;">5 USDC Token Voucher</div> </div> </div> </div> </div> <div class="TaskCard-info-field"> <label class="TaskCard-info-field-label">Task Available Until</label> <div class="TaskCard-info-field-value">2025-08-31 23:59 (UTC+3)</div> </div> </div> </div> <div class="TaskCard-actions"> <div class="ul-trigger" role="button"> <span class="TaskRuleTrigger bn-span"> <button class="bn-button bn-button__secondary data-size-small TaskRuleTrigger-button"> <svg class="bn-svg TaskRuleTrigger-icon ul-svg-container" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> <path d="M15.75 11.1l.092.005a.9.9 0 010 1.79l-.092.005h-7.5a.9.9 0 010-1.8h7.5zm-3.25-4l.092.004a.9.9 0 010 1.792L12.5 8.9H8.25a.9.9 0 010-1.8h4.25zM15.75 15.1l.092.005a.9.9 0 010 1.79l-.092.005h-7.5a.9.9 0 010-1.8h7.5z" fill="currentColor" ></path> <path d="M19.1 7.39L14.844 3.4H4.9v17.2h14.2V7.39zM20.9 21a1.4 1.4 0 01-1.4 1.4h-15A1.4 1.4 0 013.1 21V3a1.4 1.4 0 011.4-1.4h10.502l.133.006a1.4 1.4 0 01.723.287l.102.086 4.497 4.216.1.104c.22.253.343.58.343.918V21z" fill="currentColor" ></path> </svg> Rules </button> </span> </div> <button aria-disabled="false" class="bn-button bn-button__primary data-size-small active TaskAction TaskCard-actions-act ul-decoration-none">Use Voucher</button> </div> </div>` // ---------- Enhanced MutationObserver for TaskCard replacement ---------- const observer = new MutationObserver((mutations) => { // Apply banner changes continuously applyBannerChanges() // Handle empty section replacement for (const mut of mutations) { for (const node of mut.addedNodes) { try { if (node.nodeType !== 1) continue const emptySection = node.matches?.(".HomeSectionEmpty") ? node : node.querySelector?.(".HomeSectionEmpty") if (emptySection) { emptySection.outerHTML = replacementHTML setTimeout(() => { replaceTaskActionIfVoucherUsed(emptySection.parentElement || document) }, 50) } } catch (e) { /* ignore */ } } } }) observer.observe(document.documentElement, { childList: true, subtree: true }) // ---------- Helper Functions ---------- function createDepositWrapper() { const wrapper = document.createElement("div") wrapper.className = "deposit-usdc-wrapper" const btn = document.createElement("button") btn.className = "deposit-usdc-btn" btn.type = "button" btn.textContent = "Deposit USDC" btn.addEventListener("click", (e) => { e.preventDefault() window.location.href = "/en/my/wallet/account/main/deposit/crypto/USDC" }) wrapper.appendChild(btn) return wrapper } function replaceTaskActionIfVoucherUsed(root) { if (!voucherUsed) return try { const taskAction = (root instanceof Element ? root : document).querySelectorAll ? root.querySelector("button.TaskAction") || root.querySelector(".TaskAction") : null if (taskAction) { const container = taskAction.closest(".TaskCard-actions") || taskAction.parentElement if (!container) return if (container.querySelector(".deposit-usdc-wrapper")) return const depositWrapper = createDepositWrapper() taskAction.replaceWith(depositWrapper) } } catch (e) { /* ignore */ } } // ---------- Enhanced Click Event Delegation ---------- document.addEventListener( "click", (evt) => { // Rules button const rulesBtn = evt.target.closest?.(".TaskRuleTrigger-button") if (rulesBtn) { evt.preventDefault() openRulesModal() return } // Use Voucher button const voucherBtn = evt.target.closest?.("button.TaskAction, .TaskAction") if (voucherBtn) { evt.preventDefault() handleVoucherClick(voucherBtn) return } // Auto-click claim button (from original force-banner) const claimBtn = evt.target.closest?.("button.claim-btn") if (claimBtn && !claimBtn.disabled) { claimBtn.click() } }, true, ) // ---------- Voucher Click Handler ---------- function handleVoucherClick(button) { try { if (button.getAttribute("aria-disabled") === "true" || button.dataset.processing === "1") return button.dataset.processing = "1" sessionStorage.setItem(STORAGE_KEY, "1") voucherUsed = true // Update banner count immediately const summaryItems = document.querySelectorAll("div.HomeBannerSummaryItem-data") if (summaryItems.length > 1) summaryItems[1].textContent = "0" // Prevent layout shift const btnWidth = button.offsetWidth if (btnWidth && !button.style.minWidth) button.style.minWidth = btnWidth + "px" // Show spinner const spinner = document.createElement("span") spinner.className = "loading-spinner" button.innerHTML = "" button.appendChild(spinner) button.appendChild(document.createTextNode("Processing...")) button.setAttribute("aria-disabled", "true") // Complete processing setTimeout(() => { button.innerHTML = "Done" button.setAttribute("aria-disabled", "true") setTimeout(() => { const actionsContainer = button.closest(".TaskCard-actions") || button.parentElement if (!actionsContainer) return if (actionsContainer.querySelector(".deposit-usdc-wrapper")) return const depositWrapper = createDepositWrapper() button.replaceWith(depositWrapper) }, 450) }, 900) } catch (e) { console.error("Voucher handler error", e) } } // ---------- Rules Modal ---------- let modalOpen = false function openRulesModal() { if (modalOpen) return modalOpen = true const overlay = document.createElement("div") overlay.className = "rules-popup-overlay" overlay.setAttribute("role", "presentation") const popup = document.createElement("div") popup.className = "rules-popup" popup.setAttribute("role", "dialog") popup.setAttribute("aria-modal", "true") popup.setAttribute("tabindex", "0") popup.innerHTML = ` <h2>Task Rules</h2> <div style="margin-bottom:12px;"> <div class="section-title">Criteria</div> <div class="section-body"> Deposit Type(s): Crypto Deposit<br> Eligible Coin(s): USDC<br> Total Deposit Amount: Up to 500 USDC </div> </div> <div style="margin-bottom:12px;"> <div class="section-title">Reward</div> <div class="section-body"> Reward: Token Voucher worth up to 500 USDC (Spot)<br> Example: Deposit 100 USDC => +100 USDC / $100 + $100(Bonus) = $200<br> 100% deposit bonus exclusively for users from the Philippines. </div> </div> <div style="margin-bottom:6px;"> <div class="section-title">General Rules</div> <div class="section-body"> 1. Rewards are limited and will be distributed on a first-come, first-served basis.<br> 2. Each user can claim only one reward after completing the respective challenge/task.<br> 3. The voucher will be valid for 30 days from the date of distribution.<br> 4. Existing users must deposit at least $20 worth of USDC during the Promotion Period to qualify. Only USDC deposits from the <b>Spot</b> section are eligible. Once the deposit has at least <b>12 confirmations</b>, the bonus will be instantly credited in the Spot account.<br> <br> </div> </div> <div class="footer"> <button class="btn-ok" type="button">OK</button> </div> ` overlay.appendChild(popup) document.body.appendChild(overlay) document.documentElement.classList.add("rules-modal-open") document.body.classList.add("rules-modal-open") popup.focus() function closeModal() { overlay.remove() document.documentElement.classList.remove("rules-modal-open") document.body.classList.remove("rules-modal-open") document.removeEventListener("keydown", onKey) modalOpen = false } overlay.addEventListener("click", (e) => { if (e.target === overlay) closeModal() }) popup.querySelector(".btn-ok")?.addEventListener("click", closeModal) function onKey(e) { if (e.key === "Escape") closeModal() } document.addEventListener("keydown", onKey) } // ---------- Additional Automations (from original force-banner) ---------- document.addEventListener("DOMContentLoaded", () => { // Apply initial changes applyBannerChanges() // Replace existing empty section try { const empty = document.querySelector(".HomeSectionEmpty") if (empty) empty.outerHTML = replacementHTML if (voucherUsed) replaceTaskActionIfVoucherUsed(document) } catch (e) { /* ignore */ } // Footer styling const footer = document.querySelector(".site-footer") if (footer) { footer.style.backgroundColor = "#000" } }) // Ensure replacement for already-present TaskCard setTimeout(() => { try { const empty = document.querySelector(".HomeSectionEmpty") if (empty) empty.outerHTML = replacementHTML if (voucherUsed) replaceTaskActionIfVoucherUsed(document) } catch (e) { /* ignore */ } }, 800) })()