微件

BatchCreateEquipment:修订间差异

来自卡厄思梦境WIKI

律Rhyme留言 | 贡献
创建页面,内容为“<noinclude> 这是一个用于批量创建装备页面的Widget。 使用方法:在任何页面中添加 {{#widget:BatchCreateEquipment}} </noinclude> <includeonly> <div id="batch-create-equipment"> <style> #equipment-creator { border: 1px solid #ccc; padding: 20px; margin: 20px 0; background: #f9f9f9; border-radius: 5px; } #equipment-list { width: 100%;…”
 
律Rhyme留言 | 贡献
无编辑摘要
 
第115行: 第115行:


     <script>
     <script>
    // 等待MediaWiki模块加载
     (function() {
     (function() {
         var isCreating = false;
         // 确保MediaWiki API可用
        var stopRequested = false;
        function initBatchCreator() {
        var api = new mw.Api();
            if (typeof mw === 'undefined' || !mw.Api) {
                setTimeout(initBatchCreator, 100);
                return;
            }
 
            var isCreating = false;
            var stopRequested = false;
            var api = new mw.Api();
            var editToken = null;


        // 页面内容模板
            // 页面内容模板
        function getPageContent(pageName) {
            function getPageContent(pageName) {
            return '{{面包屑|装备图鉴}}\n' +
                return '{{面包屑|装备图鉴}}\n' +
                '<div style="display:flex;justify-content:center;align-items:center;flex-wrap:wrap;gap:5px">\n' +
                    '<div style="display:flex;justify-content:center;align-items:center;flex-wrap:wrap;gap:5px">\n' +
                '{{#invoke:装备|displaypopup|' + pageName + '|1}} {{#invoke:装备|displaypopup|' + pageName + '|2}} {{#invoke:装备|displaypopup|' + pageName + '|3}}{{#invoke:装备|displaypopup|' + pageName + '|4}} {{#invoke:装备|displaypopup|' + pageName + '|5}}\n' +
                    '{{#invoke:装备|displaypopup|{{PAGENAME}}|1}} {{#invoke:装备|displaypopup|{{PAGENAME}}|2}} {{#invoke:装备|displaypopup|{{PAGENAME}}|3}}{{#invoke:装备|displaypopup|{{PAGENAME}}|4}} {{#invoke:装备|displaypopup|{{PAGENAME}}|5}}\n' +
                '</div>\n' +
                    '</div>\n' +
                '[[分类:装备]]';
                    '[[分类:装备]]';
        }
            }


        function addLog(message, type) {
            function addLog(message, type) {
            var logDiv = document.getElementById('create-log');
                var logDiv = document.getElementById('create-log');
            logDiv.style.display = 'block';
                if (!logDiv) return;
            var logEntry = document.createElement('div');
                logDiv.style.display = 'block';
            logEntry.className = 'log-' + type;
                var logEntry = document.createElement('div');
            var timestamp = new Date().toLocaleTimeString();
                logEntry.className = 'log-' + type;
            logEntry.textContent = '[' + timestamp + '] ' + message;
                var timestamp = new Date().toLocaleTimeString();
            logDiv.appendChild(logEntry);
                logEntry.textContent = '[' + timestamp + '] ' + message;
            logDiv.scrollTop = logDiv.scrollHeight;
                logDiv.appendChild(logEntry);
        }
                logDiv.scrollTop = logDiv.scrollHeight;
            }


        function updateProgress(current, total) {
            function updateProgress(current, total) {
            var progressBar = document.getElementById('progress-bar');
                var progressBar = document.getElementById('progress-bar');
            var progressFill = document.getElementById('progress-fill');
                var progressFill = document.getElementById('progress-fill');
            progressBar.style.display = 'block';
                if (!progressBar || !progressFill) return;
            var percentage = (current / total) * 100;
                progressBar.style.display = 'block';
            progressFill.style.width = percentage + '%';
                var percentage = (current / total) * 100;
        }
                progressFill.style.width = percentage + '%';
            }


        function sleep(ms) {
            function sleep(ms) {
            return new Promise(resolve => setTimeout(resolve, ms));
                return new Promise(resolve => setTimeout(resolve, ms));
        }
            }


        async function checkPageExists(title) {
            // 获取编辑令牌
            try {
            async function getEditToken() {
                var result = await api.get({
                if (editToken) return editToken;
                    action: 'query',
                try {
                    titles: title,
                    var result = await api.get({
                    format: 'json'
                        action: 'query',
                });
                        meta: 'tokens',
                var pages = result.query.pages;
                        type: 'csrf',
                 for (var pageId in pages) {
                        format: 'json'
                     return pageId !== '-1';
                    });
                    editToken = result.query.tokens.csrftoken;
                    return editToken;
                 } catch (error) {
                     console.error('获取编辑令牌失败:', error);
                    throw error;
                 }
                 }
            } catch (error) {
                console.error('检查页面存在性失败:', error);
                return false;
             }
             }
        }


        async function createPage(title, content) {
            async function checkPageExists(title) {
            try {
                try {
                await api.postWithToken('csrf', {
                    var result = await api.get({
                    action: 'edit',
                        action: 'query',
                    title: title,
                        titles: title,
                    text: content,
                        format: 'json'
                     summary: '批量创建装备页面',
                     });
                     createonly: true,
                     var pages = result.query.pages;
                     format: 'json'
                     for (var pageId in pages) {
                });
                        return pageId !== '-1' && !pages[pageId].missing;
                return { success: true };
                    }
            } catch (error) {
                    return false;
                return { success: false, error: error };
                } catch (error) {
                    console.error('检查页面存在性失败:', error);
                    return false;
                }
             }
             }
        }


        async function startBatchCreate() {
            async function createPage(title, content) {
            if (isCreating) return;
                try {
           
                    var token = await getEditToken();
            var equipmentList = document.getElementById('equipment-list').value.trim();
                    var result = await api.post({
            if (!equipmentList) {
                        action: 'edit',
                 alert('请输入装备名称列表');
                        title: title,
                 return;
                        text: content,
                        summary: '批量创建装备页面',
                        createonly: true,
                        token: token,
                        format: 'json'
                    });
                    return { success: true, result: result };
                 } catch (error) {
                    return { success: false, error: error };
                 }
             }
             }


             var equipments = equipmentList.split('\n').filter(name => name.trim());
             async function startBatchCreate() {
            if (equipments.length === 0) {
                if (isCreating) return;
                alert('没有有效的装备名称');
               
                return;
                var equipmentList = document.getElementById('equipment-list').value.trim();
            }
                if (!equipmentList) {
                    alert('请输入装备名称列表');
                    return;
                }


            isCreating = true;
                var equipments = equipmentList.split('\n')
            stopRequested = false;
                    .map(name => name.trim())
            document.getElementById('start-create').style.display = 'none';
                    .filter(name => name);
            document.getElementById('stop-create').style.display = 'inline-block';
                   
            document.getElementById('equipment-list').disabled = true;
                if (equipments.length === 0) {
                    alert('没有有效的装备名称');
                    return;
                }


            var skipExisting = document.getElementById('skip-existing').checked;
                isCreating = true;
            var delay = parseInt(document.getElementById('create-delay').value) || 1000;
                stopRequested = false;
                editToken = null; // 重置令牌
               
                document.getElementById('start-create').style.display = 'none';
                document.getElementById('stop-create').style.display = 'inline-block';
                document.getElementById('stop-create').disabled = false;
                document.getElementById('stop-create').textContent = '停止创建';
                document.getElementById('equipment-list').disabled = true;


            addLog('开始批量创建装备页面,共 ' + equipments.length + ' 个', 'info');
                var skipExisting = document.getElementById('skip-existing').checked;
                var delay = parseInt(document.getElementById('create-delay').value) || 1000;


            var successCount = 0;
                addLog('开始批量创建装备页面,共 ' + equipments.length + ' 个', 'info');
            var skipCount = 0;
            var errorCount = 0;


            for (var i = 0; i < equipments.length; i++) {
                var successCount = 0;
                 if (stopRequested) {
                 var skipCount = 0;
                    addLog('用户停止了创建过程', 'info');
                var errorCount = 0;
                    break;
                }


                 var equipmentName = equipments[i].trim();
                 for (var i = 0; i < equipments.length; i++) {
                if (!equipmentName) continue;
                    if (stopRequested) {
                        addLog('用户停止了创建过程', 'info');
                        break;
                    }


                updateProgress(i + 1, equipments.length);
                    var equipmentName = equipments[i];
                    updateProgress(i + 1, equipments.length);


                // 检查页面是否存在
                    try {
                if (skipExisting) {
                        // 检查页面是否存在
                    var exists = await checkPageExists(equipmentName);
                        if (skipExisting) {
                    if (exists) {
                            var exists = await checkPageExists(equipmentName);
                        addLog('页面 "' + equipmentName + '" 已存在,跳过', 'info');
                            if (exists) {
                        skipCount++;
                                addLog('页面 "' + equipmentName + '" 已存在,跳过', 'info');
                        await sleep(delay / 2); // 检查操作延迟减半
                                skipCount++;
                        continue;
                                await sleep(Math.min(delay / 2, 500));
                    }
                                continue;
                }
                            }
                        }


                // 创建页面
                        // 创建页面
                var content = getPageContent(equipmentName);
                        var content = getPageContent(equipmentName);
                var result = await createPage(equipmentName, content);
                        var result = await createPage(equipmentName, content);


                if (result.success) {
                        if (result.success) {
                    addLog('成功创建页面: ' + equipmentName, 'success');
                            addLog('成功创建页面: ' + equipmentName, 'success');
                    successCount++;
                            successCount++;
                } else {
                        } else {
                    if (result.error && result.error.code === 'articleexists') {
                            if (result.error && result.error.code === 'articleexists') {
                        addLog('页面 "' + equipmentName + '" 已存在', 'info');
                                addLog('页面 "' + equipmentName + '" 已存在', 'info');
                        skipCount++;
                                skipCount++;
                    } else {
                            } else {
                        addLog('创建页面 "' + equipmentName + '" 失败: ' + (result.error ? result.error.info : '未知错误'), 'error');
                                var errorMsg = result.error ?
                                    (result.error.info || result.error.code || '未知错误') :
                                    '未知错误';
                                addLog('创建页面 "' + equipmentName + '" 失败: ' + errorMsg, 'error');
                                errorCount++;
                            }
                        }
                    } catch (error) {
                        addLog('处理页面 "' + equipmentName + '" 时出错: ' + error.message, 'error');
                         errorCount++;
                         errorCount++;
                    }
                    // 延迟下一次请求
                    if (i < equipments.length - 1 && !stopRequested) {
                        await sleep(delay);
                     }
                     }
                 }
                 }


                 // 延迟下一次请求
                 addLog('批量创建完成!成功: ' + successCount + ', 跳过: ' + skipCount + ', 失败: ' + errorCount, 'info');
                if (i < equipments.length - 1) {
 
                    await sleep(delay);
                isCreating = false;
                 }
                document.getElementById('start-create').style.display = 'inline-block';
                document.getElementById('stop-create').style.display = 'none';
                document.getElementById('equipment-list').disabled = false;
            }
 
            // 绑定事件
            var startBtn = document.getElementById('start-create');
            if (startBtn) {
                startBtn.addEventListener('click', startBatchCreate);
            }
           
            var stopBtn = document.getElementById('stop-create');
            if (stopBtn) {
                stopBtn.addEventListener('click', function() {
                    stopRequested = true;
                    this.disabled = true;
                    this.textContent = '正在停止...';
                 });
             }
             }


             addLog('批量创建完成!成功: ' + successCount + ', 跳过: ' + skipCount + ', 失败: ' + errorCount, 'info');
             var clearBtn = document.getElementById('clear-log');
            if (clearBtn) {
                clearBtn.addEventListener('click', function() {
                    var log = document.getElementById('create-log');
                    var progressBar = document.getElementById('progress-bar');
                    var progressFill = document.getElementById('progress-fill');
                   
                    if (log) {
                        log.innerHTML = '';
                        log.style.display = 'none';
                    }
                    if (progressBar) {
                        progressBar.style.display = 'none';
                    }
                    if (progressFill) {
                        progressFill.style.width = '0';
                    }
                });
            }


             isCreating = false;
             addLog('装备批量创建工具已就绪', 'info');
            document.getElementById('start-create').style.display = 'inline-block';
            document.getElementById('stop-create').style.display = 'none';
            document.getElementById('equipment-list').disabled = false;
         }
         }


         // 绑定事件
         // 开始初始化
         document.getElementById('start-create').addEventListener('click', startBatchCreate);
         if (document.readyState === 'loading') {
       
            document.addEventListener('DOMContentLoaded', initBatchCreator);
        document.getElementById('stop-create').addEventListener('click', function() {
        } else {
            stopRequested = true;
             initBatchCreator();
            this.disabled = true;
         }
            this.textContent = '正在停止...';
        });
 
        document.getElementById('clear-log').addEventListener('click', function() {
            document.getElementById('create-log').innerHTML = '';
            document.getElementById('create-log').style.display = 'none';
            document.getElementById('progress-bar').style.display = 'none';
             document.getElementById('progress-fill').style.width = '0';
         });
     })();
     })();
     </script>
     </script>
</div>
</div>
</includeonly>
</includeonly>

2025年10月18日 (六) 09:51的最新版本

这是一个用于批量创建装备页面的Widget。 使用方法:在任何页面中添加

批量创建装备页面

(建议设置1000ms以上,避免请求过快)