GitHub Card Input

Automate GitHub Card Input

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да инсталирате разширение, като например Tampermonkey .

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name         GitHub Card Input
// @description  Automate GitHub Card Input
// @version      0.2
// @license      MIT
// @author       LD
// @match        https://www.zuora.com/apps/PublicHostedPageLite.do**
// @match        https://www.recaptcha.net/recaptcha/enterprise/anchor*
// @grant        none
// @namespace https://greasyfork.org/users/1218336
// ==/UserScript==

(function () {
    'use strict';

    function elementReady(selector) {
        console.log(selector);
        return new Promise((resolve, reject) => {
            let el = document.querySelector(selector);
            if (el) {
                resolve(el);
            }
            new MutationObserver((mutationRecords, observer) => {
                    // Query for elements matching the specified selector
                    Array.from(document.querySelectorAll(selector)).forEach((element) => {
                        resolve(element);
                        //Once we have resolved we don't need the observer anymore.
                        observer.disconnect();
                    });
                })
                .observe(document.documentElement, {
                    childList: true,
                    subtree: true
                });
        });
    }

    function getRandomInt(min, max) {
        return Math.floor(Math.random() * (max - min + 1)) + min;
    }

    function getRandomLength(length) {
        let min = Math.pow(10, length - 1);
        let max = Math.pow(10, length) - 1;
        return getRandomInt(min, max);
    }

    function generateLastDigit(cardNumber) {
        var total = 0;

        // Apply Luhn algorithm rules on the card number
        for (var i = 0; i < 15; i++) {
            var digit = parseInt(cardNumber.charAt(i));

            if (i % 2 == 0) {
                digit *= 2;
                if (digit > 9) {
                    digit -= 9;
                }
            }
            total += digit;
        }

        // Generate the last digit such that the whole number passes Luhn check
        var lastDigit = (10 - (total % 10)) % 10;

        return lastDigit;
    }

    function generateCard(bin = null, month = null, year = null, cvv = null) {
        // 如果月份为null,则生成一个1到12之间的随机月份
        if (month === null) {
            month = getRandomInt(1, 12).toString();
            month = month.padStart(2, '0'); // 补全两位
        }
        // 如果年份为null,则生成一个当前年份到未来10年内的随机年份
        if (year === null) {
            const currentYear = new Date().getFullYear();
            year = getRandomInt(currentYear, currentYear + 10).toString();
        }
        // 如果cvv为null,则生成一个100到999之间的随机cvv码
        if (cvv === null) {
            cvv = getRandomLength(3);
        }
        if (bin) {
            bin += getRandomLength(15 - bin.length);
        } else {
            bin = getRandomLength(15);
        }
        bin += generateLastDigit(bin);
        // 将给定的 bin、month、year 和 cvv 拼接成指定的格式
        const card = `${bin}|${month}|${year}|${cvv}`;
        return card;
    }

    function setForm(cardInfo) {
        let cardArr = cardInfo.split('|');
        let cardNumber = cardArr[0];
        let cardMonth = cardArr[1];
        let cardYear = cardArr[2];
        let cardSecurityCode = cardArr[3];
        elementReady("#input-creditCardNumber").then(() => {
            document.querySelector("#input-creditCardNumber").click();
            document.querySelector("#input-creditCardNumber").value = cardNumber;
            document.querySelector("#input-creditCardExpirationMonth").click();
            document.querySelector("#input-creditCardExpirationMonth").querySelector(
                `option[value='${cardMonth}']`).selected = true;
            document.querySelector("#input-creditCardExpirationYear").click();
            document.querySelector("#input-creditCardExpirationYear").querySelector(
                `option[value='${cardYear}']`).selected = true;
            document.querySelector("#input-cardSecurityCode").click();
            document.querySelector("#input-cardSecurityCode").value = cardSecurityCode;
            // 等待验证码加载完成
            setTimeout(function () {
                document.querySelector("#submitButton").click();
            }, 8000);
            var iframes = document.getElementsByTagName('iframe'); // 获取页面上所有的 iframe
            console.log(iframes)
            for (var i = 0; i < iframes.length; i++) {
                var iframe = iframes[i];
                // 判断 iframe 的 title,找到你想要的那个
                if (iframe.getAttribute('title') === 'reCAPTCHA') {
                    iframe.onload = function () {
                        // alert('子iframe已加载完毕!');
                        document.querySelector("#submitButton").click();
                    }
                    break;
                }
            }
        });
    }
    // TODO 更改
    let cardInfo = generateCard("xxxxxxxx", "xx", "xxxx");
    console.log(cardInfo);
    setForm(cardInfo)

})();