您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
再也不用为某些用户每天无意义重复发文而苦恼了。
// ==UserScript== // @name SegmentFault Automatic Reviewing | 思否自动审核 // @namespace https://segmentfault.com/u/forkkillet // @version 0.1 // @description 再也不用为某些用户每天无意义重复发文而苦恼了。 // @author ForkKILLET // @match https://segmentfault.com/review/article_first // @grant GM_getValue // @grant GM_setValue // @grant unsafeWindow // ==/UserScript== Array.range = (start, end) => Array.from({ length: end - start + 1 }, (_, i) => i + start) const debug = true const log = m => console.log("[SFAR] " + m) const error = m => console.error("[SFAR] " + m) const $ = unsafeWindow.$ $(render) function render() { if ($(".audit__content > div").length === 2) return debug && log("nothing to review.") const $ui = $(` <style> .SFAR-ui * { outline: none !important; } .SFAR-ui .glyphicon { margin: 0 !important; } .SFAR-highlight { background-color: #bce8f1 !important; } .SFAR-config { display: block; width: 100%; min-height: 400px; } .SFAR-save { width: 54px; } .SFAR-result { display: none; margin: 0; } </style> <div class="SFAR-ui panel panel-default"> <div class="panel-heading"> <h5 class="mb0 mt0">[SFAR] 自动审核</h5> </div> <div class="panel-content"> <textarea class="SFAR-config"/> </div> <div class="panel-footer"> <button class="SFAR-save btn btn-default">保存</button> <button class="SFAR-execute btn btn-primary">执行</button> </div> <div class="SFAR-result alert alert-info"></div> </div> `) $(".audit-widget__reason").after($ui) const $config = $(".SFAR-config"), $save = $(".SFAR-save"), $execute = $(".SFAR-execute"), configDft = ` { "rules": [ { "title-equal": "人生苦短,开发用云-如何优雅完成程序员的侠客梦", "result": "reject", "why": "推广广告信息" }, { "title-equal": "天源迪科与阿里云发布联合解决方案,基于阿里云原生产品打造卓越的数字化采购平台", "result": "reject", "why": "推广广告信息" }, { "title-equal": "如何优化你的if-else?来试试“责任树模式”", "result": "reject", "why": "推广广告信息" } ], "auto": { "execute": true, "confirm": true, "next": false } } `.trim() let configNow = GM_getValue("config") configNow || GM_setValue("config", configNow = configDft) $config.val(configNow) $save.on("click", () => { GM_setValue("config", $config.val().trim()) $save.html(`<span class="glyphicon glyphicon-check text-green mr10"></span>`) setTimeout(() => $save.html("保存"), 1000) debug && log("saved.") }) $execute.on("click", execute) const config = JSON.parse(configNow) if (config.auto && config.auto.execute) execute(config) } function execute(config) { config = config || JSON.parse(GM_getValue("config")) if (! config || ! config.rules) return const $form = $(".panel-content--form"), $author = $(".panel-content--inner > .audit__content-author .media-body"), article = { title: $form.find("input.form-control[name=title]").val(), text: $form.find("textarea.form-control[name=text]").val(), author: $author.children("a").text() }, results = [ [ "反对", "reject" ], [ "同意", "pass", "accept" ], [ "中立", "ignore", "monkey" ] ], whys = [ "帖子式文章", "偏离社区主题", "内容及排版差", "推广广告信息", "违规内容", "不友善内容" ] debug && log(`\n# ${ article.title }\n${ article.text.slice(0, 42) }...`) let id = 0, r, y, finish = false for (let rule of config.rules) { [ "include", "match", "equal" ].forEach(how => { [ "title", "text" ].forEach(where => { const what = rule[where + "-" + how], content = article[where] if (! what) return if ( how === "include" && content.includes(what) || how === "match" && RegExp(what).test(content) || how === "equal" && what === content ) { r = rule.result if (typeof r === "string") results.forEach((group, index) => { if (group.includes(r)) r = index }) if (! Array.range(0, 3).includes(r)) return error(`result ${r} isn't in [0, 2].`) debug && log(`result code is ${r}.`) if (r === 0) { y = rule.why if (typeof y === "string") y = whys.indexOf(y) if (! Array.range(0, 6).includes(y)) return error(`why ${r} isn't in [0, 6].`) debug && log(`reason code is ${y}.`) finish = true } } }) }) id ++ if (finish) break } const auto = config.auto || {}, $alert = $(".SFAR-result").show().html(finish ? ` <p> 根据规则 ${id}#,态度为${ results[r][0] }${ r ? "" : `,原因为${ whys[y] }` } ${ auto.confirm ? `<a class="SFAR-result-ok">好</a> / <a class="SFAR-result-cancel">取消</a>` : "" } </p> ` : `无规则匹配。`) if (! finish) return const $result = $(".js__audit-btn--" + results[r][1]).addClass("SFAR-highlight"), $why = $($(".audit__reasons-item:not(.audit__reasons-item--sub)")[y]).addClass("SFAR-highlight") function act() { $why.click() $result.click() if (auto.next) $(".audit-widget__vote-btn-next--inner").click() } setTimeout(() => { $(".audit__reasons-item--sub").click() if (auto.confirm) { $(".SFAR-result-ok").on("click", act) $(".SFAR-result-cancel").on("click", () => $alert.hide()) } else act() }, 500) }