欢迎光临散文网 会员登陆 & 注册

b站“视频评论区”抽奖 讲解(含JS源码)

2020-08-08 15:21 作者:Love丶伊卡洛斯  | 我要投稿

新前言

因为 b站升级原因,原来评论的页数也变成了无限下拉加载的形式。导致旧版程序无法使用。 新版本的程序简单重构了一下,可参考下面的 2.0版本 新代码,使用方法一样。

旧前言

如有 动态评论区 抽奖需要,可以参考:[JS实现b站动态抽奖“公平”方案——动态+转发]

因为转发抽奖只支持小人数,如果人少,可以使用:[JS实现b站动态转发抽奖(小人数)新方案讲解]  [B站动态转发抽奖脚本+教程]

视频讲解


正文

1.打开视频页面




2.鼠标右键打开“检查”工具 或 按F12


代码如下,复制粘贴进入“console”,然后回车

// 获取时间

function get_date() {

    var date = new Date();

    var h = date.getHours();

     var m = date.getMinutes();

     var s = date.getSeconds();

     h = h < 10 ? ('0' + h) : h;

     m = m < 10 ? ('0' + m) : m;

     s = s < 10 ? ('0' + s) : s;

    var currentDate = "[" + h + ":" + m + ":" + s + "] ";

    return currentDate;

}


// 从map获取下标为index的键

function get_map_key(map, index)

{

     var i = 0;

     for (var [key, value] of map) {

         if(i == index)

         {

              return key;

         }

         i++;

     }

}


// 从map获取下标为index的值

function get_map_value(map, index)

{

     var i = 0;

     for (var [key, value] of map) {

         if(i == index)

         {

              return value;

         }

          i++;

     }

}


// 遍历map

function get_map(map)

{

     for (var [key, value] of map) {

         console.log(key + " = " + value);

     }

}


console.log(get_date() + "程序开始运行");

console.log(get_date() + "定义图存储数据(自动去重)");

let name_map = new Map();

let id_map = new Map();

console.log(get_date() + "开始载入数据");

var page = 1;

var my_loop;


// 抽奖函数

function draw()

{

    // 循环次数

     for(var i=0; i<document.getElementsByClassName("list-item reply-wrap").length; i++)

     {

         var name = document.getElementsByClassName("list-item reply-wrap")[i].getElementsByClassName("con")[0].getElementsByClassName("user")[0].getElementsByTagName("a")[0].innerText;

         var id = document.getElementsByClassName("list-item reply-wrap")[i].getElementsByClassName("con")[0].getElementsByClassName("user")[0].getElementsByTagName("a")[0].getAttributeNode("data-usercard-mid").value;

         //console.log(name+",加入图");

         name_map.set(name, page);

         id_map.set(id, page);

     }

    console.log(get_date() + "第"+page+"页数据存入Map完毕");

     if(null != document.getElementsByClassName("next")[0])

     {

         page++;

         //console.log("自动翻页...");

         document.getElementsByClassName("next")[0].click();

         //return true;

     }

     else

     {

         console.log(get_date() + "全部数据加载完毕");

         console.log(get_date() + "总共" + name_map.size + "名用户");

         // 生成随机数,直接打印中奖者信息

         var lucky_num = parseInt(Math.random()*(name_map.size),10);

         console.log(" ");

         console.log("中奖用户ID为:" + get_map_key(id_map, lucky_num));

         console.log("中奖用户名为:" + get_map_key(name_map, lucky_num));

         console.log("中奖者位于页:" + get_map_value(name_map, lucky_num));

         console.log(" ");

         console.log("程序运行结束");

         clearInterval(my_loop);

         // 这就是注释

         //return false;

     }

}


// 定时调用函数

my_loop = setInterval(draw, 1500);

4.等待结果

ok 结束。

抽取多人版本

同理 控制台贴入代码,页数加载完后 然后输入 go() 回车即可


// 获取时间

function get_date() {

    var date = new Date();

     var h = date.getHours();

     var m = date.getMinutes();

     var s = date.getSeconds();

     h = h < 10 ? ('0' + h) : h;

     m = m < 10 ? ('0' + m) : m;

     s = s < 10 ? ('0' + s) : s;

    var currentDate = "[" + h + ":" + m + ":" + s + "] ";

    return currentDate;

}


// 从map获取下标为index的键

function get_map_key(map, index)

{

     var i = 0;

     for (var [key, value] of map) {

         if(i == index)

         {

              return key;

         }

         i++;

     }

}


// 从map获取下标为index的值

function get_map_value(map, index)

{

     var i = 0;

     for (var [key, value] of map) {

         if(i == index)

         {

              return value;

         }

         i++;

     }

}


// 遍历map

function get_map(map)

{

     for (var [key, value] of map) {

          console.log(key + " = " + value);

     }

}


console.log(get_date() + "程序开始运行");

console.log(get_date() + "定义图存储数据(自动去重)");

let name_map = new Map();

let id_map = new Map();

console.log(get_date() + "开始载入数据");

var page = 1;

var my_loop;


// 抽奖函数

function draw()

{

    // 循环次数

     for(var i=0; i<document.getElementsByClassName("list-item reply-wrap").length; i++)

     {

         var name = document.getElementsByClassName("list-item reply-wrap")[i].getElementsByClassName("con")[0].getElementsByClassName("user")[0].getElementsByTagName("a")[0].innerText;

         var id = document.getElementsByClassName("list-item reply-wrap")[i].getElementsByClassName("con")[0].getElementsByClassName("user")[0].getElementsByTagName("a")[0].getAttributeNode("data-usercard-mid").value;

         //console.log(name+",加入图");

         name_map.set(name, page);

         id_map.set(id, page);

     }

     console.log(get_date() + "第"+page+"页数据存入Map完毕");

     if(null != document.getElementsByClassName("next")[0])

     {

         page++;

         //console.log("自动翻页...");

         document.getElementsByClassName("next")[0].click();

         //return true;

     }

     else

     {

         console.log(get_date() + "全部数据加载完毕");

         console.log(get_date() + "总共" + name_map.size + "名用户");

         clearInterval(my_loop);

         // 这就是注释

         //return false;

     }

}


function go()

{

     var lucky_num = parseInt(Math.random()*(name_map.size),10);

    

     console.log(" ");

     console.log("中奖用户ID为:" + get_map_key(id_map, lucky_num));

     console.log("中奖用户名为:" + get_map_key(name_map, lucky_num));

     console.log("中奖者位于页:" + get_map_value(name_map, lucky_num));

     console.log(" ");

}


// 定时调用函数

my_loop = setInterval(draw, 1500);


2.0 b站新版本评论区 多人

数据加载完毕后,使用 go(中奖人数) 即可抽取

console.log("程序开始运行");

console.log("定义集合存储数据");

let name_set = new Set();

let id_set = new Set();

console.log("开始载入数据");


// 循环变量

var my_loop;

// 下滑延时 500毫秒 网速/加载速度较慢的朋友们最好放慢速度 提高准确性

var r_time = 500;


// 评论数

var comment_num = 1;

if(document.getElementsByClassName("b-head-t")[0].innerText.indexOf("万") != -1)

{

comment_num = 10000 * (parseInt(document.getElementsByClassName("b-head-t")[0].innerText) + 1);

}

else

{

comment_num = parseInt(document.getElementsByClassName("b-head-t")[0].innerText);

}


// 下滑

function r()

{

window.scroll(0, 1920*comment_num);

// 没有评论后自动停止下滑 并 抽奖

if(document.getElementsByClassName("loading-state")[0].innerText == "没有更多评论")

{

// 停止下滑循环

stop_r();

// 抽奖函数

draw();

}

}


// 停止下滑循环

function stop_r()

{

clearInterval(my_loop);

}


// 抽奖函数

function draw()

{

    // 循环次数

    var len = document.getElementsByClassName("con").length;

for(var i=0; i<len; i++)

{

var name = document.getElementsByClassName("list-item reply-wrap")[i].getElementsByClassName("con")[0].getElementsByClassName("user")[0].getElementsByTagName("a")[0].innerText;

var id = document.getElementsByClassName("list-item reply-wrap")[i].getElementsByClassName("con")[0].getElementsByClassName("user")[0].getElementsByTagName("a")[0].getAttributeNode("data-usercard-mid").value;

// console.log(name+",加入集合");

name_set.add(name);

id_set.add(id);

}

console.log("全部数据加载完毕");

console.log("总共"+name_set.size+"名用户");

// 这就是注释

//return false;

}


// 获取幸运儿

function go(num)

{

for(var i=0; i<num; i++)

{

// 生成随机数,直接打印中奖者信息

var lucky_num = parseInt(Math.random()*(name_set.size), 10);


console.log(" ");

console.log("中奖用户ID为:"+Array.from(id_set)[lucky_num]);

console.log("中奖用户名为:"+Array.from(name_set)[lucky_num]);

console.log(" ");

}

}


// 开始自动下滑 r_time毫秒一次

my_loop = setInterval(r, r_time);


// 全部数据加载完毕后,使用 go(中奖数) 抽取中奖者


b站“视频评论区”抽奖 讲解(含JS源码)的评论 (共 条)

分享到微博请遵守国家法律