ZeroAd: Poki

Instant, zero-delay Poki SDK bypass with immediate hooks

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         ZeroAd: Poki
// @namespace    https://greasyfork.org/users/zeroadv4
// @version      4.0.1
// @description  Instant, zero-delay Poki SDK bypass with immediate hooks
// @author       ZeroAd Team
// @match        *://*.poki.com/*
// @match        *://poki.com/*
// @grant        none
// @run-at       document-start
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    const CONFIG = {
        DEBUG: true               // set false for production silence
    };

    const METRICS = {
        hooksInstalled: 0,
        interceptedCalls: 0,
        failedHooks: 0,
        rewardsGranted: 0
    };

    const log = (...args) => CONFIG.DEBUG && console.log('[ZeroAd:Poki]', ...args);
    const warn = (...args) => CONFIG.DEBUG && console.warn('[ZeroAd:Poki]', ...args);
    const error = (...args) => console.error('[ZeroAd:Poki]', ...args);

    function safeDispatchEvent(target, eventName) {
        try {
            target.dispatchEvent(new CustomEvent(eventName, { bubbles: true }));
        } catch (e) { /* ignore */ }
    }

    function safeCallback(fn, ...args) {
        if (typeof fn === 'function') {
            try { fn(...args); } catch (e) { warn('Callback error:', e); }
        }
    }

    // ═══════ CORE HOOK (instant, no delays) ═══════
    function hookPokiSDK(sdk) {
        if (!sdk || sdk.__zaHooked) return false;

        try {
            sdk.__zaHooked = true;

            // Midroll ads → skip
            if (typeof sdk.commercialBreak === 'function') {
                sdk.commercialBreak = () => {
                    log('commercialBreak skipped');
                    METRICS.interceptedCalls++;
                    return Promise.resolve();
                };
            }

            // Rewarded ads → instant reward, no delay
            if (typeof sdk.rewardedBreak === 'function') {
                sdk.rewardedBreak = function(callbacks) {
                    log('rewardedBreak → instant reward');
                    METRICS.interceptedCalls++;

                    let onStart = null, onReward = null;
                    if (typeof callbacks === 'function') {
                        onReward = callbacks;
                    } else if (callbacks && typeof callbacks === 'object') {
                        onStart = callbacks.onStart;
                        onReward = callbacks.adFinished || callbacks.onComplete || callbacks.onReward;
                    }

                    safeCallback(onStart);
                    safeCallback(onReward);          // <── instant, no setTimeout

                    METRICS.rewardsGranted++;
                    safeDispatchEvent(window, 'rewardedComplete');
                    safeDispatchEvent(window, 'rewardGranted');
                    safeDispatchEvent(window, 'adComplete');
                    log('✅ Reward granted instantly');
                    return Promise.resolve(true);
                };
            }

            // Display ad methods
            if (typeof sdk.hoistDisplayAd === 'function') {
                sdk.hoistDisplayAd = () => { METRICS.interceptedCalls++; return false; };
            }
            if (typeof sdk.destroyDisplayAd === 'function') {
                sdk.destroyDisplayAd = () => { METRICS.interceptedCalls++; };
            }

            // Platform-specific ad breaks
            ['playgroundCommercialBreak', 'platformCommercialBreak'].forEach(m => {
                if (typeof sdk[m] === 'function') {
                    sdk[m] = () => { log(m + ' skipped'); METRICS.interceptedCalls++; return Promise.resolve(); };
                }
            });

            // Internal monetisation object (if present)
            if (sdk.__monetization) {
                if (typeof sdk.__monetization.requestAd === 'function') {
                    sdk.__monetization.requestAd = () => Promise.resolve();
                }
                if (typeof sdk.__monetization.displayAd === 'function') {
                    sdk.__monetization.displayAd = () => false;
                }
                if (typeof sdk.__monetization.init === 'function') {
                    sdk.__monetization.init = () => Promise.resolve();
                }
            }

            // Analytics (no-op)
            ['happyTime','gameLoading','gameplayStart','gameplayStop','captureError','sendEvent'].forEach(m => {
                if (typeof sdk[m] === 'function') sdk[m] = () => {};
            });

            METRICS.hooksInstalled++;
            log('✓ PokiSDK hooked instantly');
            return true;

        } catch (e) {
            error('Hook failed:', e);
            METRICS.failedHooks++;
            return false;
        }
    }

    // ═══════ IMMEDIATE TRAP (catches any late SDK assignment) ═══════
    function installTrap() {
        let _PokiSDK = window.PokiSDK;
        Object.defineProperty(window, 'PokiSDK', {
            configurable: true,
            enumerable: true,
            get() { return _PokiSDK; },
            set(newValue) {
                _PokiSDK = newValue;
                if (newValue && !newValue.__zaHooked) {
                    hookPokiSDK(newValue);
                }
            }
        });
        log('✓ PokiSDK trap installed');
    }

    // ═══════ ATTEMPT HOOK ON EXISTING SDK (rare but safe) ═══════
    function hookExistingIfPresent() {
        if (window.PokiSDK && !window.PokiSDK.__zaHooked) {
            hookPokiSDK(window.PokiSDK);
        }
    }

    // ═══════ OBSERVE DYNAMIC SCRIPT INJECTION ═══════
    function setupObserver() {
        const observer = new MutationObserver(mutations => {
            for (const mutation of mutations) {
                for (const node of mutation.addedNodes) {
                    if (node.tagName === 'SCRIPT') {
                        const src = (node.src || '').toLowerCase();
                        if (src.includes('poki') && (src.includes('sdk') || src.includes('monetization'))) {
                            log('SDK script detected:', src.substring(0, 80));
                            node.addEventListener('load', () => {
                                // small microtask just to be safe
                                setTimeout(hookExistingIfPresent, 0);
                            });
                        }
                    }
                }
            }
        });
        if (document.documentElement) {
            observer.observe(document.documentElement, { childList: true, subtree: true });
        }
        log('✓ MutationObserver active');
    }

    // ═══════ INIT ═══════
    function initialize() {
        log('ZeroAd: Poki SDK v4.0.1 – Instant reward');
        installTrap();
        hookExistingIfPresent();   // in case SDK already defined (unlikely)
        setupObserver();

        window._zaMetrics = window._zaMetrics || {};
        window._zaMetrics.poki = METRICS;

        // Status in 5s
        setTimeout(() => {
            log('Status:', { hookState: !!window.PokiSDK?.__zaHooked, metrics: METRICS });
        }, 5000);
    }

    initialize();

    // DOM ready fallback
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', hookExistingIfPresent);
    }
})();