Discuz论坛自动登录

支持一些基于 Discuz! 的论坛自登录,根据网页元素特征匹配单个论坛,需要一定的开发能力

// ==UserScript==
// @name         Discuz论坛自动登录
// @namespace    http://tampermonkey.net/
// @version      0.0.2
// @description  支持一些基于 Discuz! 的论坛自登录,根据网页元素特征匹配单个论坛,需要一定的开发能力
// @author       wzj042
// @match        *://*/*
// @icon         data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBwgHBgkIBwgKCgkLDRYPDQwMDRsUFRAWIB0iIiAdHx8kKDQsJCYxJx8fLT0tMTU3Ojo6Iys/RD84QzQ5OjcBCgoKDQwNGg8PGjclHyU3Nzc3Nzc3Nzc3Nzc3NTc1Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzcxNzc1Nzc3Nzg3Nzc3N//AABEIABwAHAMBEQACEQEDEQH/xAAaAAACAgMAAAAAAAAAAAAAAAAEBQEGAAIH/8QAKhAAAgEDAQYFBQAAAAAAAAAAAQIDAAQRUQUSITFBYRMiMpGhQnGxwdH/xAAaAQACAwEBAAAAAAAAAAAAAAAEBQABAwYH/8QAJREAAQMCBQQDAAAAAAAAAAAAAQACAwQRBRIhMfBBUWHRE4Gh/9oADAMBAAIRAxEAPwDs9/di1RQqhpH9IPLuT8UFW1jaZo0uTsFrFF8h8BK5bydfNJeMjHiFRV/n5pFPiMsesktj2AHo/qLbC07NW1htktOsNwd4McB8YIPfHCt8Pxv5XiOTr125zRVNSWbmanldGgEp20jK0c4HkAKsdNP38UjxmJ9mygaDdGUrhYtSKRjvEv6uua4aQvc8l+6ZAC2iizge6u0SPXj2HU0ywumfNMA1VK8RsJKulehpEsIyMHlUUSe+2Iszlrd1jB+jHAfbSkVbgkc787DbwjYqwsFnC6Et/A2LcN4haWTGDujAXOPc8tKDidTYTNkdcuPbp7PO61fnqW6aBWJGDorKchhkGuoaQ4XCXEWNipq1SyoohbmwtbmQSTwhmHXJHvrQk9FTzvD5G3I59rVk0jBZpRQ4DAotZL//2Q==
// @grant        none
// @license     MIT
// ==/UserScript==

(function () {
  "use strict";
  // 等待网页加载
  const config = {
    username: "",
    password: "",
    auto_login: true,
    weight_limit: 2,
    // 如果存在发布页
    requirement_enable: false,
    // 发布页域名特征
    requirement_domain: [""],
    sample: [ "地址发布器下载", "发现以下行为将会被扣分处理"]
  };
  window.onload = function () {
    // 匹配域名
    // 此处可根据特定论坛的发布页自定义
    if (config.requirement_enable) {
      var domain = window.location.hostname;
      var is_discuz = config.requirement_domain.some((item) => {
        return domain.includes(item);
      });
      if (is_discuz) {
        const link = queryElement(".link");
        link.then((element) => {
          if (element.innerText.includes("最新地址")) {
            element.click();
          }
        });
        return;
      }
    }
    // 如果配置为空,提示用户在配置页面填写
    const data = config;
    if (!data.username || !data.password) {
      console.log("请在脚本源码页面填写用户名和密码");
      return;
    }

    // 匹配元素
    // 设置校验权重,通过大部分视为discuz子论坛
    var weight = 0;
    // 通过链接文本匹配,也可以自行拓展
    var links = document.getElementsByTagName("a");
    for (var i = 0; i < links.length; i++) {
      const { title, innerText } = links[i];

      config.sample.forEach((text) => {
        if (innerText.includes(text) || title.includes(text)) {
          weight += 1;
        }
      });
    }

    if (weight < config.weight_limit) {
      return;
    }

    // 假设未登录,查询表单
    const element = queryElement("#lsform");
    element.then((element) => {
      const username = element.querySelector('input[name="username"]');
      const password = element.querySelector('input[name="password"]');
      const auto_login = element.querySelector('input[name="cookietime"]');
      const submit = element.querySelector("button");
      if (!username || !password || !auto_login || !submit) {
        console.log("element not found");
        return;
      }
      // 填写表单
      username.value = data.username;
      password.value = data.password;
      auto_login.checked = data.auto_login;
      console.log("submit:", submit);

      // 提交表
      submit.click();
    });
  };
  // 异步查询确保元素加载
  async function queryElement(selector) {
    return new Promise((resolve, reject) => {
      const interval = setInterval(() => {
        const element = document.querySelector(selector);
        if (element) {
          clearInterval(interval);
          resolve(element);
        }
      }, 1000);
    });
  }
})();