目录

  • 新前言
    • 补充
    • 视频演示
    • 旧前言
    • 教程
      • 1、访问页面
      • 2、打开“检查”
      • 3、贴入代码
    • 2.0版本多人抽取
    • 3.0新版本单人抽取(适应b站动态改动)
    • 3.1新版本多人抽取(适应b站动态改动)
    • 3.2新动态版多人抽取优化css版本

新前言

因为 b站动态升级原因,原来评论的页数也变成了无限下拉加载的形式,导致旧版程序无法使用,新版本的程序简单重构了一下,可参考下面的3.0版本新代码,使用方法一样,不过耗时会有所增加。
    目前成功完成1250 1w评论的动态的测试

补充

当然 感兴趣的可以去试试官方API
https://api.bilibili.com/x/v2/reply/main?callback=jQuery33106548244954033764_1618553940827&jsonp=jsonp&next=4&type=11&oid=130267145&mode=3&_=1618553940831


我这也简单分析一下


动态转发抽奖可以参考这2篇文章
JS实现b站动态转发抽奖(小人数)新方案讲解
B站动态转发抽奖教程(python)

视频演示

JS实现b站动态评论区抽奖视频演示

旧前言

为了方便我已经对代码做了整理,传送门:码云 GitHub
测试页面链接:https://t.bilibili.com/394309046095520212?tab=2
动态评论数量为226,这个数量是全楼层的评论数量

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

教程

1、访问页面

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

2、打开“检查”

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

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

3、贴入代码

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

console.log("程序开始运行");
console.log("定义集合存储数据");
let name_set = new Set();
let id_set = new Set();
console.log("开始载入数据");
var page = 1;
var 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("第"+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页数据加载完毕后,这就是中奖者信息

2.0版本多人抽取

运行完毕后,输入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()
{// 循环次数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;var id = document.getElementsByClassName("con")[i].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(num)
{if(num > name_map.size){console.log("???搞事情???,一共都没那么多人");return;}var arr = [];var lucky_num;for(var i = 0; i < num; i++){lucky_num = parseInt(Math.random()*(name_map.size), 10);if (arr.toString().indexOf(lucky_num) > -1) {i--;continue;}else{arr.push(lucky_num);}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);

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

3.2新动态版多人抽取优化css版本

考虑到大量数据对浏览器和电脑的压力,附加css样式禁用功能
效果如下:

console.log("程序开始运行");console.log("所有css样式禁用");
// 考虑到大量数据对浏览器和电脑的压力,附加css样式禁用功能
for(var i=0; i<document.styleSheets.length; i++)
{document.styleSheets[i].disabled = "disable";
}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站动态评论区抽奖(含去重)相关推荐

  1. python b站动态转发、动态评论区抽奖(已打包成exe,可以下载食用)

    前言 更新日志 2022-5-28 由于发现b站api变更,更新新版本v3.6进行适配 2022-8-1 更新兼容视频动态版本v3.7 2022-9-20 基于ttk库优化UI,发布版本v3.8 简述 ...

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

    目录 新前言 旧前言 视频讲解 正文 1.打开视频页面 2.鼠标右键打开"检查"工具 或 按F12 3.直接贴入代码-v3.1 4.等待翻页到最底部后,运行 go(中奖人数) 抽取 ...

  3. B站评论区抽奖[python]

    Bili-Luckdog B站评论区抽奖工具 by - ALKEYSHENG 2020.5.21 第三方库requests Blog: i.2017.work Github项目: Bili-Lucky ...

  4. 评论区抽奖程序2.0

    评论区抽奖程序2.0 稍微的加了一点点功能,让程序更加的自动化了 [送书活动] 每周三发文章送书,两本 开奖时间为周五晚上8.00 下周书籍寄出 关注博主,每周抽奖 1. 程序作用 从某CSDN文章的 ...

  5. 【重磅】历史性时刻:本周周榜第八名,突破一万粉丝,首次解密快速涨粉秘诀!(在本篇文章评论区抽奖送书)

    背景 在上周经过一个多月的连篇爆文,终于迎来里程碑的一刻:粉丝破万了! 为了回馈一直默默支持我的粉丝们,决定在评论区抽奖送一本大数据相关的书<Python大数据分析>,感谢@不吃西红柿丶西 ...

  6. JS实现b站动态转发抽奖(小人数)新方案讲解

    前言 即 B站动态转发抽奖脚本+教程 之后. 因b站数据包地址生成做了改动,猜测通过某种方式进行了加密后减去某一数值的方式. 原抽奖脚本难以获取全部转发者信息. ps:即使是手动翻页记录,也无法获取所 ...

  7. Python实现评论区抽奖功能,Python高级开发工程师面试题

    2. 获取评论数据 ============================================================================ 有了接口以后,我们使用 r ...

  8. 爬取b站视频评论用户信息!这些评论的才是大神!

    最近马保国老师在b站挺火的,关于他的视频播放量很高,b站视频评论区都是人才说话好听,写个爬虫爬取一下b站评论区用户信息和评论内容. 一.准备工作 1.工具 (1)Chrome 谷歌浏览器 安装地址:h ...

  9. python3网络爬虫--爬取b站视频评论用户信息(附源码)

    文章目录 一.准备工作 1.工具 二.思路 1.整体思路 2.爬虫思路 三.分析网页 1.分析网页加载方式 2.分析数据接口 3.获取oid 四.撰写爬虫 五.存储数据 六.总结 你爱我,我爱你,蜜雪 ...

最新文章

  1. CSS-布局样式之筛选条件右边线的处理方法(no CSS3)
  2. android 视频沉浸式,Android项目实战(四十一):游戏和视频类型应用 状态栏沉浸式效果...
  3. 源代码文档生成 Doxygen介绍(转载)
  4. 收集Redis16个最常见面试问题
  5. python return用法_初学Python要了解什么 装饰器知识汇总有哪些
  6. HBase 的表设计
  7. 基本的SVG样式属性
  8. python socket.error: [Errno 10054] 远程主机强迫关闭了一个现有的连接。问题解决方案
  9. from xx is not a valid DFS filename
  10. eoe android Studio 安装使用教程
  11. 22000字深入研究消费电子光学传感器行业
  12. 投票和排名系统C语言顺序表,电视大赛观众投票及排名系统C语言设计.docx
  13. emacs go-mode 设置tab宽度
  14. 常见国际贸易专业术语
  15. 简谐振动的能量与合成(大学物理笔记)
  16. 运用大数据手段 加快传统产业转型升级
  17. 网线简介及交换机原理和模式浅谈
  18. 励志: 我们来看看那些优秀的人的眼界和思想
  19. Linux打tar包命令
  20. NLP判断语言情绪_健玲:NLP的基本精神12条前提假设,打破你的思维墙

热门文章

  1. python 自动运维架构师_运维架构师-Python 自动化运维开发-031
  2. 【原创】PE检测工具
  3. 如何关闭PPT、Word、Excel的预览图标
  4. cesium实现四色预警(仿echarts)(cesium篇.50)
  5. 雷达感应智能化技术,让家居生活更智能,雷达传感器技术应用
  6. 1----sim模块的使用
  7. 很火的《脱口秀大会》里的他们竟然都是程序员
  8. Android再进阶之广播发送、接收和注册过程
  9. 谷歌2017面经题集
  10. css图片放大缩小动画