Advanced Bypass Paywall with Test Credit Cards

Bypass article paywalls and fetch test credit card data if payment is required.

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Advanced Bypass Paywall with Test Credit Cards
// @namespace    socuul.12ft_shortcut_advanced
// @version      2.3.0
// @description  Bypass article paywalls and fetch test credit card data if payment is required.
// @author       SoCuul
// @license      MIT
// @include      *://*
// @grant        GM_registerMenuCommand
// @grant        GM_openInTab
// @grant        GM_notification
// @grant        GM_setClipboard
// @grant        GM_xmlhttpRequest
// @connect      developers.bluesnap.com
// ==/UserScript==

(function () {
    'use strict';

    // List of custom bypass handlers for specific websites
    const customBypassSites = {
        'nytimes.com': 'https://12ft.io/proxy?q=',
        'wsj.com': 'https://archive.ph/',
        'forbes.com': 'https://outline.com/'
    };

    // Helper function to construct bypass URL
    function constructBypassUrl(base, url) {
        return base + encodeURIComponent(url);
    }

    // General paywall bypass using 12ft.io
    function bypassWith12ft() {
        const newUrl = constructBypassUrl('https://12ft.io/proxy?q=', window.location.href);
        GM_openInTab(newUrl, { active: true });
        GM_notification({ text: "Paywall bypassed via 12ft.io", timeout: 3000 });
    }

    // Custom bypass logic based on specific site handler
    function handleCustomBypass() {
        const hostname = window.location.hostname;
        for (const site in customBypassSites) {
            if (hostname.includes(site)) {
                const newUrl = constructBypassUrl(customBypassSites[site], window.location.href);
                GM_openInTab(newUrl, { active: true });
                GM_notification({ text: `Custom bypass applied for ${site}`, timeout: 3000 });
                return;
            }
        }
        bypassWith12ft();
    }

    // Function to bypass and replace the current tab
    function replaceTabWithBypass() {
        const newUrl = constructBypassUrl('https://12ft.io/proxy?q=', window.location.href);
        window.location.href = newUrl;
    }

    // Add bypass options to the context menu
    GM_registerMenuCommand("Bypass Paywall (New Tab)", handleCustomBypass, "b");
    GM_registerMenuCommand("Bypass Paywall (Replace Current Tab)", replaceTabWithBypass, "r");

    // Option to copy the bypass URL to the clipboard
    GM_registerMenuCommand("Copy Bypass URL", () => {
        const bypassUrl = constructBypassUrl('https://12ft.io/proxy?q=', window.location.href);
        GM_setClipboard(bypassUrl);
        GM_notification({ text: "Bypass URL copied to clipboard!", timeout: 2000 });
    }, "c");

    // Keyboard shortcut for quick bypass
    document.addEventListener('keydown', (e) => {
        if (e.ctrlKey && e.altKey && e.key === 'b') {
            handleCustomBypass();
        }
    });

    // Automatically trigger bypass for specific sites
    if (Object.keys(customBypassSites).some(site => window.location.hostname.includes(site))) {
        handleCustomBypass();
    }

    // Fetch test credit card data from Bluesnap
    async function fetchCreditCardData() {
        const url = 'https://developers.bluesnap.com/reference/test-credit-cards';
        return new Promise((resolve, reject) => {
            GM_xmlhttpRequest({
                method: 'GET',
                url: url,
                onload: (response) => {
                    const parser = new DOMParser();
                    const doc = parser.parseFromString(response.responseText, 'text/html');
                    const creditCards = [];

                    const rows = doc.querySelectorAll('table#test-card-numbers tbody tr');
                    if (rows.length === 0) {
                        GM_notification({ text: "No credit card data found", timeout: 2000 });
                        return resolve([]);
                    }

                    rows.forEach(row => {
                        const cells = row.querySelectorAll('td');
                        creditCards.push({
                            cardType: cells[0]?.textContent.trim(),
                            cardNumber: cells[1]?.textContent.trim(),
                            expDate: cells[2]?.textContent.trim(),
                            result: cells[3]?.textContent.trim()
                        });
                    });

                    resolve(creditCards);
                },
                onerror: (error) => {
                    console.error('Error fetching credit card data:', error);
                    GM_notification({ text: "Failed to fetch test credit card data", timeout: 2000 });
                    reject(error);
                }
            });
        });
    }

    // Function to display fetched credit card data
    async function displayCreditCards() {
        try {
            const cards = await fetchCreditCardData();
            if (cards.length > 0) {
                console.table(cards);
                const cardInfo = cards.map(card => `${card.cardType}: ${card.cardNumber} (Exp: ${card.expDate})`).join('\n');
                GM_notification({ text: "Test credit cards fetched!", timeout: 3000 });
                alert("Test Credit Cards:\n" + cardInfo);
            } else {
                alert("No test credit cards available.");
            }
        } catch (error) {
            alert("Error fetching credit cards. Check console for details.");
        }
    }

    // Check for payment forms or subscription URLs
    function checkForPayment() {
        const isPaymentPage = document.querySelector("form[action*='payment']") || /paywall|subscribe|payment/i.test(window.location.href);
        if (isPaymentPage && confirm("Payment detected. Would you like to fetch test credit card data?")) {
            displayCreditCards();
        }
    }

    // Run payment check after page load
    window.addEventListener('load', checkForPayment);

})();