auto write card info

none

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

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

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

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

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

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         auto write card info
// @namespace    http://tampermonkey.net/
// @version      0.12
// @description  none
// @author       kinger
// @match        https://checkout.stripe.com/*
// @grant        none
// @license      MIT
// ==/UserScript==

//TODO:添加根据国家地区自动填写地址,名称自动填写zhiyang

(function() {
    'use strict';

    console.log('银行卡自动填写脚本已启动');

    //对输入框中的内容进行处理
    function dowithInputText(text)
    {
        //将所有的/替换为|
        text = text.replace(/\//g, '|');
        //正则匹配所有的CVV
        let matches = text.match(/\d{16}\|(\d{1}|\d{2})\|(\d{2}|\d{4})\|(\d{3}|\d{4})/g);
        return matches?.join('\n') || text;
    }

    // 创建面板函数
    function createPanel() {
        // 检查面板是否已存在
        if (document.getElementById('autofill-panel')) {
            console.log('面板已存在,跳过创建');
            return;
        }

        // 创建面板
        var panel = document.createElement('div');
        panel.id = 'autofill-panel';
        panel.style.position = 'fixed';
        panel.style.top = '20px';
        panel.style.right = '20px';
        panel.style.width = '350px';
        panel.style.backgroundColor = 'white';
        panel.style.border = '2px solid #ccc';
        panel.style.padding = '15px';
        panel.style.zIndex = '10000';
        panel.style.boxShadow = '0 0 15px rgba(0,0,0,0.3)';
        panel.style.fontSize = '14px';
        panel.style.borderRadius = '8px';
        panel.style.opacity = '0.95';
        panel.style.fontFamily = 'Arial, sans-serif';

        // 创建标题
        var title = document.createElement('h3');
        title.textContent = '银行卡自动填写';
        title.style.marginTop = '0';
        title.style.marginBottom = '10px';
        panel.appendChild(title);

        // 创建文本区域
        var textarea = document.createElement('textarea');
        textarea.id = 'card-input';
        textarea.rows = 8;
        textarea.cols = 40;
        textarea.placeholder = '每行输入一张卡,格式:\n卡号|月|年|CVC';
        textarea.style.width = '100%';
        textarea.style.boxSizing = 'border-box';
        textarea.style.padding = '5px';
        textarea.style.fontSize = '14px';
        panel.appendChild(textarea);

        // 创建提交按钮
        var button = document.createElement('button');
        button.id = 'submit-button';
        button.textContent = '填入卡号';
        button.style.marginTop = '10px';
        button.style.width = '100%';
        button.style.padding = '10px';
        button.style.backgroundColor = '#4CAF50';
        button.style.color = 'white';
        button.style.border = 'none';
        button.style.cursor = 'pointer';
        button.style.fontSize = '16px';
        button.style.borderRadius = '4px';
        panel.appendChild(button);

        // 将面板添加到页面
        document.body.appendChild(panel);
        console.log('面板已创建并添加到页面');

        // 按钮事件
        button.addEventListener('click', async function() {
            var lines = dowithInputText(textarea.value.trim()).split('\n').filter(line => line.trim() !== '');
            if (lines.length === 0) {
                alert('没有可处理的卡号信息。');
                return;
            }

            var cardData = lines[0];
            // 移除已处理的卡号
            lines.shift();
            textarea.value = lines.join('\n');

            // 解析卡号信息
            var parts = cardData.split('|');
            if (parts.length !== 4) {
                alert('卡号格式不正确,应为:卡号|月|年|CVC');
                return;
            }

            var cardNumber = parts[0].trim();
            var month = parts[1].trim();
            var year = parts[2].trim();
            var cvc = parts[3].trim();
            var name = 'zhi yang'
            //如果年份是4位,则取后两位
            if (year.length === 4) year = year.slice(-2);

            console.log(`填入卡号信息:${cardNumber} | ${month}/${year} | ${cvc}`);

            var cardNumberField = document.getElementById('cardNumber');
            var cardExpiryField = document.getElementById('cardExpiry');
            var cardCvcField = document.getElementById('cardCvc');
            var billingNameField = document.getElementById("billingName");

            if (cardNumberField && cardExpiryField && cardCvcField && billingNameField) {
                try {
                    await setNativeValue(cardNumberField, cardNumber);
                    console.log('卡号已填写');

                    await setNativeValue(cardExpiryField, `${month}/${year}`);
                    console.log('到期日已填写');

                    await setNativeValue(cardCvcField, cvc);
                    console.log('CVC已填写');

                    await setNativeValue(billingNameField, name);
                    console.log('name已填写');

                    //alert('卡号信息已填入表单。');
                } catch (error) {
                    console.error('填写表单时出错:', error);
                    alert('填写表单时出错,请检查控制台日志。');
                }
            } else {
                console.error('未找到表单字段,请确认页面是否正确。');
                alert('未找到表单字段,请确认页面是否正确。');
            }
        });
    }

    // 触发完整事件
    async function setNativeValue(element, value) {
        const valueSetter = Object.getOwnPropertyDescriptor(element.__proto__, 'value').set;
        if (valueSetter) {
            valueSetter.call(element, value);
        } else {
            element.value = value;
        }

        const inputEvent = new Event('input', { bubbles: true });
        element.dispatchEvent(inputEvent);

        const changeEvent = new Event('change', { bubbles: true });
        element.dispatchEvent(changeEvent);

        const blurEvent = new Event('blur', { bubbles: true });
        element.dispatchEvent(blurEvent);

        //insure tbe event finish
        await delay(50);
    }

    // delay
    function delay(ms) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }

    // listen DOM
    var observer = new MutationObserver(function(mutations, me) {
        // check
        if (document.getElementById('cardNumber') && document.getElementById('cardExpiry') && document.getElementById('cardCvc') && document.getElementById("billingName")) {
            console.log('create ui');
            createPanel();
            me.disconnect(); // stop listen
            return;
        }
    });

    // listening
    observer.observe(document, {
        childList: true,
        subtree: true
    });

})();