MEST Accounts Switcher

fast switch account cookies

// ==UserScript==
// @name         MEST Accounts Switcher
// @namespace    joyings.com.cn
// @version      1.3.0
// @description  fast switch account cookies
// @author       zmz125000
// @match        http://*/mest/*
// @icon         http://www.google.com/s2/favicons?domain=openwrt.org
// @grant        none
// @license      MIT
// @run-at       document-end
// @require      https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.1/jquery.min.js
// ==/UserScript==

(function () {
    'use strict';

    // Your code here...
    function sleep(ms) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }

    if ($('button:contains("登录")')[0]) {
        $('button:contains("登录")')[0].addEventListener('click', function () {
            localStorage['password'] = document.querySelector('[placeholder="密码"]').value;
            localStorage['phone'] = document.querySelector('[placeholder="用户名"]').value;
            localStorage.removeItem('userName');
            importCookie();
        })
    }

    async function monitorLogout() {
        while (true) {
            if ($('button:contains("重新登录")')[0]) {
                window.open('http://112.74.92.133/mest/#/login', '_self');
            }
            await sleep(2000);
        }
    }

    async function monitorLoginPage() {
        while (!$('#login-box')[0]) {
            await sleep(3000);
            monitorLoginPage();
            return;
        }
        $('#panelDiv')[0].style.display = 'block';
    }

    async function insertDiv() {
        var div = document.createElement('div');
        div.className = 'item is-link';
        div.id = 'togglePanelBtn';
        div.setAttribute('style', 'vertical-align: middle;');

        var panelDiv = document.createElement('div');
        panelDiv.className = 'multiaccPanel';
        panelDiv.id = 'panelDiv';
        panelDiv.innerHTML = '<div id="accBtnsDiv"></div>\
        <button type=button id=multiaccImport class=multiaccBtn>更多插件</button>'
        panelDiv.style.display = 'none';
        div.addEventListener('click', function (e) {
            //importCookie();
            if ($('#panelDiv')[0].style.display == 'block') {
                $('#panelDiv')[0].style.display = 'none';
            } else {
                $('#panelDiv')[0].style.display = 'block';
            }
        }, false);

        let span = document.createElement('span');
        span.textContent = "切换员工";
        div.appendChild(span);
        document.body.appendChild(panelDiv);
        if ($('#login-box')[0]) {
            $('#panelDiv')[0].style.display = 'block';
        }
        while (!$('[class="user"]')[0]) {
            await sleep(200);
        }
        $('[class="user"]')[0].prepend(div);
        $('#panelDiv')[0].style.display = 'none';
        $('li:contains("退出登录")')[0].addEventListener('click', function () {
            $('#panelDiv')[0].style.display = 'block';
        });
        document.addEventListener('mouseup', function (e) {
            if (!panelDiv.contains(e.target) && !div.contains(e.target) && !$('#login-box')[0]) {
                panelDiv.style.display = 'none';
            }
        });
        $('#multiaccImport')[0].addEventListener('click', function () {
            window.open('https://greasyfork.org/en/users/906989-zmz125000', '_blank');
        });
        $('#multiaccImport')[0].style.display = 'none';
        monitorLoginPage();
        return div;
    }

    function updateOption() {
        for (let name in cookieData) {
            if (!$('button[class="accSelBtn"]:contains(' + name + ')')[0]) {
                let btn = document.createElement('button');
                btn.className = 'accSelBtn';
                btn.textContent = name;
                $('#accBtnsDiv')[0].appendChild(btn);
                let btnDel = document.createElement('button');
                btnDel.textContent = 'X';
                btnDel.className = 'accSelBtn';
                $('#accBtnsDiv')[0].appendChild(btnDel);
                let linebreak = document.createElement("br");
                $('#accBtnsDiv')[0].appendChild(linebreak);
                btn.addEventListener('click', function () {
                    changeActiveCookie(cookieData[name][0], cookieData[name][1]);
                });
                btnDel.addEventListener('click', function () {
                    if (confirm("确定删除" + name + "?")) {
                        deleteCookie(name);
                        $('#accBtnsDiv')[0].removeChild(btn);
                        $('#accBtnsDiv')[0].removeChild(btnDel);
                        $('#accBtnsDiv')[0].removeChild(linebreak);
                    }
                });
            }
        }
    }

    // 保存 读取 导入 切换 删除cookie
    // cookieData={ name:cookie,...}
    function loadData() {
        try {
            return JSON.parse(localStorage["multiacc"]);
        } catch (e) {
            localStorage["multiacc"] = {};
            return {};
        }
    }

    function saveData() {
        localStorage["multiacc"] = JSON.stringify(cookieData);
    }

    // save button
    async function importCookie() {
        if ($('button:contains("登录")')[0]) {
            await sleep(1000);
            importCookie();
            return;
        }

        if (!$('input[placeholder="请选择账套"]')[0]) {
            var name = localStorage['userName'];
            var phone = localStorage['phone'];
            var password = localStorage['password'];
            if (name && !cookieData[name]) {
                cookieData[name] = [];
            }
            if (phone) {
                cookieData[name][0] = phone;
            }
            if (password) {
                cookieData[name][1] = password;
            }
            localStorage.removeItem('phone');
            localStorage.removeItem('password');
            saveData();
            updateOption();
        }
    }

    function deleteCookie(name) {
        if (name) {
            delete cookieData[name];
            saveData();
        }
    }

    function changeActiveCookie(phone, password) {
        var url = new URL(window.location.href);
        var scd = url.searchParams.get("scd");
        var process = url.searchParams.get("process");
        var order = url.searchParams.get("order");
        var host = window.location.host;
        var password = password ? password : '123456';
        if (scd) {
            var url = 'http://' + host + '/mest/?autologin=1&username=' + phone + '&password=' + password + '&scd=' + scd + '#/login?redirect=%2Fbusiness_example_production%2FprocessReport';
        } else {
            var url = 'http://' + host + '/mest/?autologin=1&username=' + phone + '&password=' + password + '#/login';
        }
        //localStorage.removeItem('mest__ALL_MENU_ROUTES');
        //localStorage.removeItem('mest__ACCESSED_ROUTES');
        //localStorage.removeItem('permissions');
        window.open(url, '_blank');
    }

    function addGlobalStyle(css) {
        var head, style;
        head = document.getElementsByTagName('head')[0];
        if (!head) {
            return;
        }
        style = document.createElement('style');
        // style.type = 'text/css';
        style.innerHTML = css;
        head.appendChild(style);
    }
    // init
    window.cookieData = loadData();
    insertDiv();
    monitorLogout();
    updateOption();
    addGlobalStyle(`.multiaccPanel {
        position: fixed;
        z-index: 1000000;
        height: auto;
        width: auto;
        border: black;
        top: 30px;
        right: 30px;
        opacity: 0.95;
        right: 190px;
        background: #E5E7E9;
        border-radius: 12px;
        padding: 10px 10px;
    }

    .multiaccBtn {
        margin-top: 10px;
        margin-left: 10px;
        margin-bottom: 10px;
        font-size: large;
        background-color: #633974;
        border: none;
        color: white;
        padding: 10px 15px;
        border-radius: 8px;
    }

    .multiaccBtn:hover {
        background-color: green;
    }

    .accSelBtn {
        background-color: #2980B9;
        border: none;
        color: white;
        padding: 10px 15px;
        text-align: center;
        font-size: large;
        border-radius: 8px;
        vertical-align: middle;
        margin-top: 10px;
        margin-bottom: 10px;
        margin-left: 10px;
        margin-right: 10px;
    }
    
    .is-link {
        cursor: pointer;
    }

    .accSelBtn:hover {
        background-color: green;
    }`);
})();