欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JS实现b站动态抽奖“公平”方案——动态+转发

程序员文章站 2022-07-12 12:51:36
...

视频演示+讲解

b站“动态抽奖” 较公平方案 讲解

传送门

前期

因为非官方途径无法获取全部的转发人员信息,但评论的人员信息可以全部获取(暂时看来一百多页加载都没有问题)
参考链接:JS实现b站动态转发抽奖(小人数)新方案讲解
JS实现b站动态评论区抽奖(含去重)

公平抽奖实现方案讲解

因为评论获取数是全的,那么只需要转发+评论双管齐下,就可以通过在评论区抽奖,再对中奖用户的动态继续检索,中奖者会有评论时间,当天查看他的动态是否有转发抽奖动态,从而判断其资格。

抽奖代码

打开“动态”,保持评论第一页,鼠标右键打开“检查”,来到“console”,贴入代码运行即可。
代码如下:

console.log("程序开始运行");
console.log("定义集合存储数据");
let name_set = new Set();
let id_set = new Set();
console.log("开始载入数据");
var page = 1;
var my_loop;

// 抽奖函数
function draw()
{
    // 循环次数
	for(var i=0; i<document.getElementsByClassName("con").length; i++)
	{
		var name = document.getElementsByClassName("con")[i].getElementsByClassName("user")[0].getElementsByTagName("a")[0].innerText;
		console.log(name+",加入集合");
		name_set.add(name);
		var id = document.getElementsByClassName("con")[i].getElementsByClassName("user")[0].getElementsByTagName("a")[0].getAttributeNode("data-usercard-mid").value;
		id_set.add(id);
	}
	console.log("第"+page+"页数据存入Set完毕");
	if(null != document.getElementsByClassName("next")[0])
	{
		page++;
		console.log("自动翻页...");
		document.getElementsByClassName("next")[0].click();
		//return true;
	}
	else
	{
		console.log("全部数据加载完毕");
		console.log("总共"+name_set.size+"名用户");
		// 生成随机数,直接打印中奖者信息
		var lucky_num = parseInt(Math.random()*(name_set.size),10);
		console.log("中奖用户ID为:"+Array.from(id_set)[lucky_num]);
		console.log("中奖用户名为:"+Array.from(name_set)[lucky_num]);
		console.log("中奖者大概位于 第" +parseInt(lucky_num/20+1)+ "页");
		clearInterval(my_loop);
		// 这就是注释
		//return false;
	}
}

// 定时调用函数
my_loop = setInterval(draw, 1500);

JS实现b站动态抽奖“公平”方案——动态+转发

相关问题

最后一行my_loop = setInterval(draw, 1500);,这里的1500代表毫秒数,你可以修改这个数字来实现延长自动翻页时间差,因为翻页加载数据会受网络影响,网速慢的话,数据加载慢,可能会丢失数据,所以可以相对的延长翻页时间。
如果打印的内容不需要,可以注释掉相关 console.log代码,注释就是在这个代码前加 //,这2个反斜杠就是注释。注释后就不会打印了。