Greasy Fork is available in English.

批量修改dns

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 }));
}