Greasy Fork is available in English.

Discuz自动回复

Discuz自动回复按钮,可自选回复语句。修改自https://greasyfork.org/scripts/4635

// ==UserScript==
// @name         Discuz自动回复
// @namespace    http://tampermonkey.net/
// @version      2.23
// @description  Discuz自动回复按钮,可自选回复语句。修改自https://greasyfork.org/scripts/4635
// @author       backrock12
// @license      GPL License
// @include      http://*forum.php?*
// @include      http://*thread*.html
// @include      https://*forum.php?*
// @include      https://*thread*.html
// @include      *thread*.html
// @include      *forum.php?*
// @require      https://greasyfork.org/scripts/421868-gbk-js/code/GBKjs.js?version=901431
// ==/UserScript==

(function () {
  "use strict";

  /* 自定义参数 */
  const selectnum = 5; //下拉数量
  const istitle = false; //是否显示标题  true/false
  //回复语
  /* 例子
                   {
                    key: "www.baidu.com",   //匹配的网址,可以填写正则表达式
                    value: [
                      "baidu 1",  //对应回复语
                      "baidu 2",
                      "baidu 3",
                      "baidu 4",
                      "baidu 5",
                    ]
                  } */

  const messages = [
    {
      //默认回复,请勿去掉
      key: "default",
      value: [
        "十分感谢分享",
        "楼主是个好人",
        "楼主一生平安",
        "感谢楼主分享,顶贴支持",
        "好东西啊,谢谢楼主分享",
        "收藏了。谢谢楼主分享",
        "大佬辛苦了",
        "感谢楼主分享的内容!",
        "感谢分享!给你点赞!",
        "感谢分享!论坛因你更精彩!",
        "看看隐藏内容是什么!谢谢!",
        "先下载看看好不好用!",
        "楼主一生平安!好人一生平安!",
        "你说的观点我也很支持!",
        "楼主太棒了!我先下为敬!",
        "给楼主点赞,希望继续分享!",
        "感谢论坛,感谢LZ热心分享!",
        "感谢楼主分享优质内容,希望继续努力!",
        "下载试用一下,如果用着不错就给楼主顶贴!",
        "这么好的东西!感谢楼主分享!感谢论坛!",
        "希望楼主继续分享更多好用的东西!谢谢!",
        "看到楼主这么努力分享,我只能顶个贴感谢一下了!",
        "好东西,拿走了,临走顶个贴感谢一下楼主!",
        "这就非常给力了!感谢分享!",
        "厉害了!先收藏,再回复!谢谢!",
        "感谢大佬分享6!",
      ],
    },
    /*     {
                          key: "www.baidu.com",
                          value: [
                            "baidu 1",
                            "baidu 2",
                            "baidu 3",
                            "baidu 4",
                            "baidu 5",
                          ]
                        }, */
  ];

  /* 系統參數 */
  let isready = true;
  const keyword = "回复可见|隐藏";
  let GBK = null;
  let curmessage;
  var run_mk = true;
  var cssnum = 0;
  /* ---------- */

  initialize();

  /* ---------- */

  function autoReply(re_message, obj) {
    if (!isready) return;
    isready = false;
      console.log("autoReply");
    let default_message;

    let htitle = document.querySelector(".ts");
    if (htitle) {
      htitle = htitle.innerText;
    } else {
      htitle = document.querySelector(".thread_subject");
      if (htitle) htitle = htitle.innerText;
    }

    if (!htitle) htitle = document.title;

    default_message = re_message
      ? re_message
      : curmessage[Math.floor(Math.random() * curmessage.length)];

    let fastpost_textarea = document.querySelectorAll("#fastpostmessage");
    let fastpost_submit = document.querySelectorAll("#fastpostsubmit");
    let fastpost_verify = document.querySelectorAll(
      'input[name="seccodeverify"]'
    );

    let message = istitle ? default_message + "\r\n" + htitle : default_message;

    if (fastpost_textarea.length == 0 || fastpost_submit.length == 0) {
      //   alert("未找到快速回复表格!");
      console.log("未找到快速回复表格!");
      autoReplynoapi(message, obj);
      isready = true;
      return;
    }

    fastpost_textarea[0].innerHTML = message;

    // console.log(message);

    //xhr不需要,不过输入验证码的情况填上也是方便点的
    if (fastpost_verify.length > 0) {
      alert("需要输入验证码!");

      let h = document.body.scrollHeight;
      window.scroll(0, h);
      fastpost_verify[0].focus();
      isready = true;
      return;
    }

    //xhr发帖
    let form = document.querySelectorAll("#fastpostform")[0];
    let url = form.action;
    let hidden = form.querySelectorAll('input[type="hidden"]');
    let data = "";
    for (let i = 0; i < hidden.length; i++) {
      data += hidden[i].name + "=" + hidden[i].value + "&";
    }

    let charset =
      typeof wrappedJSObject == "object"
        ? wrappedJSObject.document.characterSet
        : document.characterSet;

    let mmessage;
    if (charset.toLowerCase() == "gbk") {
      if (!GBK) GBK = GBKfunction();
      mmessage = GBK.URI.encodeURI(message);
    } else {
      mmessage = encodeURIComponent(message);
    }

    let mdata = "message=" + mmessage + "&replysubmit=replysubmit&" + data;
    let xhr = new XMLHttpRequest();
    xhr.open("POST", url, true);
    xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded");
    xhr.onreadystatechange = function (oEvent) {
      if (xhr.readyState === 4) {
        if (xhr.status === 200) {
          //console.log("OK", xhr);
          location.reload();
        } else {
          console.log("Error", xhr.statusText);
        }
      }
    };
    xhr.send(mdata);
    //xhr over
    isready = true;
  }

  function autoReplynoapi(re_message, obj) {
    // console.log(obj);
    if (!obj) return;
    if (obj.className != "locked") return;
    //const hf = $(obj).find("a:contains('回复')");
    //  const hf = obj.querySelector("a:contains('回复')");
    const hf = [...obj.querySelectorAll("div")].filter((div) =>
      div.innerHTML.includes("回复")
    );

    if (hf.length > 0) {
      hf[0].click();
      waitElement("#postmessage", 10, 150)
        .then(function () {
          // $("#postmessage").val(re_message);
          // $("#postsubmit").click();

          document.querySelector("#postmessage").value = re_message;
          document.querySelector("#postsubmit").click();
        })
        .catch(function () {
          console.log("waitElement error");
        });
    } else {
      // const fhf = $("#fastpostmessage");
      const fhf = document.querySelector("#fastpostmessage");

      if (fhf) {
        //fhf.val(re_message);
        fhf.value = re_message;

        // $("#fastpostsubmit").click();
        const c = document.querySelector("#fastpostsubmit");
        c.click();
      }
    }

    isready = true;
    return;
  }

  function initialize() {
    const list = document.querySelectorAll("div.locked");
    if (list.length > 0) {
      if (!addcss()) return;
      if (!run_mk) return;
      let ulstring = "";

      if (messages.length == 1) {
        curmessage = messages[0].value;
      } else {
        for (let m = 0; m < messages.length; m++) {
          const e = messages[m];
          if (e.key == "default") {
            curmessage = e.value;
          }
          let reg;
          if (Object.prototype.toString.call(e.key) == "[object RegExp]") {
            reg = e.key;
          } else {
            reg = new RegExp(e.key);
          }
          if (reg.test(location.href)) {
            curmessage = e.value;
            break;
          }
        }
      }

      const num = selectnum > curmessage.length ? curmessage.length : selectnum;
      for (let i = 0; i < num; i++) {
        ulstring += `<li><a href="javascript:;">${curmessage[i]}</a></li>`;
      }

      if (!run_mk) return;

      if (ulstring) {
        for (const n of list) {
          if (
            n.innerHTML.search(new RegExp(keyword)) != -1 &&
            n.innerHTML.search(new RegExp('title="内容购买"'))
          ) {
            let bt = document.createElement("div");
            bt.className = "DiscuzautoReplyele";
            bt.innerHTML = `
                      <div class="DiscuzautoReply">
                      <button class="DiscuzautoReplybutton" >自动回复</button>
                    <div class="DiscuzautoReplyDiv">
                    <button class="DiscuzautoReplyhead">»</button>
                    <div class="DiscuzautoReplyDownbtn">
                      <ul>
                        ${ulstring}
                      </ul>
                    </div>
                  </div>
                  </div>
                    `;
            run_mk = false;
            n.appendChild(bt);
          }
        }

        const allbutton = document.querySelectorAll(".DiscuzautoReplybutton");
        for (let b of allbutton) {
          b.onclick = function () {
            autoReply(null, this.parentElement.parentElement.parentElement);
          };
        }

        const alla = document.querySelectorAll(
          ".DiscuzautoReplyDownbtn ul li a"
        );
        for (let b of alla) {
          b.onclick = function () {
            autoReply(
              this.innerHTML,
              this.parentElement.parentElement.parentElement
            );
          };
        }
      }
    }
  }

  function addcss() {
    const cssText = [
      `
                      .DiscuzautoReplybutton {
                      color: rgb(102, 102, 102);
                      background-color: rgb(238, 238, 238);
                      border: medium none;
                      font-weight: 300;
                      font-size: 15px;
                      text-decoration: none;
                      text-align: center;
                      line-height: 20px;
                      height: 20px;
                      padding-left: 15px;
                      padding-right: 0px;
                      margin: 0px 0px 0px 5px;
                      display: inline-block;
                      -moz-appearance: none;
                      cursor: pointer;
                      box-sizing: border-box;
                      transition-property: all;
                      transition-duration: 0.3s;
                      border-radius: 4px;
                      }
                      `,
      `    .DiscuzautoReplyDiv{
                          display:inline-block;
                      }`,
      `    .DiscuzautoReplyDiv:hover .DiscuzautoReplyDownbtn{
                          display:block;
                           background-color: #f1f1f1;
                      }`,
      `    .DiscuzautoReplyDiv .DiscuzautoReplyDownbtn{
                          display:none;
                          background-color:#f9f9f9;
                          box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
                          min-width: 160px;
                          position:absolute;
                          z-index:9999;
                          margin: -2px 2px 2px -40px;
                          transition:all .5s .1s;
                          -moz-transition:all .5s .1s;
                          -ms-transition:all .5s .1s;
                          -o-transition:all .5s .1s;
                          -webkit-transition:all .5s .1s;
                      }`,
      `    .DiscuzautoReplyDiv .DiscuzautoReplyDownbtn li{
                          line-height:20px;
                          text-align:left;
                          padding-left:4px;
                          margin-left: 0px;
                          list-style: none;
                      }`,
      `
                      .DiscuzautoReplyDiv .DiscuzautoReplyDownbtn ul {
                      margin: 0px;
                      padding: 0px;
                      text-decoration: none;
                      list-style: none;
                      left:auto;
                      right:0;
                      }`,
      `    .DiscuzautoReplyDiv .DiscuzautoReplyDownbtn a:hover{
                          text-decoration:underline;
                          color:#f00;
                          transition:all .5s .1s;
                          -moz-transition:all .5s .1s;
                          -ms-transition:all .5s .1s;
                          -o-transition:all .5s .1s;
                          -webkit-transition:all .5s .1s;
                      }`,
      `    .DiscuzautoReplyDiv .DiscuzautoReplyDownbtn a{
                          display:block;
                          color:black;
                          width:100%;
                          font-size: 13px;
                      }`,
      `.DiscuzautoReplyhead {
                        color: rgb(102, 102, 102);
                        background-color: rgb(238, 238, 238);
                        border: medium none;
                        font-size: 15px;
                        text-decoration: none;
                        text-align: center;
                        line-height: 20px;
                        height: 20px;
                        margin-left: -5px;
                        padding-left: 20px;
                      }`,
    ];

    function createStyleSheet() {
      var head = document.head || document.getElementsByTagName("head")[0];
      var style = document.createElement("style");
      style.type = "text/css";
      head.appendChild(style);
      return style.sheet || style.styleSheet;
    }

    try {
      var sheet = createStyleSheet();

      for (const s of cssText) {
        // document.styleSheets[0].insertRule(s, 0);
        sheet.insertRule(s, 0);
      }
      return true;
    } catch (e) {
      console.log("addcss err");
      if (cssnum >= 5) {
        console.log("initialize初始化失敗");
        return false;
      }
      cssnum++;
      setTimeout(initialize, 1000);
      return false;
    }
  }

  function waitElement(selector, times, interval, flag = true) {
    var _times = times || -1, // 默认不限次数
      _interval = interval || 500, // 默认每次间隔500毫秒
      _selector = selector, //选择器
      _iIntervalID, //定时器id
      _flag = flag;
    return new Promise(function (resolve, reject) {
      _iIntervalID = setInterval(function () {
        if (!_times) {
          //是0就退出
          clearInterval(_iIntervalID);
          reject();
        }
        _times <= 0 || _times--; //如果是正数就 --
        //  var _self = $(_selector); //再次选择
        const _self = document.querySelectorAll(_selector);

        if ((_flag && _self.length) || (!_flag && !_self.length)) {
          //判断是否取到
          clearInterval(_iIntervalID);
          resolve(_self);
        }
      }, _interval);
    });
  }
})();