🏠 Home 

微博抽奖小助手(非官方)

打开微博帖子页面,按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 URL
var 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;
}
// GUI
var 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 information
function get_post() {
var requestOptions = {
method: 'GET',
redirect: 'follow'
};
return fetch(`https://weibo.com/ajax/statuses/show?id=${document.post_id}`, requestOptions);
}
// Load re-post page
function 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.usr
function 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 shuffle
function 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 winner
function check_award() {
// Const for text
const cutoff_prompt = "请输入抽奖截止时间:";
const count_prompt = "请输入中奖人个数:";
// Get cut off date
var cutoff_date = new Date(prompt(cutoff_prompt, "" + Date()));
while (cutoff_date instanceof Date && isNaN(cutoff_date)) { // Is invalid date
cutoff_date = new Date(prompt(cutoff_prompt, "" + Date()));
}
// Construct array for uid list
var uid_list = Object.keys(document.usr);
shuffleArray(uid_list);
// Get count of awards
var count = Number(prompt(count_prompt, "1"));
while (!Number.isInteger(count) || count <= 0) { // Is invalid count
count = Number(prompt(count_prompt, "1"));
}
// Generate R###lts
var 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 listener
function keydownHandler(e) {
// [S]huffle users
if (e.keyCode == 83 && document.ready_shuffle) {
check_award();
}
// [L]oad user list
if (e.keyCode == 76) {
load_users();
}
// [P]rint users into console
if (e.keyCode == 80 && document.ready_shuffle) {
window.alert("中奖人名单已打印至控制台,请按F12点击控制台查看");
console.log(document.usr);
}
}
// register your handler method for the keydown event
if (document.addEventListener) {
document.addEventListener('keydown', keydownHandler, false);
} else if (document.attachEvent) {
document.attachEvent('onkeydown', keydownHandler);
}
// Load GUI handler
button_element.addEventListener('click', (event) => {
if (document.ready_shuffle) {
check_award();
} else {
load_users();
}
});
}, 1000);
})();