您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
auto change domain dns!
// ==UserScript== // @name 批量修改dns // @namespace http://tampermonkey.net/ // @version 2.1.2 // @description auto change domain dns! // @author lmlife // @match https://www.onamae.com/* // @icon https://www.google.com/s2/favicons?sz=64&domain=google.com // @grant none // @license MIT // ==/UserScript== var customDataKey = 'custom_auto--data'; var customStatusKey = 'custom_auto--status'; var customLogKey = 'custom_auto--log'; var currentDatetime = new Date().toLocaleString() var customData = JSON.parse(sessionStorage.getItem(customDataKey) || '{ "data": [] }'); var { data } = customData; var customStatus = JSON.parse(sessionStorage.getItem(customStatusKey) || '{ "index": -1, "data": [] }'); var { index } = customStatus ; (function () { $(document).ready( () => { (async () => { if (window.location.href.indexOf('ns_update/input') > -1) { inputPageEntry(); } else if (window.location.href.indexOf('ns_update/confirm') > -1) { confirmPageEntry(); } else if (window.location.href.indexOf('ns_update/result') > -1) { resultPageEntry(); } })(); } ) })(); function inputPageEntry() { console.log(`进入 [ ns_update/input ], 第${index + 1}组`); var dom = '' if (index === -1) { dom = generateStartDom() setTimeout(() => { initFileHandler() }) } else if (index < data.length) { dom = generateUploadingDom(index) const { domains, dns } = data[index] const observer1 = new MutationObserver(async () => { submitHandler(dns); const pagination = $('#rpp') if (pagination) { const options = pagination[0] const option = options[options.length - 1] onChangeRpp(option.value) } observer1.disconnect(); }); observer1.observe($('#domaininput_view')[0], { childList: true }); $('#domain').val(domains.join('\n')); $('#btnSearch a')[0].click(); } else { dom = generateDoneDom(index); clearCache(); } var container = $("<div style='position: fixed; bottom: 0; left:0; right: 0; padding: 8px; background: #fff;'></div>"); container.append(dom); $("body").append(container); $("body").css({ marginBottom: `${container.clientHeight}px` }) } function submitHandler(dns) { const observer2 = new MutationObserver(async () => { // 判断当前数据和实际数据是否匹配 if (!dataIsEuqalUserData()) { console.error('数据不匹配'); observer2.disconnect(); submitHandler(dns); $('#btnSearch a')[0].click(); return } console.log('数据匹配成功'); $('#paradigm_all')[0].click(); $('#name_s_tab02 label')[0].click(); await nextTick(); $('#txtDomain1').val(dns[0]); $('#txtDomain2').val(dns[1]); $('#idSubmit')[0].click(); observer2.disconnect(); const observer3 = new MutationObserver(async () => { $('#myBtnCancel')[0].click(); observer3.disconnect(); }); observer3.observe($('#domainProtectModelForm')[0], { childList: true }); }); observer2.observe($('#domaininput_view')[0], { childList: true }); } async function confirmPageEntry() { console.log('进入ns_update/confirm'); await pollGetElement('[href="javascript:submitconfirmForm()"]', (dom) => dom.click()); } async function resultPageEntry() { console.log('进入ns_update/result'); const doneData = getDoneData(); sessionStorage.setItem(customStatusKey, JSON.stringify({ index: index + 1, data: doneData })); setLog('done', doneData); await pollGetElement('.btn_bg a', (dom) => dom.click()); } function nextTick() { return new Promise((resolve) => { setTimeout(() => { resolve() }) }) } function pollGetElement(selector, cb) { return new Promise((resolve) => { var timer = setInterval(() => { var dom = $(selector)[0] if (dom) { clearInterval(timer) cb(dom) resolve() } }, 1000) }) } if (!window.loadStatusDomain) { window.loadStatusDomain = () => { } } function generateStartDom() { // 创建动态生成的 HTML var dynamicHTML = `<input type="file" id="fileInput"> <button id="startButton">开始</button> <button id="endButton">出错了?清理缓存</button>`; // 创建一个 <div> 元素,并将动态 HTML 内容追加到其中 var divElement = document.createElement('div'); divElement.innerHTML = dynamicHTML; return divElement } function generateUploadingDom(i) { return `<div>正在上传第${i + 1}组</div>`; } function generateDoneDom(i) { return `<div>已完成,共操作${i}组数据</div>`; } function parseInputString(inputString) { var lines = inputString.split('\n').filter((line) => line.trim()); var result = []; var currentGroup = { domains: [], dns: [] }; lines.forEach(function (line) { var lineParts = line.trim().split(/\s+/); const [domain, ...dns] = lineParts if (dns.length) { currentGroup = { domains: [], dns, }; result.push(currentGroup); currentGroup.domains.push(domain); } else { if (currentGroup.domains.length === 100) { currentGroup = { domains: [], dns: currentGroup.dns, }; result.push(currentGroup); currentGroup.domains.push(domain); } else { currentGroup.domains.push(domain); } } }); return result; } function initFileHandler() { $('#startButton').click(function () { var fileInput = $('#fileInput')[0]; var file = fileInput.files[0]; // 获取上传的文件 var reader = new FileReader(); reader.onload = function (event) { var contents = event.target.result; // 获取文件内容 // 在这里对文件内容进行解析和处理 const data = parseInputString(contents); console.log(data); // 输出文件内容到控制台 sessionStorage.setItem(customDataKey, JSON.stringify({ data })); sessionStorage.setItem(customStatusKey, JSON.stringify({ index: index + 1, data: [], })); setLog('start', { raw_data: contents, parse_data: data }); window.location.reload(); }; reader.readAsText(file); // 以文本形式读取文件内容 }); $('#endButton').click(function () { clearCache(true); }); } function clearCache(manual) { sessionStorage.setItem(customDataKey, JSON.stringify({ data: [] })); sessionStorage.setItem(customStatusKey, JSON.stringify({ index: -1, data: [] })); if (manual) { setLog('error'); } } function dataIsEuqalUserData() { const actualData = Array.from($('#domaininput_view table tr').slice(1)).map((tr) => tr.querySelector('td + td').textContent); const userData = data[index].domains; const lengthEqual = actualData.length === userData.length; const firstDomainIn = userData.includes(actualData[0]); const lastDomainIn = userData.includes(actualData[actualData.length - 1]); console.log('lengthEqual', actualData.length, userData.length); console.log('firstDomainIn', firstDomainIn); console.log('lastDomainIn', lastDomainIn); return lengthEqual && firstDomainIn && lastDomainIn; } function getDoneData() { const { data = [] } = JSON.parse(sessionStorage.getItem(customStatusKey)); const indexData = Array.from($('#main table tr').slice(1)).map((tr) => Array.from(tr.querySelectorAll('td')).map((td) => td.textContent)); data[index] = indexData; return data; } function setLog(stage, data) { const { logs } = JSON.parse(localStorage.getItem(customLogKey) || JSON.stringify({ logs: [] })); if (stage === 'start') { const { raw_data, parse_data } = data logs.push({ date: currentDatetime, user: $('#header .name')[0].textContent, raw_data, parse_data, result_data: [] }); } else if (stage === 'done') { const currentLog = logs[logs.length - 1]; currentLog.result_data = data; } else if (stage === 'error') { const currentLog = logs[logs.length - 1]; currentLog.error = '用户清理了缓存'; } logs.splice(100) localStorage.setItem(customLogKey, JSON.stringify({ logs })); }