这个工具是基于SocialEngineeringDictionaryGenerator工具进行修改的,修改了布局和部分样饰,使其更加适应typecho。
下面是修改后的代码,只要复制后在!!!扩内输入下面代码就可以在你的typecho上布置。
也可以直接用我布置好的:https://blog.hgtrojan.com/index.php/sg.html


<html lang="zh">
<head>
    <meta charset="UTF-8">
    <style>
        html, body {
            width: 1200px;
        }
        body {
            padding-bottom: 24px;
        }
        label {
            width: 100px;
            display: inline-block;
            text-align: right;
            font-size: 14px;
            color: #495060;
            padding: 10px 12px 10px 0;
        }
        label:empty {
            width: 0;
        }
        input {
            width: 200px;
            height: 24px;
            padding: 2px 6px;
            font-size: 12px;
            border: 1px solid #dddee1;
            border-radius: 4px;
        }
        input:hover,input:focus {
            border-color: #57a3f3;
            box-shadow: 0 0 0 2px #a0c3e7;
        }
        input:focus {
            outline: none;
        }
        [type='checkbox'] {
            display: none;
        }
        .switch {
            width: 40px;
            height: 20px;
            background: #F1F1F1;
            display: inline-block;
            border-radius: 20px;
            transition: background 0.4s;
            padding: 0;
            vertical-align: middle;
            cursor: pointer;
        }
        .switch > .ball {
            display: block;
            width: 16px;
            height: 16px;
            border-radius: 16px;
            background: #E9E9E9;
            border: 2px solid #d5d0d0;
            transition: all 0.4s;

        }
        [type='checkbox']:checked + label {
            background: #2d8cf0;
        }
        [type='checkbox']:checked + label > .ball {
            margin-left: 20px;
        }
        [type='checkbox']:active + label > .ball  {
            width: 30px;
            margin-left: 10px;
        }
        input[type='button'] {
            background-color: #57a3f3;
            color: white;
            border: 1px solid #e4e5e7;
            box-shadow: unset;
            cursor: pointer;
            padding: 0 10px;
            height: 35px;
            font-size: 14px;
        }
         .alert-info {
            display: flex;
            align-items: center;
            padding: 8px 15px;
            margin: 10px auto; /* 居中显示 */
            max-width: 615px; /* 最大宽度为 615px */
            font-size: 14px;
            background-color: rgb(232, 243, 255);
            border: 1px solid transparent;
        }

        .alert-icon {
            width: 1.1em;
            margin-right: 8px;
            color: rgb(22, 93, 255);
            vertical-align: middle;
        }
        .loading {
            position: fixed;
            top: 0;
            left: 0;
            width: 100vw;
            height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            padding-top: 0;
            background-color: rgba(0, 0, 0, 0.4);
        }
        .loading-bg {
            border-radius: 50%;
            border: 5px solid #d5d0d0;
            border-left: 5px solid rgb(22, 93, 255);
            animation: load 1.5s linear infinite;
            width: 50px;
            height: 50px;
        }

        @keyframes load {
            from {
                transform: rotate(0deg);
            }
            to {
                transform: rotate(360deg);
            }
        }
        .nav-item {
            height: 100%;
            cursor: pointer;
            z-index: 1;
        }
        .nav-item>:first-child {
            line-height: 50px;
            padding: 0 15px;
        }
        .nav-item a {
            text-align: center;
            color: unset;
            text-decoration: unset;
        }
        .nav-item:hover, .nav-item .nav-item-box li:hover {
            background-color: #57a3f3;
        }
        .nav-item .nav-item-box {
            max-height: 0;
            transition: max-height 0.5s;
            overflow: hidden;
        }
        .nav-item:hover .nav-item-box {
           max-height: 2000px;
        }
        .nav-item .nav-item-box ul {
            background-color: #495060;
            margin: 0;
            padding: 0;
        }
        .nav-item .nav-item-box li {
            padding: 5px;
        }
    </style>
    <script>
        function reset() {
            document.getElementById('first_name').value = '';
            document.getElementById('second_name').value = '';
            document.getElementById('third_name').value = '';
            document.getElementById('birthday').value = '';
            document.getElementById('birthday2').value = '';
            document.getElementById('email').value = '';
            document.getElementById('mobile').value = '';
            document.getElementById('telephone').value = '';
            document.getElementById('username').value = '';
            document.getElementById('account').value = '';
            document.getElementById('organization').value = '';
            document.getElementById('company').value = '';
            document.getElementById('like_use').value = '';
            document.getElementById('id_card').value = '';
            document.getElementById('connector').value = '';
            document.getElementById('connector_left').checked = false;
            document.getElementById('connector_middle').checked = false;
            document.getElementById('connector_right').checked = false;
            document.getElementById('common').value = '123,888,666,000,111,aaa,abc,qaz,qwe,asd,zxc,!@#,1234,1qaz,qwer,asdf,zxcv,!@#$,1357,2468,0123,6789,6666,8888,12345,123456';
            document.getElementById('have_year').checked = false;
            document.getElementById('year').value = '';
            document.getElementById('number_filter').checked = false;
            document.getElementById('string_filter').checked = false;
            document.getElementById('long').value = 16;
            document.getElementById('short').value = 6;
            document.getElementById('capitalize').checked = true;
            document.getElementById('lowercase').checked = false;
            document.getElementById('uppercase').checked = false;
            document.getElementById('result').style.display='none';
        }

        /**
         * 得到字符串大写,包含原文,去空
         * @param l list,需要处理的字符串列表
         */
        function get_upper(l) {
            const upperPattern = new RegExp(".*[a-z].*");
            return l.concat(l.map(i=>upperPattern.test(i)?i.toUpperCase():'')).filter(Boolean);
        }

        /**
         * 得到字符串小写,包含原文,去空
         * @param l list,需要处理的字符串列表
         */
        function get_lower(l) {
            const lowerPattern = new RegExp(".*[A-Z].*");
            return l.concat(l.map(i=>lowerPattern.test(i)?i.toLowerCase():'')).filter(Boolean);
        }

        /**
         * 首字母大写,包含原文,去空
         * @param l list,需要处理的字符串列表
         */
        function get_capitalize(l) {
            const capitalizePattern = new RegExp("^[a-z].*");
            return l.concat(l.map(i=>capitalizePattern.test(i)?i.replace(/( |^)[a-z]/g, (L) => L.toUpperCase()):'')).filter(Boolean);
        }

        /**
         * 去重去空后的列表
         * @param l list,需要处理的字符串列表
         */
        function get_distinct_list(l) {
            return Array.from(new Set(l)).filter(Boolean);
        }

        /**
         * 小于等于x位自动重复, 返回原文及重复后的列表组合,去空
         * @param l list,需要重复的列表
         * @param x int,小于等于此长度将自动重复
         */
        function get_repeat(l, x) {
            x = (typeof x === 'undefined') ? 3: x;
            const lr = l.map(i => (i.length > 0 && i.length <= x) ? i+i: '');
            return l.concat(lr).filter(Boolean);
        }

        /**
         * 取密码前几位及后几位,包含原文,去空
         * @param s str, 需要处理的字符串
         * @param l int, 需要的长度,可输入任意数量
         */
        function get_head_tail(s, ...l) {
            return [s].concat(l.map(i=>s.length>i?[s.substring(0,i), s.substring(s.length-i)]:[]).reduce((a, b) => a.concat(b))).filter(Boolean);
        }

        /**
         * 列表去掉过长和过短
         * @param l list, 需要处理的字符串列表
         * @param start 最小长度
         * @param end 最大长度
         */
        function drop_short_long(l, start, end) {
            start = (typeof start === 'undefined') ? 6: start;
            end = (typeof end === 'undefined') ? 16: end;
            return l.filter(i=>((start ? i.length>=start : true) && (end ? i.length<=end : true)));
        }

        /**
         * 去掉纯字母或纯数字
         * @param l 需要处理的字符串列表
         * @param rtype 可选str或int
         */
        function drop_string_int(l, rtype) {
            if (['str', 'int'].indexOf(rtype) < 0) {
                return l;
            }
            const pattern = rtype === 'str' ? /^[a-zA-Z]*$/ : /^[0-9]*$/;
            return l.filter(i=>!pattern.test(i));
        }

        /**
         * 计算array的笛卡尔积,相当于python中的itertools.product
         * calc_descartes([['2019', '2020'], ['白色', '灰色', '蓝色']]) => ['2019白色', '2019灰色', '2019蓝色', '2020白色', '2020灰色', '2020蓝色']
         * @param array
         */
        function calc_descartes(array) {
            if (array.length < 2) return array[0] || [];
            return array.reduce((total, currentValue) => {
                let res = [];
                total.forEach(t => {
                    currentValue.forEach(cv => {
                        res.push([t, cv]);
                    })
                })
                return res;
            })
        }

        /**
         * 数组排列组合,等于python中的itertools.permutations,permutations([1,2,3,4], 2) => [[1,2],[1,3],[1,4],[2,1],[2,3],[2,4],[3,1],[3,2],[3,4],[4,1],[4,2],[4,3]]
         * @param arr 源数组
         * @param size 选取元素的个数
         */
        function permutations(arr, size) {
            //定义数组保存结果
            let result = [];

            //selected数组包含已经选中的元素
            //arr数组包含未选中元素数组,size表示还需选取元素的个数
            function _combine(selected, arr, size) {
                //如果size===0,则一次组合完成,存入result数组并返回
                if (size === 0) {
                    result.push(selected);
                    return;
                }
                //遍历所有可能选中的元素,遍历的次数为数组长度减去(size-1)
                for (let i = 0; i < arr.length; i++) {
                    //复制数组,避免对selected数组数据的更改
                    let temp = selected.slice();
                    temp.push(arr[i]);
                    _combine(temp, arr.slice(0, i).concat(arr.slice(i + 1)), size - 1);
                }
            }
            _combine([], arr, size);
            return result;
        }
        function show_loading() {
            const loading = document.getElementById('loading');
            loading.style.display = 'block';
        }
        function hide_loading() {
            const loading = document.getElementById('loading');
            loading.style.display = 'none';
        }

        function main() {
            show_loading();
            setTimeout(() => {
                const start_time = new Date().getTime();
                const pass_list = generate();

                const pass_first_length = document.getElementById('pass_first_length');
                const pass_first_text = document.getElementById('pass_first_text');
                const pass_second_length = document.getElementById('pass_second_length');
                const pass_second_text = document.getElementById('pass_second_text');
                const pass_third_length = document.getElementById('pass_third_length');
                const pass_third_text = document.getElementById('pass_third_text');
                const pass_all_length = document.getElementById('pass_all_length');
                const pass_all_text = document.getElementById('pass_all_text');
                const result = document.getElementById('result');
                pass_first_text.value=pass_list[0].join('\n');
                pass_first_text.rows=pass_list[0].length;
                pass_first_length.innerText=pass_list[0].length.toString();
                pass_second_text.value=pass_list[1].join('\n');
                pass_second_text.rows=pass_list[1].length;
                pass_second_length.innerText=pass_list[1].length.toString();
                pass_third_text.value=pass_list[2].join('\n');
                pass_third_text.rows=pass_list[2].length;
                pass_third_length.innerText=pass_list[2].length.toString();
                let pass_all = pass_list.flat();
                pass_all_text.value=pass_all.join('\n');
                pass_all_text.rows=pass_all.length;
                pass_all_length.innerText=pass_all.length.toString();
                result.style.display='flex';

                const end_time = new Date().getTime();
                console.log(`cost ${end_time - start_time}ms`)

                hide_loading();
            }, 0);
        }

        function download() {
            const list = generate().flat();
            console.log(list.length);

            const ele = document.createElement('a');
            ele.download = "passwords.txt";
            ele.style.display = "none";

            const blob = new Blob([list.join("\n")]);
            ele.href = URL.createObjectURL(blob);
            document.body.appendChild(ele);
            ele.click();
            document.body.removeChild(ele);
        }

        function generate() {
            const first_name = document.getElementById('first_name')['value'];
            const second_name = document.getElementById('second_name')['value'];
            const third_name = document.getElementById('third_name')['value'];
            const birthday = document.getElementById('birthday')['value'];
            const birthday2 = document.getElementById('birthday2')['value'];
            const email = document.getElementById('email')['value'];
            const mobile = document.getElementById('mobile')['value'];
            const telephone = document.getElementById('telephone')['value'];
            const username = document.getElementById('username')['value'];
            const account = document.getElementById('account')['value'];
            const organization = document.getElementById('organization')['value'];
            const company = document.getElementById('company')['value'];
            const like_use = document.getElementById('like_use')['value'];
            const id_card = document.getElementById('id_card')['value'];
            const work_no = document.getElementById('work_no')['value'];
            const connector = document.getElementById('connector')['value'].split('');
            const connector_left = document.getElementById('connector_left')['checked'];
            const connector_middle = document.getElementById('connector_middle')['checked'];
            const connector_right = document.getElementById('connector_right')['checked'];
            const common = document.getElementById('common')['value'];
            const have_year = document.getElementById('have_year')['checked'];
            const year = parseInt(document.getElementById('year')['value']);
            const number_filter = document.getElementById('number_filter')['checked'];
            const string_filter = document.getElementById('string_filter')['checked'];
            const long = parseInt(document.getElementById('long')['value']);
            const short = parseInt(document.getElementById('short')['value']);
            const capitalize = document.getElementById('capitalize')['checked'];
            const lowercase = document.getElementById('lowercase')['checked'];
            const uppercase = document.getElementById('uppercase')['checked'];

            const first_name_combine = /^[a-zA-Z0-9]+$/.test(first_name) ? get_repeat([first_name], 3) : [''];
            const last_name_combine = /^[a-zA-Z0-9]+$/.test(second_name + third_name) ? get_repeat([second_name + third_name], 3) : [''];
            let name_all = [first_name_combine[0] + last_name_combine[0], last_name_combine[0] + first_name_combine[0]];
            const last_name_a_b = second_name.substring(0, 1) + third_name.substring(0, 1);
            name_all = name_all.concat([first_name.substring(0, 1) + last_name_a_b, first_name_combine[0] + last_name_a_b, last_name_a_b + first_name.substring(0, 1), last_name_a_b + first_name_combine[0], first_name.substring(0, 1) + second_name + third_name, second_name + third_name, first_name]);
            name_all = name_all.concat(get_repeat(get_head_tail(username, 3, 4))).concat(get_repeat(get_head_tail(account, 3, 4)))
            name_all = get_distinct_list(name_all);
            console.log('name_all', name_all);

            let birthday_all = [];
            let b = birthday.replaceAll('-', '');
            let b2 = birthday2.replaceAll('-', '');
            birthday_all = birthday_all.concat(get_head_tail(b, 4)).concat(get_head_tail(b2, 4));
            birthday_all = birthday_all.concat(b.substring(4, 5) === '0' ? [b.substring(5, 8), b.substring(5, 8) + b.substring(5, 8)] : []);
            birthday_all = birthday_all.concat(b2.substring(4, 5) === '0' ? [b2.substring(5, 8), b2.substring(5, 8) + b2.substring(5, 8)] : []);
            birthday_all = get_distinct_list(birthday_all);
            console.log('birthday_all', birthday_all);

            const email_all = get_distinct_list([email].concat(get_repeat(get_head_tail(email.split('@')[0], 3, 4), 3)));
            console.log('email_all', email_all);

            let phone_all = get_distinct_list(get_repeat(get_head_tail(mobile, 3, 4, 5, 6)).concat(get_repeat(get_head_tail(telephone, 3, 4, 5, 6))));
            console.log('phone_all', phone_all);

            let id_card_all = id_card.length > 0 ? get_distinct_list(get_repeat(get_head_tail(id_card, 3, 4, 6, 8).concat(get_head_tail(id_card.substring(0, id_card.length - 1), 3, 4, 6, 8).slice(1)))) : [];
            console.log('id_card_all', id_card_all);

            let work_no_all = get_distinct_list(get_repeat(get_head_tail(work_no, 3, 4, 6, 8)));
            console.log('work_no_all', work_no_all);

            let org_all = get_distinct_list([organization, company].map(i => get_repeat(get_head_tail(i, 3, 4))).reduce((a, b) => a.concat(b)));
            console.log('org_all', org_all);

            let like_all = get_distinct_list(like_use.split(',').map(i => get_repeat(get_head_tail(i, 3, 4))).reduce((a, b) => a.concat(b)));
            console.log('like_all', like_all);

            let common_all = common.split(',');
            if (have_year) {
                Array.from(Array(year), (el, i) => common_all.push((new Date().getFullYear() - year + i).toString()));
            }
            console.log('common_all', common_all);

            let pass_list_all = [name_all, birthday_all, email_all, phone_all, id_card_all, work_no_all, org_all, like_all, common_all];
            let pass_first = pass_list_all.reduce((a, b) => a.concat(b));
            console.log('pass_first', pass_first);

            let pass_second = [];
            let pass_third = [];

            permutations(pass_list_all, 2).forEach(passArr => {
                let pass_combine = calc_descartes(passArr);
                pass_second = pass_second.concat(pass_combine.map(p=>p[0]+p[1]));
                pass_combine.forEach(p=>{
                    connector.forEach(c=>{
                    if (connector_left) {
                        pass_third.push(c+p[0]+p[1]);
                    }
                    if (connector_middle) {
                        pass_third.push(p[0]+c+p[1]);
                    }
                    if (connector_right) {
                        pass_third.push(p[0]+p[1]+c);
                    }
                    });
                });
            });

            let pass_list = [pass_first, pass_second, pass_third];
            pass_list = pass_list.map(i => drop_short_long(i, short, long));
            if (number_filter) {
                pass_list = pass_list.map(i => drop_string_int(i, 'int'));
            }
            if (string_filter) {
                pass_list = pass_list.map(i => drop_string_int(i, 'str'));
            }
            if (capitalize) {
                pass_list = pass_list.map(i => get_capitalize(i));
            }
            if (lowercase) {
                pass_list = pass_list.map(i => get_lower(i));
            }
            if (uppercase) {
                pass_list = pass_list.map(i => get_upper(i));
            }
            pass_list = pass_list.map(i => get_distinct_list(i));
            return pass_list;
        }

        function copy(cid) {
            const textNode = document.getElementById(cid);
            textNode.select();
            document.execCommand("Copy");
            textNode.blur();
            const notification = document.getElementById('notification');
            notification.style.right = '20px';
            notification.style.visibility = 'visible';
            notification.style.opacity = '1';
            setTimeout(()=>{
                notification.style.right = '-20px';
                notification.style.visibility = 'hidden';
                notification.style.opacity = '0';
            }, 3000)
        }
    </script>
</head>
<body>

<div class="alert-info">
    <svg class="alert-icon" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg" stroke="currentColor" stroke-width="4" stroke-linecap="butt" stroke-linejoin="miter"><path fill-rule="evenodd" clip-rule="evenodd" d="M24 44c11.046 0 20-8.954 20-20S35.046 4 24 4 4 12.954 4 24s8.954 20 20 20Zm2-30a1 1 0 0 0-1-1h-2a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1v-2Zm0 17h1a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-6a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1h1v-8a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v11Z" fill="currentColor" stroke="none"></path></svg>
    <span>所有输入框均是选填, 尽量减少无效输入以避免生成结果过多</span>
</div>

<div class="alert-info">
    <svg class="alert-icon" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg" stroke="currentColor" stroke-width="4" stroke-linecap="butt" stroke-linejoin="miter"><path fill-rule="evenodd" clip-rule="evenodd" d="M24 44c11.046 0 20-8.954 20-20S35.046 4 24 4 4 12.954 4 24s8.954 20 20 20Zm2-30a1 1 0 0 0-1-1h-2a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1v-2Zm0 17h1a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-6a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1h1v-8a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v11Z" fill="currentColor" stroke="none"></path></svg>
    <span>所有代码均开源, 功能均使用原生js实现, 不会访问任何外部资源, 可以尝试使用自己的信息测试, 如有问题请<a href="https://github.com/zgjx6/SocialEngineeringDictionaryGenerator/issues">提交issue</a></span>
</div>

<div style="display: flex;">
    <label for="first_name">姓名</label>
    <input type="text" name="first_name" id="first_name" placeholder="请输入姓(英文)" title="请输入姓(英文)" />
    <label for="second_name"></label>
    <input type="text" name="second_name" id="second_name" placeholder="请输入名的第一个字(英文)" title="请输入名的第一个字(英文)" />
    <label for="third_name"></label>
    <input type="text" name="third_name" id="third_name" placeholder="请输入名的第二个字(如果有,英文)" title="请输入名的第二个字(如果有,英文)" />
</div>

<div>
    <label for="birthday">生日</label><input type="date" name="birthday" id="birthday" placeholder="公历生日" title="公历生日" />
    <label for="birthday2"></label><input type="date" name="birthday2" id="birthday2" placeholder="农历生日" title="农历生日" />
</div>
<div>
    <label for="email">邮件</label><input type="email" name="email" id="email" placeholder="请输入邮箱" title="请输入邮箱" />
</div>
<div>
    <label for="mobile">电话</label><input type="tel" name="mobile" id="mobile" placeholder="请输入座机号,不要-号" title="请输入座机号,不要-号" />
    <label for="telephone"></label><input type="tel" name="telephone" id="telephone" placeholder="请输入手机号" title="请输入手机号" />
</div>
<div>
    <label for="username">用户名</label><input type="text" name="username" id="username" placeholder="请输入用户名(英文)" title="请输入用户名(英文)" />
    <label for="account"></label><input type="text" name="account" id="account" placeholder="请输入用户账号" title="请输入用户账号" />
</div>
<div>
    <label for="organization">组织</label><input type="text" name="organization" id="organization" placeholder="请输入组织名(英文)" title="请输入组织名(英文)" />
    <label for="company"></label><input type="text" name="company" id="company" placeholder="请输入公司名(英文)" title="请输入公司名(英文)" />
</div>
<div>
    <label for="like_use">短语</label><input type="text" name="like_use" id="like_use" style="width: 320px;" placeholder="请输入常用短语(英文),如iloveyou,多个用逗号分隔" title="请输入常用短语(英文),如iloveyou,多个用逗号分隔" />
</div>
<div>
    <label for="id_card">身份证号</label><input type="text" name="id_card" id="id_card" placeholder="请输入身份证号" title="请输入身份证号" />
</div>
<div>
    <label for="work_no">工号</label><input type="text" name="work_no" id="work_no" placeholder="请输入工号" title="请输入工号" />
</div>
<div>
    <label for="connector">连接符</label>
    <label for="connector_left" style="width: 30px;padding-right: 5px;">左</label><input type="checkbox" name="connector_left" id="connector_left" value="左"/><label class="switch" for="connector_left"><span class="ball"></span></label>
    <label for="connector_middle" style="width: 30px;padding-right: 5px;">中</label><input type="checkbox" name="connector_middle" id="connector_middle" value="中"/><label class="switch" for="connector_middle"><span class="ball"></span></label>
    <label for="connector_right" style="width: 30px;padding-right: 5px;">右</label><input type="checkbox" name="connector_right" id="connector_right" value="右"/><label class="switch" for="connector_right"><span class="ball"></span></label>
    <input type="text" name="connector" id="connector" style="width: 500px;" placeholder="请输入连接符(如.!_-#@:$&*~?%+=/|),尽量减少,否则会极大增加密码数量" title="请输入连接符(如.!_-#@:$&*~?%+=/|),尽量减少,否则会极大增加密码数量" />
    <span title="连接符用于连接两条信息. 如姓zhang且生日为0229,用@在中间连接则为zhang@0229" style="cursor: help"><svg class="alert-icon" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg" stroke="currentColor" stroke-width="4" stroke-linecap="butt" stroke-linejoin="miter"><path fill-rule="evenodd" clip-rule="evenodd" d="M24 44c11.046 0 20-8.954 20-20S35.046 4 24 4 4 12.954 4 24s8.954 20 20 20Zm-3.862-24.021a.461.461 0 0 0 .462-.462 2.37 2.37 0 0 1 .636-1.615C21.64 17.48 22.43 17 23.988 17c1.465 0 2.483.7 3.002 1.493.555.848.446 1.559.182 1.914-.328.444-.736.853-1.228 1.296-.15.135-.335.296-.533.468-.354.308-.75.654-1.067.955C23.22 24.195 22 25.686 22 28v.013a1 1 0 0 0 1.006.993l2.008-.012a.993.993 0 0 0 .986-1c.002-.683.282-1.19 1.101-1.97.276-.262.523-.477.806-.722.21-.18.439-.379.713-.626.57-.513 1.205-1.13 1.767-1.888 1.516-2.047 1.161-4.634-.05-6.485C29.092 14.398 26.825 13 23.988 13c-2.454 0-4.357.794-5.642 2.137-1.25 1.307-1.742 2.954-1.746 4.37 0 .26.21.472.47.472h3.068Zm1.868 14.029a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1V32a1 1 0 0 0-1-1h-2a1 1 0 0 0-1 1v2.008Z" fill="currentColor" stroke="none"></path></svg></span>
</div>
<div>
    <label for="common">常用词组</label><input type="text" name="common" id="common" style="width: 700px;" value="123,888,666,000,111,aaa,abc,qaz,qwe,asd,zxc,!@#,1234,1qaz,qwer,asdf,zxcv,!@#$,1357,2468,0123,6789,6666,8888,12345,123456" placeholder="请输入常用词组,如123456,abcd等,多个用逗号分隔" title="请输入常用词组,如123456,abcd等,多个用逗号分隔" />
</div>
<div>
    <label for="have_year">最近年份</label><input type="checkbox" name="have_year" id="have_year"/><label class="switch" for="have_year"><span class="ball"></span></label>
    <label for="year" style="display: none"></label><input type="number" name="year" id="year" style="width: 100px;" placeholder="最近几年的年份,如果要特定年份可以输入到常用词组中" title="最近几年的年份,如果要特定年份可以输入到常用词组中" value="10"/>
</div>
<div>
    <label for="number_filter">去掉纯数字</label><input type="checkbox" name="number_filter" id="number_filter"/><label class="switch" for="number_filter"><span class="ball"></span></label>
</div>
<div>
    <label for="string_filter">去掉纯字母</label><input type="checkbox" name="string_filter" id="string_filter"/><label class="switch" for="string_filter"><span class="ball"></span></label>
</div>
<div>
    <label>长度</label>
    <label for="short" style="width: 80px;padding-right: 5px;">不能小于</label><input type="number" name="short" id="short" style="width: 100px;" placeholder="请输入最小长度, 0为忽略" title="请输入最小长度, 0为忽略" value="6" />
    <label for="long" style="width: 60px;padding-right: 5px;">不能大于</label><input type="number" name="long" id="long" style="width: 100px;" placeholder="请输入最大长度, 0为忽略" title="请输入最大长度, 0为忽略" value="16" />
</div>
<div>
    <label>大小写</label>
    <label for="capitalize" style="width: 80px;padding-right: 5px;">首字母大写</label><input type="checkbox" checked="checked" name="capitalize" id="capitalize" value="首字母大写"/><label class="switch" for="capitalize"><span class="ball"></span></label>
    <label for="lowercase" style="width: 50px;padding-right: 5px;">全小写</label><input type="checkbox" name="lowercase" id="lowercase" value="全小写"/><label class="switch" for="lowercase"><span class="ball"></span></label>
    <label for="uppercase" style="width: 50px;padding-right: 5px;">全大写</label><input type="checkbox" name="uppercase" id="uppercase" value="全大写"/><label class="switch" for="uppercase"><span class="ball"></span></label>
</div>
<div style="margin: 20px 0 0 50px;">
    <label for="generate"></label><input type="button" name="generate" id="generate" value="生成密码" onclick="main()" />
    <label for="reset"></label><input type="button" name="reset" id="reset" value="重置" onclick="reset()"/>
    <label for="download"></label><input type="button" name="download" id="download" value="下载" onclick="download()"/>
</div>
<div style="margin-top: 50px;display: none;" id="result">
    <div style="width: 350px;text-align: center;">
        <div style="margin-bottom: 10px;">
            <span>单项信息密码-<span id="pass_first_length"></span>个</span>
            <input type="button" name="pass_first_copy" id="pass_first_copy" value="复制" style="width: 50px;height: 20px;" onclick="copy('pass_first_text')" />
        </div>
        <label for="pass_first_text" style="display: none"></label><textarea id="pass_first_text" cols="25"></textarea>
    </div>
    <div style="width: 350px;text-align: center;">
        <div style="margin-bottom: 10px;">
            <span>两项信息密码-<span id="pass_second_length"></span>个</span>
            <input type="button" name="pass_second_copy" id="pass_second_copy" value="复制" style="width: 50px;height: 20px;" onclick="copy('pass_second_text')" />
        </div>
        <label for="pass_second_text" style="display: none"></label><textarea id="pass_second_text" cols="25"></textarea>
    </div>
    <div style="width: 350px;text-align: center;">
        <div style="margin-bottom: 10px;">
            <span>两项信息加连接符密码-<span id="pass_third_length"></span>个</span>
            <input type="button" name="pass_third_copy" id="pass_third_copy" value="复制" style="width: 50px;height: 20px;" onclick="copy('pass_third_text')" />
        </div>
        <label for="pass_third_text" style="display: none"></label><textarea id="pass_third_text" cols="25"></textarea>
    </div>
    <div style="width: 350px;text-align: center;">
        <div style="margin-bottom: 10px;">
            <span>全部密码-<span id="pass_all_length"></span>个</span>
            <input type="button" name="pass_all_copy" id="pass_all_copy" value="复制" style="width: 50px;height: 20px;" onclick="copy('pass_all_text')" />
        </div>
        <label for="pass_all_text" style="display: none"></label><textarea id="pass_all_text" cols="25"></textarea>
    </div>
</div>
<div id="loading" style="display: none;">
    <div class="loading">
        <div class="loading-bg"></div>
    </div>
</div>
<div id="notification" style="position: fixed;right: -20px;top: 20px;visibility: hidden;opacity: 0;width: 160px; height: 60px; background-color: white; text-align: center;line-height: 60px;border: 1px solid rgb(229,230,235);border-radius: 4px;box-shadow: 0 4px 10px #0000001a;transition: right 0.4s ease-out, opacity 0.2s ease-in, visibility 0.2s ease-in;"><svg class="alert-icon" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg" stroke="currentColor" stroke-width="4" stroke-linecap="butt" stroke-linejoin="miter"><path fill-rule="evenodd" clip-rule="evenodd" d="M24 44c11.046 0 20-8.954 20-20S35.046 4 24 4 4 12.954 4 24s8.954 20 20 20Zm2-30a1 1 0 0 0-1-1h-2a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1v-2Zm0 17h1a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-6a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1h1v-8a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v11Z" fill="currentColor" stroke="none"></path></svg>已复制</div>
</body>
</html>