none
// ==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
});
})();