您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Choses a list of winners by certain criteria
当前为
// ==UserScript== // @name RedditRaffle // @namespace redditraffle // @description Choses a list of winners by certain criteria // @include http://www.reddit.com/r/*/comments/* // @include https://www.reddit.com/r/*/comments/* // @version 1.6 // @grant none // ==/UserScript== var link, url, winner_count, author_exclude, keyword_included, keyword_excluded, karma_link, karma_comment, age = 0., total_comments, comments = [], more = [], more_lock = false, parse_lock = false, names = [], chosen = [], userinfo, query_timeout, connection_count = 0, url_base = new URL(window.location.href).origin; function render_results() { progress.innerHTML = "Rendering:"; var html = []; html.push("<!doctype html><meta charset=\"utf-8\" /><title>Raffle results</title>" + "<style>table{overflow:hidden;border:1px solid #d3d3d3;background:#fefefe;" + "width:70%;margin:5% auto 0;-moz-border-radius:5px;-webkit-border-radius:5px;" + "border-radius:5px;-moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2);" + "-webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.2);}th,td{text-align:center;}" + "th{padding:14px 22px;text-shadow: 1px 1px 1px #fff;background:#e8eaeb;}" + "td{border-top:1px solid #e0e0e0;border-right:1px solid #e0e0e0;}" + "tr:nth-child(odd) td{background:#f6f6f6;}td:last-child{border-right:none;" + "text-align:left;padding:8px 18px;}</style><table><tr><th>No.</th><th>User</th>" + "<th>Comment</th></tr>"); var winner_length = Math.min(winner_count, chosen.length); for(var i = 0; i < winner_length; i++) { html.push("<tr><td>" + (i + 1) + ".</td><td><a href=\"" + url_base + "/user/" + chosen[i].author + "\">" + chosen[i].author + "</a></td><td>"); html.push(chosen[i].body_html.replace(/</g,'<').replace(/>/g,'>').replace(/&/g,'&')); html.push("<br /><a href=\"" + url + chosen[i].id + "\">Show</a></td><tr>"); } html.push("</table>"); progress.innerHTML = "<a href=\"" + URL.createObjectURL(new Blob(html, {type : 'text/html'})) + "\" target=\"_new\">Show results</a>"; } function query_users() { if(more_lock || parse_lock) return; query_interval = window.setInterval(function() { if(chosen.length >= winner_count || !comments.length) { window.clearInterval(query_interval); render_results(); return; } if(connection_count > 10) return; var comment = comments.splice(Math.floor(Math.random() * comments.length), 1)[0]; if(comment === undefined || comment.body.toLowerCase().indexOf(keyword_included) < 0 || (keyword_excluded && !(comment.body.toLowerCase().indexOf(keyword_excluded) < 0)) || (author_exclude && comment.author === author_exclude) || !(names.indexOf(comment.author) < 0)) return; if(age || karma_link || karma_comment) { var request = new XMLHttpRequest(); request.onreadystatechange = function() { if (this.readyState == 4) { if(this.status == 200) { connection_count--; userinfo = JSON.parse(this.responseText).data; if((!age || userinfo.created_utc <= age) && userinfo.link_karma >= karma_link && userinfo.comment_karma >= karma_comment && chosen.length < winner_count && names.indexOf(userinfo.name) < 0) { names.push(userinfo.name); chosen.push(comment); progress.innerHTML = "Querying Users: " + chosen.length + "/" + winner_count; } } else { connection_count--; console.log("Server returned status " + this.status); } } }; request.open('GET', url_base + '/user/' + comment.author + '/about.json', true); request.send(); connection_count++; } else { names.push(comment.author); chosen.push(comment); progress.innerHTML = "Querying Users: " + chosen.length + "/" + winner_count; } }, 100); } function add_comment(comment) { comments.push(comment); if(comment.replies && comment.replies.kind === "Listing") parse_listing(comment.replies.data.children); } function add_more(children) { more.push.apply(more, children); if(!more_lock) parse_more(); } function parse_more() { if(!more.length) { more_lock = false; query_users(); return; } more_lock = true; var children = more.splice(0, 20); var request = new XMLHttpRequest(); request.onreadystatechange = function() { if (this.readyState == 4) { if(this.status == 200) { parse_listing(JSON.parse(this.responseText).json.data.things); progress.innerHTML = "Parsing Comments: " + comments.length + "/" + total_comments; parse_more(); } else { more.push.apply(more, children); console.log("Server returned status " + this.status); parse_more(); } } }; request.open('GET', url_base + '/api/morechildren.json?link_id=' + link + '&api_type=json&children=' + children.join(), true); request.send(); } function parse_listing(listing) { var listingLength = listing.length; for(var child = 0; child < listingLength; child++) { if (listing[child].kind === 't1') add_comment(listing[child].data); else if (listing[child].kind === 't3') { link = listing[child].data.name; author_exclude = form.elements.author_exclude.checked ? listing[child].data.author : ""; total_comments = listing[child].data.num_comments; progress.innerHTML = "Parsing Comments: 0/" + total_comments; } else if (listing[child].kind === 'more') add_more(listing[child].data.children); } } function do_raffle() { progress.innerHTML = "Parsing Comments:"; winner_count = parseInt(form.elements.winner_count.value) || 20; keyword_included = form.elements.keyword_included.value.toLowerCase(); keyword_excluded = form.elements.keyword_excluded.value.toLowerCase(); karma_link = parseInt(form.elements.karma_link.value) || 0; karma_comment = parseInt(form.elements.karma_comment.value) || 0; if(form.elements.age.value) { var date = new Date(), number = parseInt(form.elements.age.value) || 0; switch(form.elements.age_type.value) { case "y": date.setFullYear(date.getFullYear() - number); break; case "d": date.setDate(date.getDate() - number); break; default: date.setMonth(date.getMonth() - number); } age = date.getTime()/1000; } url = window.location.href; if(!(url.indexOf("?") < 0)) { url = url.substring(0, url.indexOf("?")); } parse_lock = true; var request = new XMLHttpRequest(); request.onreadystatechange = function() { if (this.readyState == 4) { if(this.status == 200) { var things = JSON.parse(this.responseText), thingsLength = things.length; for(var thing = 0; thing < thingsLength; thing++) if (things[thing].kind === 'Listing') parse_listing(things[thing].data.children); parse_lock = false; query_users(); } else { console.log("Server returned status " + this.status); } } }; request.open('GET', url + '.json?limit=500', true); request.send(); } var style = document.createElement('style'); style.type = 'text/css'; document.head.appendChild(style); style.sheet.insertRule("#raffle_form input[type=text]{\ width:265px;\ border:1px solid #DBDADA;\ border-radius:2px;\ font-size:14px;\ font-style:italic;\ padding:4px\ }", 0); var spacer = document.createElement("div"); spacer.classList.add("spacer"); spacer.innerHTML = "<div class=\"sidecontentbox \">\ <div class=\"title\"><h1>Raffle</h1></div>\ <form id=\"raffle_form\">\ <ul class=\"content\">\ <li><input type=\"text\" placeholder=\"Number of Winners\" name=\"winner_count\" /></li>\ <li><input type=\"text\" placeholder=\"Comments containing\" name=\"keyword_included\" /></li>\ <li><input type=\"text\" placeholder=\"Comments not containing\" name=\"keyword_excluded\" /></li>\ <li><input type=\"text\" placeholder=\"Required Link Karma\" name=\"karma_link\" /></li>\ <li><input type=\"text\" placeholder=\"Required Comment Karma\" name=\"karma_comment\" /></li>\ <li>\ <input type=\"text\" placeholder=\"Age\" name=\"age\" style=\"width: 190px;\"></input>\ <select name=\"age_type\">\ <option value=\"d\">days</option>\ <option value=\"m\" selected=\"selected\">month</option>\ <option value=\"y\">years</option>\ </select>\ </li>\ <li>\ <button class=\"save\" type=\"button\">Raffle</button>\ <input type=\"checkbox\" name=\"author_exclude\" id=\"author_exclude\" checked=\"checked\"/>\ <label for=\"author_exclude\">Exclude Author</label>\ </li>\ <li><span id=\"raffle_progress\"></span></li>\ </ul>\ </form>\ </div>"; var form = spacer.querySelector("form#raffle_form"), progress = spacer.querySelector("span#raffle_progress"); document.querySelector("div.side").appendChild(spacer); form.querySelector("button").addEventListener("click", do_raffle, true);
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址