fordealfill

自动填写表单数据的Tampermonkey脚本

当前为 2024-08-25 提交的版本,查看 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==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); // 延迟填充数据,防止表单未完全载入
    });
})();