Greasy Fork

来自缓存

Greasy Fork is available in English.

纪念币预约-自动填充

自动填充网页中的姓名、身份证号和手机号,支持多组数据,此项目为piplong二开,原作者:上仙社区VX:Sxian00001

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

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

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         纪念币预约-自动填充
// @namespace    http://tampermonkey.net/
// @version      0.2
// @description  自动填充网页中的姓名、身份证号和手机号,支持多组数据,此项目为piplong二开,原作者:上仙社区VX:Sxian00001
// @author       piplong 二开版
// @match        *://*/*
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_addStyle
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    const toggleFloatingWindowButton = document.createElement('button');
    toggleFloatingWindowButton.className = 'autofill-button';
    toggleFloatingWindowButton.textContent = '悬浮窗开关';
    toggleFloatingWindowButton.style.position = 'fixed';
    toggleFloatingWindowButton.style.bottom = '60px';
    toggleFloatingWindowButton.style.right = '10px';
    toggleFloatingWindowButton.style.zIndex = '1001';
    toggleFloatingWindowButton.style.padding = '10px';
    toggleFloatingWindowButton.style.background = 'linear-gradient(to right, #228B22, #66CDAA)';
    toggleFloatingWindowButton.style.color = '#fff';
    toggleFloatingWindowButton.style.border = 'none';
    toggleFloatingWindowButton.style.borderRadius = '5px';
    toggleFloatingWindowButton.style.cursor = 'pointer';

    toggleFloatingWindowButton.addEventListener('click', () => {
        const autofillButtons = document.querySelector('.autofill-buttons');
        if (autofillButtons) {
            autofillButtons.style.display = autofillButtons.style.display === 'none' ? 'flex' : 'none';
        }
    });

    document.body.appendChild(toggleFloatingWindowButton);


    const donateButton = document.createElement('button');
    donateButton.style.display = 'none';
    donateButton.className = 'autofill-button';
    donateButton.textContent = '';
    donateButton.style.position = 'fixed';
    donateButton.style.bottom = '110px';
    donateButton.style.right = '10px';
    donateButton.style.zIndex = '1001';
    donateButton.style.padding = '10px';
    donateButton.style.background = 'linear-gradient(90deg, red, orange, yellow, green, blue, indigo, violet)';
    donateButton.style.color = '#fff';
    donateButton.style.border = 'none';
    donateButton.style.borderRadius = '5px';
    donateButton.style.cursor = 'pointer';
    donateButton.style.backgroundSize = '400% 100%';
    donateButton.style.animation = 'rainbowBackground 5s linear infinite';

    donateButton.addEventListener('click', () => {
        createAnnouncement();
    });

    document.body.appendChild(donateButton);

    var floatButton = document.createElement('button');
    floatButton.innerHTML = '点击获取验证码';
    floatButton.style.position = 'fixed';
    floatButton.style.bottom = '10px';
    floatButton.style.right = '10px';
    floatButton.style.zIndex = '1000';
    floatButton.style.padding = '10px';
    floatButton.style.backgroundColor = '#f00';
    floatButton.style.color = '#fff';
    floatButton.style.border = 'none';
    floatButton.style.borderRadius = '5px';
    floatButton.style.cursor = 'pointer';

    document.body.appendChild(floatButton);


    floatButton.addEventListener('click', function() {

        var selectors = [
            '.free_get ml20 next',//建设
            '#free_get ml20 next',//建设
            'free_get ml20 next',//建设
            '.to_code',//建设
            'to_code',//建设
            '#to_code',//建设
            'btn-submit',//农业
            '.btn-submit',//农业
            '#btn-submit',//农业
            'forCashInfor_fillbtn',
            '.forCashInfor_fillbtn',//中国银行
            '#forCashInfor_fillbtn',//中国银行
            'link4Verifyimage2Name',//gs
            '.link4Verifyimage2Name',//gs
            '#link4Verifyimage2Name',//gs
            '.el-button.el-button--text.append-text'
        ];

        // 遍历选择器列表,查找并点击按钮
        selectors.forEach(function(selector) {
            var buttons = document.querySelectorAll(selector);
            buttons.forEach(function(button) {
                button.click();
                console.log('按钮已点击: ' + selector);
            });
        });
    });

    // 添加样式
    GM_addStyle(`
    .autofill-settings {
        position: fixed;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        background: white;
        padding: 20px;
        border-radius: 8px;
        box-shadow: 0 0 10px rgba(0,0,0,0.3);
        z-index: 10001;
        display: none;
        max-width: 90vw;
        width: 50%;
        max-height: 80vh;
        overflow-y: auto;
    }
    .autofill-settings::-webkit-scrollbar {
        width: 8px;
    }
    .autofill-settings::-webkit-scrollbar-track {
        background: #f1f1f1;
        border-radius: 4px;
    }
    .autofill-settings::-webkit-scrollbar-thumb {
        background: #888;
        border-radius: 4px;
    }
    .autofill-settings::-webkit-scrollbar-thumb:hover {
        background: #555;
    }
    .autofill-settings h2 {
        margin-top: 0;
        margin-bottom: 20px;
        color: #333;
        position: sticky;
        top: 0;
        background: white;
        padding: 10px 0;
        z-index: 1;
    }
    .autofill-settings .grid-container {
        display: grid;
        grid-template-columns: repeat(5, 1fr);
        gap: 10px;
    }
    .autofill-settings .group {
        padding: 10px;
        border: 1px solid #ddd;
        border-radius: 5px;
        background: #f9f9f9;
    }
    .autofill-settings .group h3 {
        margin-top: 0;
        margin-bottom: 10px;
        color: #444;
        font-size: 14px;
    }
    .autofill-settings label {
        display: block;
        margin-bottom: 5px;
        color: #666;
        font-size: 12px;
    }
    .autofill-settings input {
        width: calc(80%);
        padding: 6px;
        margin-bottom: 8px;
        border: 1px solid #ddd;
        border-radius: 4px;
        font-size: 12px;
    }
    .autofill-settings input:focus {
        border-color: #4CAF50;
        outline: none;
        box-shadow: 0 0 3px rgba(76, 175, 80, 0.3);
    }
    .autofill-settings .buttons {
        text-align: right;
        margin-top: 15px;
        position: sticky;
        bottom: 0;
        background: white;
        padding: 10px 0;
        border-top: 1px solid #eee;
    }
    .autofill-settings button {
        padding: 8px 20px;
        margin-left: 10px;
        border: none;
        border-radius: 4px;
        cursor: pointer;
        font-size: 14px;
        transition: background-color 0.3s;
    }
    .autofill-settings .save {
        background: #4CAF50;
        color: white;
    }
    .autofill-settings .save:hover {
        background: #45a049;
    }
    .autofill-settings .cancel {
        background: #f44336;
        color: white;
    }
    .autofill-settings .cancel:hover {
        background: #da190b;
    }
    .autofill-buttons {
        position: fixed;
        top: 20px;
        right: 20px;
        z-index: 10000;
        display: flex;
        flex-direction: column;
        gap: 10px;
    }
    .autofill-button {
        padding: 10px 20px;
        background-color: #4CAF50;
        color: white;
        border: none;
        border-radius: 5px;
        cursor: pointer;
        font-size: 14px;
        box-shadow: 0 2px 5px rgba(0,0,0,0.2);
        transition: background-color 0.3s;
    }
    .autofill-button:hover {
        background-color: #45a049;
    }
    .settings-button {
        background-color: #2196F3 !important;
    }
    .settings-button:hover {
        background-color: #1976D2 !important;
    }
    `);


    const defaultData = {
        groups: Array.from({ length: 10 }, () => ({
            name: '',
            idCard: '',
            phone: '',
            bankBranch: '',
            reservationAmount: '',
            note: ''
        }))
    };


    let savedData = GM_getValue('autofillData', defaultData);


    function createSettingsPanel() {
    const panel = document.createElement('div');
    panel.className = 'autofill-settings';
    panel.style.display = 'none'; // 默认隐藏

    let html = `
    <style>
    .autofill-settings {
        display: flex; /* 确保是左右布局 */
        max-width: 90vw;
        max-height: 80vh;
        overflow: hidden;
        background: rgba(255, 255, 255, 0.8);
        border-radius: 8px;
        box-shadow: 0 0 10px rgba(0,0,0,0.3);
        padding: 20px;
        z-index: 10001;
    }

    .left-panel {
        flex: 1;
        padding-right: 20px;
        border-right: 1px solid #ccc;
        overflow-y: auto;
    }

    .right-panel {
        flex: 2;
        padding-left: 20px;
        transition: max-height 0.3s ease-in-out;
        overflow-y: auto;
    }

    .group-title {
        cursor: pointer;
        margin: 10px 0;
        display: flex;
        justify-content: space-between;
        align-items: center;
    }

    .footer-note {
        font-size: 12px;
        color: #666;
        text-align: center;
        margin-top: 20px;
    }

    .notification {
        display: none;
        color: green;
        margin-top: 10px;
    }
    </style>

    <div class="left-panel">
        <h3 style="display: flex; justify-content: space-between; align-items: center;">
            数据组
            <div>
                <button class="cancel">关闭</button>
                <button class="save">保存</button>
            </div>
        </h3>
    `;

    // 创建组标题和展开图标
    savedData.groups.forEach((group, index) => {
        html += `
            <div class="group-title" data-index="${index}">
                <span>第 ${index + 1} 组数据</span>
                <span class="expand-icon">🐍</span>
            </div>
        `;
    });

    html += `
        <div class="footer-note">PS:修改备注或添加信息保存后,需刷新页面才可以显示最新状态</div>
        <div class="notification">保存成功!</div>
        </div>
        <div class="right-panel">
            <h3>请选择左侧的组进行编辑</h3>
        </div>
    `;

    panel.innerHTML = html;
    document.body.appendChild(panel);

    // 获取左侧的所有组标题
    const groupTitles = panel.querySelectorAll('.group-title');
    const rightPanel = panel.querySelector('.right-panel');
    const notification = panel.querySelector('.notification');

    groupTitles.forEach(title => {
        title.addEventListener('click', () => {
            const index = Number(title.dataset.index);

            // 显示右侧面板
            rightPanel.innerHTML = `
                <h3>编辑 第 ${index + 1} 组数据</h3>
                <label>姓名:</label>
                <input type="text" class="name-input" data-group="${index}" value="${savedData.groups[index].name}">
                <label>身份证号:</label>
                <input type="text" class="idcard-input" data-group="${index}" value="${savedData.groups[index].idCard}">
                <label>手机号:</label>
                <input type="text" class="phone-input" data-group="${index}" value="${savedData.groups[index].phone}">
                <label>银行网点:</label>
                <input type="text" class="branch-input" data-group="${index}" value="${savedData.groups[index].bankBranch}">
                <label>预约数量:</label>
                <input type="text" class="amount-input" data-group="${index}" value="${savedData.groups[index].reservationAmount}" placeholder="视银行而定">
                <label>备注:</label>
                <input type="text" class="note-input" data-group="${index}" value="${savedData.groups[index].note}" placeholder="填充按钮重命名,用于辨识分组信息,可不填">
            `;
        });
    });

    // 保存按钮
    panel.querySelector('.save').addEventListener('click', () => {
        const groupCount = savedData.groups.length;

        // 遍历所有组,更新数据
        for (let i = 0; i < groupCount; i++) {
            const nameInput = panel.querySelector(`.name-input[data-group="${i}"]`);
            const idCardInput = panel.querySelector(`.idcard-input[data-group="${i}"]`);
            const phoneInput = panel.querySelector(`.phone-input[data-group="${i}"]`);
            const branchInput = panel.querySelector(`.branch-input[data-group="${i}"]`);
            const amountInput = panel.querySelector(`.amount-input[data-group="${i}"]`);
            const noteInput = panel.querySelector(`.note-input[data-group="${i}"]`);

            // 更新对应组的数据
            savedData.groups[i] = {
                name: nameInput ? nameInput.value : savedData.groups[i].name,
                idCard: idCardInput ? idCardInput.value : savedData.groups[i].idCard,
                phone: phoneInput ? phoneInput.value : savedData.groups[i].phone,
                bankBranch: branchInput ? branchInput.value : savedData.groups[i].bankBranch,
                reservationAmount: amountInput ? amountInput.value : savedData.groups[i].reservationAmount,
                note: noteInput ? noteInput.value : savedData.groups[i].note
            };
        }

        GM_setValue('autofillData', savedData);

        console.log(savedData);
        alert("保存成功!别忘了刷新页面哦~");

        panel.style.display = 'none';
    });

    // 关闭按钮
    panel.querySelector('.cancel').addEventListener('click', () => {
        panel.style.display = 'none';
    });

    return panel;
}





    function autoFillForm(groupIndex) {
        const personalInfo = savedData.groups[groupIndex];


        const nameInputs = document.querySelectorAll('input[type="text"]');
        nameInputs.forEach(input => {
            const inputId = (input.id || '').toLowerCase();
            const inputName = (input.name || '').toLowerCase();
            const inputPlaceholder = (input.placeholder || '').toLowerCase();
            const inputLabel = input.labels && input.labels[0] ? input.labels[0].textContent.toLowerCase() : '';

            if (
                inputId.includes('name') ||
                inputName.includes('name') ||
                inputId.includes('oppAcNme') ||
                inputName.includes('oppAcNme') ||
                inputId.includes('usr_nm') ||
                inputName.includes('usr_nm') ||
                inputPlaceholder.includes('姓名') ||
                inputPlaceholder.includes('name') ||
                inputId.includes('客户') ||
                inputName.includes('客户') ||
                inputPlaceholder.includes('客户') ||
                inputLabel.includes('姓名') ||
                inputLabel.includes('客户') ||
                inputId.includes('username') ||
                inputName.includes('username') ||
                inputId.includes('fullname') ||
                inputName.includes('fullname') ||
                inputId.includes('realname') ||
                inputName.includes('realname') ||
                inputPlaceholder.includes('真实姓名') ||
                inputLabel.includes('真实姓名') ||
                inputId.includes('客户姓名') ||
                inputName.includes('客户姓名') ||
                inputPlaceholder.includes('客户姓名') ||
                inputLabel.includes('客户姓名') ||
                (inputId.includes('客户') && inputId.includes('姓名')) ||
                (inputName.includes('客户') && inputName.includes('姓名')) ||
                (inputPlaceholder.includes('客户') && inputPlaceholder.includes('姓名'))
            ) {
                input.value = personalInfo.name;
                input.dispatchEvent(new Event('input', { bubbles: true }));
                input.dispatchEvent(new Event('change', { bubbles: true }));
            }
        });

        const idInputs = document.querySelectorAll('input');
        idInputs.forEach(input => {
            const inputId = (input.id || '').toLowerCase();
            const inputName = (input.name || '').toLowerCase();
            const inputPlaceholder = (input.placeholder || '').toLowerCase();
            const inputLabel = input.labels && input.labels[0] ? input.labels[0].textContent.toLowerCase() : '';

            if (
                inputId.includes('id') ||
                inputName.includes('id') ||
                inputId.includes('credNumTemp') ||
                inputName.includes('credNumTemp') ||
                inputId.includes('.credNumTemp') ||
                inputName.includes('.credNumTemp') ||
                inputId.includes('#credNumTemp') ||
                inputName.includes('#credNumTemp') ||
                inputId.includes('证件号码') ||
                inputName.includes('证件号码') ||
                inputId.includes('hidden') ||
                inputName.includes('hidden') ||
                inputId.includes('credNumTemp1') ||
                inputName.includes('credNumTemp1') ||
                inputId.includes('crdt_no') ||
                inputName.includes('crdt_no') ||
                inputPlaceholder.includes('身份证') ||
                inputPlaceholder.includes('证件') ||
                inputPlaceholder.includes('证件号码') ||
                inputPlaceholder.includes('证件号码') ||
                inputPlaceholder.includes('credNumTemp') ||
                inputPlaceholder.includes('credNumTemp') ||
                inputLabel.includes('身份证') ||
                inputLabel.includes('证件号') ||
                inputLabel.includes('证件号码') ||
                inputLabel.includes('证件号码') ||
                inputLabel.includes('credNumTemp') ||
                inputLabel.includes('credNumTemp') ||
                inputId.includes('idcard') ||
                inputName.includes('idcard') ||
                inputId.includes('idnumber') ||
                inputName.includes('idnumber')
            ) {
                input.value = personalInfo.idCard;
                input.dispatchEvent(new Event('input', { bubbles: true }));
                input.dispatchEvent(new Event('change', { bubbles: true }));
            }
        });


        const phoneInputs = document.querySelectorAll('input[type="tel"], input[type="text"], input[type="number"]');
        phoneInputs.forEach(input => {
            const inputId = (input.id || '').toLowerCase();
            const inputName = (input.name || '').toLowerCase();
            const inputPlaceholder = (input.placeholder || '').toLowerCase();
            const inputLabel = input.labels && input.labels[0] ? input.labels[0].textContent.toLowerCase() : '';

            if (
                inputId.includes('phone') ||
                inputId.includes('mobile') ||
                inputName.includes('phone') ||
                inputName.includes('mobile') ||
                inputId.includes('secure-input-plain-phone') ||
                inputName.includes('secure-input-plain-phone') ||
                inputId.includes('el-form-item__content') ||
                inputName.includes('el-form-item__content') ||
                inputId.includes('el-form-item') ||
                inputName.includes('el-form-item') ||
                inputId.includes('safe-input') ||
                inputName.includes('safe-input') ||
                inputId.includes('mblph_no') ||
                inputName.includes('mblph_no') ||
                inputPlaceholder.includes('手机') ||
                inputPlaceholder.includes('电话') ||
                inputLabel.includes('手机') ||
                inputLabel.includes('电话') ||
                inputId.includes('tel') ||
                inputName.includes('tel') ||
                inputPlaceholder.includes('联系方式') ||
                inputId.includes('cellphone') ||
                inputName.includes('cellphone') ||
                inputId.includes('telephone') ||
                inputName.includes('telephone') ||
                inputPlaceholder.includes('手机号码') ||
                inputPlaceholder.includes('手机号') ||
                inputLabel.includes('手机号码') ||
                inputLabel.includes('手机号') ||
                inputPlaceholder.includes('联系电话') ||
                inputLabel.includes('联系电话') ||
                inputId.includes('客户手机') ||
                inputName.includes('客户手机') ||
                inputPlaceholder.includes('客户手机') ||
                inputLabel.includes('客户手机') ||
                (inputId.includes('客户') && (inputId.includes('手机') || inputId.includes('电话'))) ||
                (inputName.includes('客户') && (inputName.includes('手机') || inputName.includes('电话'))) ||
                (inputPlaceholder.includes('客户') && (inputPlaceholder.includes('手机') || inputPlaceholder.includes('电话'))) ||
                (inputLabel.includes('客户') && (inputLabel.includes('手机') || inputLabel.includes('电话'))) ||
                inputPlaceholder.includes('移动电话') ||
                inputLabel.includes('移动电话') ||
                inputId.includes('联系人手机') ||
                inputName.includes('联系人手机') ||
                inputPlaceholder.includes('联系人手机') ||
                inputLabel.includes('联系人手机')
            ) {
                input.value = personalInfo.phone;
                input.dispatchEvent(new Event('input', { bubbles: true }));
                input.dispatchEvent(new Event('change', { bubbles: true }));
            }
        });


        const branchInputs = document.querySelectorAll('input[type="text"], select');
        branchInputs.forEach(input => {
            const inputId = (input.id || '').toLowerCase();
            const inputName = (input.name || '').toLowerCase();
            const inputPlaceholder = (input.placeholder || '').toLowerCase();
            const inputLabel = input.labels && input.labels[0] ? input.labels[0].textContent.toLowerCase() : '';

            if (
                inputId.includes('branch') ||
                inputName.includes('branch') ||
                inputPlaceholder.includes('网点') ||
                inputLabel.includes('网点') ||
                inputId.includes('bank') ||
                inputName.includes('bank') ||
                inputPlaceholder.includes('银行') ||
                inputLabel.includes('银行') ||
                inputId.includes('兑换') ||
                inputName.includes('兑换') ||
                inputPlaceholder.includes('兑换') ||
                inputLabel.includes('兑换') ||
                inputId.includes('领取') ||
                inputName.includes('领取') ||
                inputPlaceholder.includes('领取') ||
                inputLabel.includes('领取') ||
                inputId.includes('选择') ||
                inputName.includes('选择') ||
                inputPlaceholder.includes('选择') ||
                inputLabel.includes('选择')
            ) {
                if (input.tagName.toLowerCase() === 'select') {

                    const options = input.querySelectorAll('option');
                    options.forEach(option => {
                        if (option.textContent.includes(personalInfo.bankBranch)) {
                            option.selected = true;
                            input.dispatchEvent(new Event('change', { bubbles: true }));
                        }
                    });
                } else {

                    input.value = personalInfo.bankBranch;
                    input.dispatchEvent(new Event('input', { bubbles: true }));
                    input.dispatchEvent(new Event('change', { bubbles: true }));
                }
            }
        });

        const amountInputs = document.querySelectorAll('input[type="number"], input[type="text"]');
        amountInputs.forEach(input => {
            const inputId = (input.id || '').toLowerCase();
            const inputName = (input.name || '').toLowerCase();
            const inputPlaceholder = (input.placeholder || '').toLowerCase();
            const inputLabel = input.labels && input.labels[0] ? input.labels[0].textContent.toLowerCase() : '';

            if (
                inputId.includes('amount') ||
                inputName.includes('amount') ||
                inputPlaceholder.includes('数量') ||
                inputLabel.includes('数量') ||
                inputId.includes('预约') ||
                inputName.includes('预约') ||
                inputPlaceholder.includes('预约') ||
                inputLabel.includes('预约') ||
                inputId.includes('兑换') ||
                inputName.includes('兑换') ||
                inputPlaceholder.includes('兑换') ||
                inputLabel.includes('兑换')
            ) {
                input.value = personalInfo.reservationAmount;
                input.dispatchEvent(new Event('input', { bubbles: true }));
                input.dispatchEvent(new Event('change', { bubbles: true }));
            }
        });
    }





    function createButtons() {
    const buttonsContainer = document.createElement('div');
    buttonsContainer.className = 'autofill-buttons';

    savedData.groups.forEach((group, index) => {
        if (group.name.trim() !== '') {
            const button = document.createElement('button');
            button.className = 'autofill-button';
            const note = group.note;
            button.textContent = note ? note : `填充第 ${index + 1} 组`;
            button.style.background = 'linear-gradient(to right, #228B22, #66CDAA)';
            button.addEventListener('click', () => {
                autoFillForm(index);
                button.textContent = note ? note : `已填充第 ${index + 1} 组`;
                setTimeout(() => {
                    button.textContent = note ? note : `填充第 ${index + 1} 组`;
                }, 1000);
            });
            buttonsContainer.appendChild(button);
        }
    });

    const settingsButton = document.createElement('button');
    settingsButton.className = 'autofill-button settings-button';
    settingsButton.textContent = '自动填充设置';
    settingsButton.style.background = 'linear-gradient(to right, #1E90FF, #00BFFF)';
    settingsButton.addEventListener('click', () => {
        const panel = document.querySelector('.autofill-settings');
        panel.style.display = 'flex'; // 确保以 flex 布局显示
    });
    buttonsContainer.appendChild(settingsButton);

    document.body.appendChild(buttonsContainer);

    // 创建设置面板并默认隐藏
    createSettingsPanel();
}


    function init() {
        const settingsPanel = createSettingsPanel();
        createButtons();

        const hasShownAnnouncement = GM_getValue('hasShownAnnouncement', false);

        if (!hasShownAnnouncement) {
            createAnnouncement();
            GM_setValue('hasShownAnnouncement', true);
        }


    }


    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', init);
    } else {
        init();
    }
})();