Age Verification Bypass

Skips age verification screens on AgeChecker.net, AgeVerif.com, AliExpress, Bluesky, Reddit, Veriff. Ported from Firefox add-on by helloyanis (https://github.com/helloyanis/age-verification-bypass).

Bu betiği kurabilmeniz için Tampermonkey, Greasemonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği yüklemek için Tampermonkey gibi bir uzantı yüklemeniz gerekir.

Bu betiği kurabilmeniz için Tampermonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Userscripts gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği indirebilmeniz için ayrıca Tampermonkey gibi bir eklenti kurmanız gerekmektedir.

Bu betiği yüklemek için bir betik yöneticisi eklentisi yüklemeniz gerekecektir.

(Zaten bir betik yöneticim var, hadi yükleyelim!)

Bu stili yüklemek için Stylus gibi bir uzantı yüklemeniz gerekir.

Bu stili yüklemek için Stylus gibi bir uzantı kurmanız gerekir.

Bu stili yükleyebilmek için Stylus gibi bir uzantı yüklemeniz gerekir.

Bu stili yüklemek için bir kullanıcı stili yöneticisi uzantısı yüklemeniz gerekir.

Bu stili yüklemek için bir kullanıcı stili yöneticisi uzantısı kurmanız gerekir.

Bu stili yükleyebilmek için bir kullanıcı stili yöneticisi uzantısı yüklemeniz gerekir.

(Zateb bir user-style yöneticim var, yükleyeyim!)

// ==UserScript==
// @name         Age Verification Bypass
// @name:en      Age Verification Bypass
// @name:pt-BR   Age Verification Bypass
// @namespace    https://greasyfork.org/en/users/1301195-luciano-inf
// @version      1.1.2
// @description  Skips age verification screens on AgeChecker.net, AgeVerif.com, AliExpress, Bluesky, Reddit, Veriff. Ported from Firefox add-on by helloyanis (https://github.com/helloyanis/age-verification-bypass).
// @description:pt-BR  Pula telas de verificação de idade em AgeChecker.net, AgeVerif.com, AliExpress, Bluesky, Reddit, Veriff. Portado do add-on Firefox por helloyanis (https://github.com/helloyanis/age-verification-bypass).
// @author       Luciano.Oliveirals
// @license      MIT
// @run-at       document-start
// @grant        none
// @match        *://*/*
// @icon         https://raw.githubusercontent.com/LucianoSkx/age-verification-bypass/main/icon.svg
// @supportURL   https://greasyfork.org/scripts/587561-age-verification-bypass
// @homepageURL  https://github.com/LucianoSkx/age-verification-bypass
// ==/UserScript==

(function () {
    'use strict';

    function inject(fn) {
        var el = document.createElement('script');
        el.textContent = '(' + fn.toString() + ')();';
        document.documentElement.appendChild(el);
        el.remove();
    }

    /* =============================================
       Fetch Interceptor
       ============================================= */
    var origFetch = window.fetch;
    if (typeof origFetch === 'function') {
        window.fetch = function (input, init) {
            var url = (typeof input === 'string' ? input : (input && input.url)) || '';

            // --- AgeChecker.net API ---
            if (url.indexOf('api.agechecker.net/v1/create') !== -1 || url.indexOf('sa.agechecker.net/ac_create') !== -1) {
                return new Response(JSON.stringify({ uuid: crypto.randomUUID(), status: 'accepted' }), {
                    status: 200,
                    statusText: 'OK',
                    headers: { 'Content-Type': 'application/json' }
                });
            }

            // --- Veriff session API ---
            if (url.indexOf('saas.veriff.com/api/v2/sessions') !== -1) {
                return origFetch.call(window, input, init).then(function (r) {
                    return r.clone().json().then(function (data) {
                        if (data.vendorIntegration && data.vendorIntegration.callback) {
                            window.location.href = data.vendorIntegration.callback;
                        }
                        return r;
                    });
                });
            }

            var result = origFetch.call(window, input, init);

            // --- Bluesky labeler ---
            if (url.indexOf('public.api.bsky.app/xrpc/app.bsky.labeler.getServices') !== -1) {
                return result.then(function (r) {
                    return r.clone().json().then(function (data) {
                        if (data.views) {
                            data.views.forEach(function (view) {
                                view.policies.labelValueDefinitions = (view.policies.labelValues || []).map(function (label) {
                                    return {
                                        adultOnly: false,
                                        blurs: 'media',
                                        defaultSetting: 'warn',
                                        identifier: label,
                                        locales: [{ description: 'Labeled as ' + label, lang: 'en', name: label }],
                                        severity: 'inform'
                                    };
                                });
                            });
                        }
                        return new Response(JSON.stringify(data), {
                            status: r.status,
                            statusText: r.statusText,
                            headers: r.headers
                        });
                    });
                });
            }

            // --- Bluesky age assurance ---
            if (url.indexOf('public.api.bsky.app/xrpc/app.bsky.ageassurance.getConfig') !== -1) {
                return result.then(function (r) {
                    return r.clone().json().then(function (data) {
                        data.regions = [];
                        return new Response(JSON.stringify(data), {
                            status: r.status,
                            statusText: r.statusText,
                            headers: r.headers
                        });
                    });
                });
            }

            return result;
        };
    }

    /* =============================================
       AgeChecker.net — inject auto-accept SDK
       ============================================= */
    inject(function () {
        var config = window.AgeCheckerConfig || {};

        function complete() {
            if (typeof config.onstatuschanged === 'function') {
                config.onstatuschanged({ uuid: crypto.randomUUID(), status: 'accepted' });
            }
            if (config.redirect_url) {
                window.location.href = config.redirect_url;
                return;
            }
            if (typeof config.onclose === 'function') config.onclose();
            if (typeof config.onclosed === 'function') config.onclosed();
        }

        window.AgeCheckerAPI = { show: complete, close: complete };
        if (typeof config.onready === 'function') config.onready();
    });

    /* =============================================
       AgeVerif.com — inject auto-accept SDK
       ============================================= */
    inject(function () {
        function parseQuery(url) {
            var params = {};
            var q = (url.split('?')[1] || '').split('#')[0];
            q.split('&').forEach(function (part) {
                if (!part) return;
                var kv = part.split('=');
                params[decodeURIComponent(kv[0])] = kv[1] ? decodeURIComponent(kv[1]) : true;
            });
            return params;
        }

        function safeCall(fnName, payload) {
            if (!fnName) return;
            var fn = window[fnName];
            if (typeof fn === 'function') {
                try { fn(payload); } catch (e) { console.error('[avb] callback error:', e); }
            }
        }

        function emit(eventName, detail) {
            window.dispatchEvent(new CustomEvent(eventName, { detail: detail }));
            var legacyMap = {
                'ageverif:load': window.ageverifLoaded,
                'ageverif:ready': window.ageverifReady,
                'ageverif:success': window.ageverifSuccess
            };
            if (legacyMap[eventName]) {
                try { legacyMap[eventName](detail); } catch (e) { console.error('[avb] legacy error:', e); }
            }
        }

        function randStr(n) {
            var c = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', o = '';
            for (var i = 0; i < n; i++) o += c[Math.floor(Math.random() * c.length)];
            return o;
        }

        function createVerification() {
            var now = Math.floor(Date.now() / 1000);
            var expiresIn = 100 * 365 * 24 * 60 * 60;
            return {
                uid: randStr(24),
                country: 'FR',
                countrySubdivision: null,
                assuranceLevel: 'STRICT',
                ageThreshold: 0,
                reused: false,
                expiresAt: now + expiresIn,
                expiresIn: expiresIn,
                token: randStr(48)
            };
        }

        var el = document.currentScript;
        var src = el ? el.src : '';
        var params = parseQuery(src);
        var hasNoStart = Object.prototype.hasOwnProperty.call(params, 'nostart');

        var config = {
            onload: params.onload,
            onready: params.onready,
            onsuccess: params.onsuccess,
            onclose: params.onclose,
            onerror: params.onerror
        };

        var ageverif = {
            started: false,
            events: {},
            on: function (event, handler) {
                if (!this.events[event]) this.events[event] = [];
                this.events[event].push(handler);
            },
            emitLocal: function (event, payload) {
                var list = this.events[event] || [];
                list.forEach(function (fn) { try { fn(payload); } catch (e) { } });
            },
            start: function () {
                if (this.started) return;
                this.started = true;
                var verification = createVerification();
                var readyPayload = { verification: verification };
                this.emitLocal('ready', readyPayload);
                emit('ageverif:ready', readyPayload);
                safeCall(config.onready, readyPayload);
                var successPayload = { verification: verification };
                this.emitLocal('success', successPayload);
                emit('ageverif:success', successPayload);
                safeCall(config.onsuccess, successPayload);
                this.emitLocal('close', {});
                safeCall(config.onclose, {});
            }
        };

        window.ageverif = ageverif;

        var loadPayload = { verified: true, verification: createVerification() };
        emit('ageverif:load', loadPayload);
        safeCall(config.onload, loadPayload);

        if (window.ageverif && typeof window.ageverif.on === 'function') {
            try { window.ageverif.on('ready', function () { ageverif.start(); }); } catch (e) { }
        }

        if (!hasNoStart) ageverif.start();
    });

    /* =============================================
       Veriff SDK spoof
       ============================================= */
    inject(function () {
        window.Veriff = function (config) {
            config = config || {};
            return {
                setParams: function () { },
                mount: function () {
                    if (typeof config.onSession === 'function') {
                        config.onSession(null, {
                            status: 'success',
                            verification: {
                                id: crypto.randomUUID(),
                                url: '',
                                host: window.location.hostname,
                                status: 'approved',
                                sessionToken: ''
                            }
                        });
                    }
                }
            };
        };
    });

    inject(function () {
        var MESSAGES = { STARTED: 'STARTED', FINISHED: 'FINISHED', SUBMITTED: 'SUBMITTED' };
        window.veriffSDK = {
            createVeriffFrame: function (opts) {
                if (typeof opts.onEvent !== 'function') return;
                opts.onEvent(MESSAGES.STARTED);
                opts.onEvent(MESSAGES.FINISHED);
                opts.onEvent(MESSAGES.SUBMITTED);
            }
        };
    });

    /* =============================================
       DOM-based bypasses (AliExpress, Reddit, Bluesky sensitive media)
       ============================================= */
    document.addEventListener('DOMContentLoaded', function () {
        /* ---- AliExpress ---- */
        function cleanAliExpress() {
            document.querySelectorAll('.ls_ke, .ho_g9, .J_SAFETY_FILER_MODAL, ._1FlkA, img[src*="72x72.png"]').forEach(function (el) { el.remove(); });
            document.querySelectorAll('img.nf_bj').forEach(function (el) { el.classList.remove('nf_bj'); });
            document.querySelectorAll('.card-dsa-wrapper').forEach(function (el) { el.classList.remove('card-dsa-wrapper'); });
            document.querySelectorAll('.dsa--visible--wrapper').forEach(function (el) { el.classList.remove('dsa--visible--wrapper'); });
        }
        cleanAliExpress();
        setInterval(cleanAliExpress, 2000);

        /* ---- Reddit NSFW popup ---- */
        function cleanReddit() {
            var blockedId = 'configured-xpromo-blocking_xpromo_nsfw_blocking_desktop';
            var containerTag = 'xpromo-nsfw-blocking-container';
            var target = document.getElementById(blockedId);
            if (target) target.remove();
            var container = document.querySelector(containerTag);
            if (container && container.shadowRoot) {
                var prompt = container.shadowRoot.querySelector('.prompt');
                if (prompt) prompt.remove();
            }
            Array.from(document.querySelectorAll('style')).filter(function (s) {
                return s.innerText && s.innerText.indexOf('.rpl-scroll-lock') !== -1;
            }).forEach(function (s) { s.remove(); });
        }
        cleanReddit();

        var observer = new MutationObserver(function (mutations) {
            for (var m = 0; m < mutations.length; m++) {
                for (var n = 0; n < mutations[m].addedNodes.length; n++) {
                    var node = mutations[m].addedNodes[n];
                    if (node.nodeType !== 1) continue;
                    if (node.id === 'configured-xpromo-blocking_xpromo_nsfw_blocking_desktop') { node.remove(); continue; }
                    if (node.tagName === 'XPROMO-NSFW-BLOCKING-CONTAINER') {
                        var p = node.shadowRoot && node.shadowRoot.querySelector('.prompt');
                        if (p) p.remove();
                    }
                    var d = node.querySelector && node.querySelector('#configured-xpromo-blocking_xpromo_nsfw_blocking_desktop');
                    if (d) d.remove();
                    var d2 = node.querySelector && node.querySelector('xpromo-nsfw-blocking-container');
                    if (d2 && d2.shadowRoot) {
                        var p2 = d2.shadowRoot.querySelector('.prompt');
                        if (p2) p2.remove();
                    }
                }
            }
        });
        observer.observe(document.documentElement, { childList: true, subtree: true });

        /* ---- Reddit CSS strip ---- */
        var TEST_IDS = ['nsfw-bypassable-modal-client-css', 'experiences-client-css'];
        var cssObserver = new MutationObserver(function () {
            document.querySelectorAll('style[data-testid]').forEach(function (el) {
                if (TEST_IDS.indexOf(el.getAttribute('data-testid')) !== -1) el.remove();
            });
        });
        cssObserver.observe(document.head || document.documentElement, { childList: true, subtree: true });

        /* ---- Bluesky sensitive media reveal ---- */
        function cleanBluesky() {
            document.querySelectorAll('div[data-testid="contentHider"], div[data-testid="contentHoor"], div[data-testid="blurred-media"]').forEach(function (el) { el.remove(); });
        }
        cleanBluesky();
        var bskyObserver = new MutationObserver(function () {
            if (window.location.hostname.indexOf('bsky') !== -1) cleanBluesky();
        });
        bskyObserver.observe(document.documentElement, { childList: true, subtree: true });
    });
})();