Greasy Fork

Greasy Fork is available in English.

Discuz论坛自动登录

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

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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);
    });
  }
})();