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

JS实现b站动态评论区抽奖(含去重)

2020-05-28 15:02 作者:Love丶伊卡洛斯  | 我要投稿

新前言!!! 

因为b站新版本动态评论区页码取消,改为下滑加载的原因,旧版本代码已经无法使用,需要使用新版本3.0代码,才能正常抽取,使用方法一样,代码在文章底部更新。

补充

当然 感兴趣的可以去试试官方API 

https://api.bilibili.com/x/v2/reply/main?callback=jQuery33106548244954033764_1618553940827&jsonp=jsonp&next=4&type=11&oid=130267145&mode=3&_=1618553940831

我这也简单分析一下

开发者工具 Network JS
用户数据
postman 构建GET请求
请求头追加referer

不加referer


video


前期

测试页面链接:https://t.bilibili.com/394309046095520212?tab=2
动态评论数量为
226,这个数量是全楼层的评论数量


共分为8页展示,一页首层人数20


教程

1、访问页面

PC端打开浏览器,访问你的动态抽奖页面。点在评论上,不用点转发。


2、打开“检查”

鼠标右键,打开“检查”,一般的快捷键都是F12


长这样,我们需要在console(控制台)下输入代码。

3、贴入代码

超人性化设计,一步到位,还会打印所有用户名,如果不需要可以注释掉打印代码,就是下面那些console.log代码,注释使用 // ,不会的可以自行百度JS注释。

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

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

let name_set = new Set();

let id_set = new Set();

console.log("翻到第一页");

document.getElementsByClassName("tcd-number")[0].click();

document.getElementsByClassName("tcd-number")[0].click();

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);


实际运行测试如下,如果评论人数较多或者网速较慢,请修改最后一行 my_loop = setInterval(draw, 1000); 把这里的1000调大,1000代表1s,这是自动翻页的时间。


10页数据加载完毕后,这就是中奖者信息

3.0 新版本b站 单人版

使用方法相同,选中评论区后,console中贴入代码即可

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 = parseInt(document.getElementsByClassName("text-offset")[1].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("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("全部数据加载完毕");

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]);

// 这就是注释

//return false;

}


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

my_loop = setInterval(r, r_time);



3.1新版本多人抽取(适应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("text-offset")[1].innerText.indexOf("万") != -1)

{

comment_num = 10000 * (parseInt(document.getElementsByClassName("text-offset")[1].innerText) + 1);

}

else

{

comment_num = parseInt(document.getElementsByClassName("text-offset")[1].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("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("全部数据加载完毕");

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(中奖数) 抽取中奖者



JS实现b站动态评论区抽奖(含去重)的评论 (共 条)

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