Discuz自动回复

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

目前为 2021-07-26 提交的版本。查看 最新版本

// ==UserScript==
// @name         Discuz自动回复
// @namespace    http://tampermonkey.net/
// @version      2.21
// @description  Discuz自动回复按钮,可自选回复语句。修改自https://gf.qytechs.cn/scripts/4635
// @author       backrock12
// @license      GPL License
// @include      http://*forum.php?*
// @include      http://*thread*.html
// @include      https://*forum.php?*
// @include      https://*thread*.html
// @require      https://gf.qytechs.cn/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;

        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) {
                    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.length > 0) {
                fhf.val(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);
        });
    }
})();


QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址