Greasy Fork is available in English.
打开微博帖子页面,按L载入转发用户,按S抽奖。
// ==UserScript==// @name 微博抽奖小助手(非官方)// @namespace http://tampermonkey.net/// @version 1.6// @description 打开微博帖子页面,按L载入转发用户,按S抽奖。// @author Kasei// @match https://weibo.com/*/*// @icon https://www.google.com/s2/favicons?sz=64&domain=weibo.com// @grant none// @license MIT// ==/UserScript==(function() {'use strict';setTimeout(function() {// Get infromation based on URLvar url_component = document.URL.split(/[#,/?]/g);document.uid = url_component[3];document.post_id = url_component[4];if (!/^[0-9]+$/.test(document.uid) || !/^[A-Za-z0-9]+$/.test(document.post_id)) {console.log("Not a post page");return;}// GUIvar button_container = document.querySelector("footer>div.woo-box-flex.woo-box-alignCenter");var button_element = button_container.children[0].cloneNode(true);button_container.appendChild(button_element);var button_text = button_element.querySelector(".woo-box-alignCenter>span");button_text.innerHTML = ' 抽奖 ';// button_element.querySelector(".woo-pop-ctrl").setAttribute("id", "shuffle");// Load post informationfunction get_post() {var requestOptions = {method: 'GET',redirect: 'follow'};return fetch(`https://weibo.com/ajax/statuses/show?id=${document.post_id}`, requestOptions);}// Load re-post pagefunction get_next_page() {var requestOptions = {method: 'GET',redirect: 'follow'};if (document.arg_data.page == 1 || document.arg_data.page <= document.arg_data.max_page) {console.log(`Loading Page ${document.arg_data.page}`);if (button_text) {var percentage = document.arg_data.page / document.arg_data.max_page * 100;button_text.innerHTML = `${percentage > 0?percentage.toFixed(2):0}%`;}return fetch(`https://weibo.com/ajax/statuses/repostTimeline?id=${document.arg_data.id}&page=${document.arg_data.page}&moduleID=feed&count=${document.arg_data.page==1?10:20}`, requestOptions).then((response) => {return response.json();}).then((repost_data) => {repost_data.data.forEach((dat) => {document.arg_data.users[dat.user.id] = {"name": dat.user.screen_name,"time": new Date(dat.created_at)}})document.arg_data.page = document.arg_data.page + 1;document.arg_data.max_page = repost_data.max_page;}).then(get_next_page);} else {return document.arg_data.users;}}// Load users into document.usrfunction load_users() {if (document.arg_data != undefined) {window.alert("正在载入转发人,请等待读条完毕");return;}window.alert("载入转发人,请稍后");return get_post().then((response) => {return response.json();}).then((post_data) => {document.arg_data = {"id": post_data.id,"reposts_count": post_data.reposts_count,"page": 1,"max_page": -1,"users": {}};}).then(get_next_page).then((usr) => {document.ready_shuffle = true;document.usr = usr;document.arg_data = undefined;}).catch((error) => {document.arg_data = undefined;window.alert("载入错误,请重试。");console.error('Error:', error);}).then(() => {var uid_list = Object.keys(document.usr);window.alert(`载入转发列表成功:总计${Object.keys(uid_list).length}个抽选者`);button_text.innerHTML = ' 开抽 ';});}// Durstenfeld shufflefunction shuffleArray(array) {for (let i = array.length - 1; i > 0; i--) {const j = Math.floor(Math.random() * (i + 1));[array[i], array[j]] = [array[j], array[i]];}}// Shuffle for award winnerfunction check_award() {// Const for textconst cutoff_prompt = "请输入抽奖截止时间:";const count_prompt = "请输入中奖人个数:";// Get cut off datevar cutoff_date = new Date(prompt(cutoff_prompt, "" + Date()));while (cutoff_date instanceof Date && isNaN(cutoff_date)) { // Is invalid datecutoff_date = new Date(prompt(cutoff_prompt, "" + Date()));}// Construct array for uid listvar uid_list = Object.keys(document.usr);shuffleArray(uid_list);// Get count of awardsvar count = Number(prompt(count_prompt, "1"));while (!Number.isInteger(count) || count <= 0) { // Is invalid countcount = Number(prompt(count_prompt, "1"));}// Generate R###ltsvar got = 0;for (var i=0; i<uid_list.length && got < count; ++i) {if (document.usr[uid_list[i]].time < cutoff_date) {var usr = document.usr[uid_list[i]];window.alert(`中奖人${got+1}/${count}:` +`\n 微博ID:${uid_list[i]}` +`\n 微博名称:${usr.name}` +`\n 发博时间:${usr.time}` +`\n ${Date()}`);got++;}}}// Add key listenerfunction keydownHandler(e) {// [S]huffle usersif (e.keyCode == 83 && document.ready_shuffle) {check_award();}// [L]oad user listif (e.keyCode == 76) {load_users();}// [P]rint users into consoleif (e.keyCode == 80 && document.ready_shuffle) {window.alert("中奖人名单已打印至控制台,请按F12点击控制台查看");console.log(document.usr);}}// register your handler method for the keydown eventif (document.addEventListener) {document.addEventListener('keydown', keydownHandler, false);} else if (document.attachEvent) {document.attachEvent('onkeydown', keydownHandler);}// Load GUI handlerbutton_element.addEventListener('click', (event) => {if (document.ready_shuffle) {check_award();} else {load_users();}});}, 1000);})();