// ==UserScript==
// @name fordealfill
// @name:zh 自动填表
// @name:en fordealfill
// @namespace https://github.com/mixterjim
// @version 1.3
// @author yy
// @description 自动填写表单数据的Tampermonkey脚本
// @description:en Tampermonkey Script for Autofilling Form Data
// @match https://*.fordeal.com/zh-CN/goods/publish/*
// @grant GM_setValue
// @grant GM_getValue
// @license GPL-3.0
// ==/UserScript==
(function() {
// 引入按钮组件样式
const modalStyle = `
/* 设置界面容器 */
.settings-modal {
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
zIndex: 9999;
height:800px;
width: 400px;
padding: 20px;
background-color: #fff;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
border-radius: 4px;
display: flex;
flex-direction: column;
position: fixed;
opacity: 0.8;
transition: opacity 0.3s ease;
}
.settings-modal:hover {
/* 鼠标悬停时的样式 */
opacity: 1;
}
/* 标签样式 */
.settings-label {
font-weight: bold;
margin-bottom: 10px;
display: block;
}
/* 输入框样式 */
.settings-textarea {
width: 100%;
padding: 8px;
height:400px;
border: 1px solid #ccc;
border-radius: 4px;
background-color: #f8f8f8;
color: #333;
box-sizing: border-box;
transition: border-color 0.3s ease;
}
.settings-pricearea {
width: 100%;
height:40px;
border: 1px solid #ccc;
border-radius: 4px;
background-color: #f8f8f8;
color: #333;
font-size:small;
box-sizing: border-box;
transition: border-color 0.3s ease;
}
.settings-zhongliangarea {
width: 100%;
height:40px;
border: 1px solid #ccc;
border-radius: 4px;
background-color: #f8f8f8;
color: #333;
font-size:small;
box-sizing: border-box;
transition: border-color 0.3s ease;
}
.settings-titletextarea {
width: 100%;
padding: 8px;
height:90px;
border: 1px solid #ccc;
border-radius: 4px;
background-color: #f8f8f8;
color: #333;
box-sizing: border-box;
transition: border-color 0.3s ease;
}
.settings-input:focus {
outline: none;
border-color: #007bff;
box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.1);
}
/* 按钮Div */
.settings-buttons {
display: flex;
}
/* 按钮样式 */
.settings-button {
flex: 1;
padding: 8px 16px; /* 调整按钮的内边距 */
margin-top: 10px;
border: none;
border-radius: 4px;
color: #fff;
background-color: #007bff;
cursor: pointer;
transition: background-color 0.3s ease;
font-size: 14px; /* 调整按钮的字体大小 */
}
.settings-button:not(:last-child) {
margin-right: 20px;
}
.settings-button:hover {
background-color: #0056b3;
}
.settings-button:active {
background-color: #004f9d;
}
/* 关闭按钮样式 */
.close-button {
position: absolute;
top: 10px;
right: 10px;
padding: 6px;
border: none;
background-color: transparent;
color: #333;
font-size: 18px;
cursor: pointer;
}
.close-button:hover {
color: #007bff;
}
`;
function trimNewlines(str) {
return str.replace(/^[\r\n]+|[\r\n]+$/g, '');
}
// 创建设置按钮
function createSettingsButton() {
const button = document.createElement('button');
button.innerText = 'fordealfill';
button.style.position = 'fixed';
button.style.top = '10px';
button.style.right = '10px';
button.style.zIndex = '9999';
button.style.opacity = 0.8;
button.style.color = 'gray';
button.style.textShadow = '0 2px 6px rgba(0, 0, 0, 0.3)';
button.addEventListener('click', openSettingsModal);
return button;
}
// 创建设置按钮
function createSettingsButton2() {
const button = document.createElement('button');
button.innerText = '跳转跟卖页面';
button.style.position = 'fixed';
button.style.top = '50px';
button.style.right = '10px';
button.style.zIndex = '9999';
button.style.opacity = 0.8;
button.style.color = 'gray';
button.style.textShadow = '0 2px 6px rgba(0, 0, 0, 0.3)';
button.addEventListener('click', opengengmaiModal);
return button;
}
// 创建设置模态框
function createSettingsModal() {
const modal = document.createElement('div');
modal.className = 'settings-modal';
modal.style.zIndex = '9999'; // 解决部分网站会遮挡的问题
const createElement = (tagName, className, text, eventListener) => {
const element = document.createElement(tagName);
if (className) element.className = className;
if (text) element.innerText = text;
if (eventListener) element.addEventListener('click', eventListener);
return element;
};
const titleLable = createElement('label', 'settings-label', '标题:');
const inputtitleField = createElement('textarea', 'settings-titletextarea');
const priceLable = createElement('label', 'settings-label', '成本价:');
const priceField = createElement('textarea', 'settings-pricearea');
const zhongliangLable = createElement('label', 'settings-label', '重量:');
const zhongliangField = createElement('textarea', 'settings-zhongliangarea');
const inputLabel = createElement('label', 'settings-label', '款式图片链接/自动填充:');
const closeButton = createElement('button', 'close-button', 'x', closeSettingsModal);
const inputField1 = createElement('textarea', 'settings-textarea');
const buttons = createElement('div', 'settings-buttons');
const inputLabel2 = createElement('label', 'settings-label', '商品轮播图链接:');
const inputField2 = createElement('textarea', 'settings-textarea');
const saveButton = createElement('button', 'settings-button', '自动填充', saveFormData);
const fillButton = createElement('button', 'settings-button', '恢复', fillForm);
const clearButton = createElement('button', 'settings-button', '清空', clearFormData);
modal.appendChild(titleLable);
modal.appendChild(inputtitleField);
modal.appendChild(priceLable);
modal.appendChild(priceField);
modal.appendChild(zhongliangLable);
modal.appendChild(zhongliangField);
modal.appendChild(inputLabel);
modal.appendChild(closeButton);
modal.appendChild(inputField1);
modal.appendChild(inputLabel2);
modal.appendChild(inputField2);
modal.appendChild(buttons);
buttons.appendChild(saveButton);
// buttons.appendChild(fillButton);
// buttons.appendChild(clearButton);
// 引入样式
const styleElement = document.createElement('style');
styleElement.textContent = modalStyle;
document.head.appendChild(styleElement);
return modal;
}
// 打开跟卖
function opengengmaiModal() {
window.location.href = window.location.href.replace("copyItemId","itemId").replace("copy","follow").replace("online","follow");
}
function delay(ms) {
return new Promise(function(resolve) {
setTimeout(resolve, ms);
});
}
// 打开设置模态框
function openSettingsModal() {
const formData = getFormData();
const modal = createSettingsModal();
const inputField = modal.querySelector('textarea');
inputField.value = "";
// Check if the modal is already open
if (!document.querySelector('.settings-modal')) {
document.body.appendChild(modal);
delay(300).then(function() {
let inputField =document.querySelectorAll('.settings-modal textarea')[3];
inputField.addEventListener('keyup', function(event) {
// 当用户释放键盘按键时,如果是修改了textarea的内容,这里的代码会被执行
if (event.target.value.indexOf("biaoti:") > -1) {
console.log('内容变化了:', event.target.value);
var allvalue = event.target.value;
var zhutu = "";
var skutu ="";
var title ="";
if (allvalue.indexOf("zhutu:") > -1) {
zhutu = allvalue.split("zhutu:")[1]
allvalue = allvalue.split("zhutu:")[0]
document.querySelectorAll('.settings-modal textarea')[4].value = trimNewlines(zhutu);
}
if (allvalue.indexOf("sku:") > -1) {
skutu = allvalue.split("sku:")[1]
allvalue = allvalue.split("sku:")[0]
document.querySelectorAll('.settings-modal textarea')[3].value = trimNewlines(skutu);
}
console.log("sfdgsdf:"+allvalue)
title = allvalue.split("biaoti:")[1]
document.querySelector('.settings-modal textarea').value = trimNewlines(title)
}
});
})
}
}
// 关闭设置模态框
function closeSettingsModal() {
const modal = document.querySelector('.settings-modal');
if (modal) {
modal.remove();
}
}
// 在需要延迟执行的地方调用delay函数
//delay();
// "kuangshidialog" 款式框弹出来
// "kuangshijia" 款式加号
// "kuanshifinish"
// "daxiao" 大小
var price = "";
var weight = "";
var zhuantai = "start";
var ks = 2;
var ksArr ="";
var shanpingArr = "";
var formData2 = "";
function jisuanjiage(jinhuoprice) {
var numberprice = Number(jinhuoprice);
if (numberprice > 100) {
return numberprice*1.93/6.8
}
if (numberprice > 80) {
return numberprice*1.96/6.8;
}
if (numberprice > 50) {
return numberprice*2.01/6.8;
}
if (numberprice > 30) {
return numberprice*2.06/6.8;
}
if (numberprice < 8) {
return numberprice*2.86/6.8;
}
return numberprice*2.48/6.8;
}
// 通用点按钮上传图片,并关闭窗口
function shangchuangtupian() {
setTimeout(function() {
let textarea = document.querySelector('[rows="20"]');
document.querySelector('[rows="20"]').value=formData2;
console.log(shanpingArr);
textarea.dispatchEvent(new Event('input', { bubbles: true }));
setTimeout(function() {
//确定按钮开始上传
document.getElementsByClassName("el-button el-button--primary el-button--small")[document.getElementsByClassName("el-button el-button--primary el-button--small").length-1].click();
//关闭窗口
setTimeout(function() {
document.getElementsByClassName("el-dialog__close el-icon el-icon-close")[document.getElementsByClassName("el-dialog__close el-icon el-icon-close").length-1].click();
// X按钮
/* document.getElementsByClassName("el-dialog__close el-icon el-icon-close")[document.getElementsByClassName("el-dialog__close el-icon el-icon-close").length-1].click();
delay(1000).then(function() {
// 确定按钮
document.getElementsByClassName("alert-main-footer border")[0].getElementsByClassName("el-button el-button--primary el-button--small")[0].click();
});*/
},2000);
},600)
},400)
}
var zhuantaitupianfinishid = 0;
// 等待款式图片传玩
function waitingtupianfinish(i) {
if (document.getElementsByClassName("delete")) {
delay(100).then(function() {
// 确定按钮
document.getElementsByClassName("alert-main-footer border")[0].getElementsByClassName("el-button el-button--primary el-button--small")[0].click();
});
zhuantaitupianfinishid = i;
if (i == ks) {
console.log("kuanshifinish !!!");
zhuantai = "kuanshifinish";
}
return;
} else {
delay(200).then(function () {
console.log("等图片传玩xxxxx" +i);
waitingtupianfinish();
})
}
}
// 等待上一个款式弄完
function kuanshitupian1(i) {
console.log("sdfdsfd" + zhuantai + i);
if (document.getElementsByClassName("sku-item-img-dialog-body") && document.getElementsByClassName("sku-item-img-dialog-body").length > 0 && i > 1 && zhuantaitupianfinishid != i -1) {
delay(500).then(function () {
console.log("等上一个图片xxxxx" +i);
kuanshitupian1(i);
})
return;
}
document.getElementsByClassName("add")[i-1].click();
delay(100).then(function() {
document.getElementsByClassName("upload-tit")[1].click();
})
setTimeout(function() {
let textarea = document.querySelector('[rows="20"]');
document.querySelector('[rows="20"]').value=ksArr[i-1];
textarea.dispatchEvent(new Event('input', { bubbles: true }));
},500)
setTimeout(function() {
//确定按钮开始上传
document.getElementsByClassName("el-button el-button--primary el-button--small")[document.getElementsByClassName("el-button el-button--primary el-button--small").length-1].click();
//关闭窗口
setTimeout(function() {
// X按钮
document.getElementsByClassName("el-dialog__close el-icon el-icon-close")[document.getElementsByClassName("el-dialog__close el-icon el-icon-close").length-1].click();
delay(1000).then(function() {
// 确定按钮
waitingtupianfinish(i);
});
},2200);
},600)
}
// 上传款式图片
function kuanshitupian() {
//上传图片
if (zhuantai == "kuangshijia") {
console.log("kuanshitupian");
} else {
delay(400).then(function() {
kuanshitupian();
})
return;
}
for (let i = 1; i <= ks; i++) {
setTimeout(function() {
kuanshitupian1(i)
}, (i) * 1000);
}
}
// 款式选择
function kuanshixuanzhe() {
if (zhuantai == "kuangshidialog" || zhuantai == "kuangshijia") {
console.log("dddd");
return;
} else {
delay(300).then(function() {
kuanshixuanzhe();
})
}
if (document.querySelector('[alt=款式1]')) {
zhuantai="kuangshidialog";
console.log("kuangshidialog show");
for (let i = 1; i <= ks; i++) {
setTimeout(function() {
let name = "款式"+i;
document.querySelector('[alt='+name+']').click();
console.log(name);
if (i == ks) {
setTimeout(function() {
//确定按钮
document.getElementsByClassName("el-button el-button--primary el-button--small")[2].click();
zhuantai = "kuangshijia";
}, 300);
}
}, i * 150);
}
}
}
// 款式
function kuangshi() {
// 添加款式按钮
document.getElementsByClassName("el-button el-button--primary el-button--small")[0].click();
// 款式框是否显示完成
delay(300).then(function() {
kuanshixuanzhe();
})
// 上传图片
delay(400).then(function() {
kuanshitupian()
})
}
// 价格和重量
function jiagezhongliang() {
if (zhuantai !== "kuanshifinish") {
console.log("等待款式弄完");
delay(1000).then(function() {
jiagezhongliang();
})
return;
}
// 价格
var jiageelement = document.getElementsByClassName("el-form-item__content")[2].getElementsByClassName("el-input__inner")[0];
jiageelement.value=jisuanjiage(price);
let inputevent = new InputEvent('input', {
'bubbles': true,
'cancelable': false
})
jiageelement.dispatchEvent(inputevent)
let changeEvent = new Event('change', {
'bubbles': true
})
jiageelement.dispatchEvent(changeEvent)
// 库存
var kucunelement = document.getElementsByClassName("el-form-item__content")[3].getElementsByClassName("el-input__inner")[0];
kucunelement.value="1111";
kucunelement.dispatchEvent(inputevent)
kucunelement.dispatchEvent(changeEvent)
// 重量
var zhongliangelement = document.getElementsByClassName("el-form-item__content")[4].getElementsByClassName("el-input__inner")[0];
zhongliangelement.value = weight;
zhongliangelement.dispatchEvent(inputevent)
zhongliangelement.dispatchEvent(changeEvent)
delay(200).then(function() {
document.getElementsByClassName("mod-batch-action")[0].getElementsByClassName("el-button el-button--primary el-button--small")[0].click();
})
}
//商品轮播图
function shangpinlunbotu() {
if (zhuantai !== "kuanshifinish") {
console.log("等待款式弄完");
delay(900).then(function() {
shangpinlunbotu();
})
return;
}
console.log("shangpinglunbotu");
document.getElementsByClassName("main-content")[0].scrollTo({ top: 5*document.body.scrollHeight,
behavior: 'smooth'
});
//商品详情图 begin
delay(1000).then(function() {
let letold = document.querySelectorAll('[class=delete]');
let oldsize = letold.length;
let xx =1;
console.log("sdfsdfdelete"+oldsize);
for ( xx; xx<=oldsize;xx++) {
console.log("delete"+xx);
setTimeout(function() {
document.querySelectorAll('[class=delete]')[0].click();
}, xx*100)
};
delay(400+xx*90).then(function() {
document.getElementsByClassName("com-upload__content")[1].getElementsByClassName("upload-tit")[1].click();
setTimeout(function() {
shangchuangtupian();
},1000)});
});
}
// 保存表单数据到本地存储
function saveFormData() {
// 滑动到底部
delay(100).then(function() {
const modal = document.querySelector('.settings-modal');
if (modal) {
modal.remove();
}
});
var title = document.querySelector('.settings-modal textarea').value.split(/[(\r\n)\r\n]+/);
console.log(title);
price =document.querySelectorAll('.settings-modal textarea')[1].value;
weight = document.querySelectorAll('.settings-modal textarea')[2].value;
console.log("price:"+price)
console.log("weight:"+weight)
var inputField = document.querySelectorAll('.settings-modal textarea')[3];
var formData = inputField.value;
ksArr = formData.split(/[(\r\n)\r\n]+/);
console.log(ksArr);
ks = ksArr.length;
if (formData == '')
ks = 0
formData2 = document.querySelectorAll('.settings-modal textarea')[4].value;
shanpingArr=formData2.split(/[(\r\n)\r\n]+/);
//输入文案
let pdf = document.getElementsByClassName("el-textarea__inner")[0];
pdf.value=title[0];
pdf.dispatchEvent(new Event('input', { bubbles: true }));
delay(1000).then(function() {
let pdf = document.getElementsByClassName("el-input__inner")[1];
// pdf.value="自有品牌";
pdf.dispatchEvent(new Event('input', { bubbles: true }));
let event = new MouseEvent('click', {
'bubbles': true,
'cancelable': false
});
// 触发点击
pdf.dispatchEvent(event);
delay(600).then(function() {
let pdfxx = document.getElementsByClassName("el-select-dropdown__item")
let lenxx = pdfxx.length;
let event = new MouseEvent('click', {
'bubbles': true,
'cancelable': false
});
pdfxx[lenxx-1].dispatchEvent(event);
})
})
delay(1400).then(function() {
document.getElementsByClassName("main-content")[0].scrollTo({ top: 2*document.body.scrollHeight,
behavior: 'smooth'
});
})
// document.getElementsByClassName("main-content")[0].scrollTop=10000;
// document.getElementsByClassName("el-input__inner")[1].value='自有品牌';
// ----------------- 商品规格 begin--------------------------
// 先吧以前的删了
if (ks > 0) {
delay(2000).then(function(){
let letold = document.querySelectorAll('[class=el-icon-error]');
let oldsize = letold.length;
let xx =1;
for ( xx; xx<=oldsize-1;xx++) {
console.log("dddd");
setTimeout(function() {
document.querySelectorAll('[class=el-icon-error]')[0].click();
}, xx*100)
};
delay(oldsize*300).then(function() {
kuangshi();
}) ;
if (price != "" && weight != "") {
delay(1000).then(function() {
jiagezhongliang();
})
}
});
}
//商品详情图 end
if (shanpingArr.length > 0 && formData2 != '') {
delay(3000+ks*3100).then(function() {
shangpinlunbotu();
})
}
// 保存表单数据到本地存储
// localStorage.setItem('formData', formData);
// console.log(formData);
// closeSettingsModal();
}
// 清空表单数据
function clearFormData() {
// 清空本地存储中的表单数据
localStorage.removeItem('formData');
// 清空表单中的值
const formFields = document.querySelectorAll('input, textarea, select');
formFields.forEach(function(field) {
field.value = '';
});
closeSettingsModal();
}
// 获取表单数据
function getFormData() {
const formFields = document.querySelectorAll('input, textarea, select');
const formData = {};
const form = document.querySelector('form');
formFields.forEach(function(field) {
formData[field.name] = field.value;
});
return JSON.stringify(formData);
}
// 设置表单数据
function setFormData(formData) {
try {
const parsedData = JSON.parse(formData);
const formFields = document.querySelectorAll('input, textarea, select');
formFields.forEach(function(field) {
if (field.name in parsedData) {
field.value = parsedData[field.name];
}
});
} catch (error) {
console.error('无法解析表单数据:', error);
}
}
// 自动填充表单数据
function fillForm() {
// 检查本地存储中是否存在已保存的表单数据
const savedFormData = localStorage.getItem('formData');
if (savedFormData) {
setFormData(savedFormData);
}
closeSettingsModal();
}
// 在页面完全加载后执行
window.addEventListener('load', function() {
// 添加设置按钮
const settingsButton = createSettingsButton();
const settingsButton2 = createSettingsButton2();
document.body.appendChild(settingsButton);
document.body.appendChild(settingsButton2);
setTimeout(openSettingsModal,2000);
// 自动填充表单数据
setTimeout(fillForm, 1000); // 延迟填充数据,防止表单未完全载入
});
})();