Greasy Fork is available in English.
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); }); } })();