b站“视频评论区”抽奖 讲解(含JS源码)
目录
- 新前言
- 旧前言
- 视频讲解
- 正文
- 1.打开视频页面
- 2.鼠标右键打开“检查”工具 或 按F12
- 3.直接贴入代码-v3.1
- 4.等待翻页到最底部后,运行 go(中奖人数)
- 抽取多人版本
- 【已不兼容】1.2 同理 控制台贴入代码,页数加载完后 然后输入 go(人数) 回车即可
- 【已不兼容】1.1 同理 控制台贴入代码,页数加载完后 然后输入 go() 回车即可
- 【已不兼容】2.0 b站新版本评论区 多人
新前言
因为 b站升级原因,原来评论的页数也变成了无限下拉加载的形式。导致旧版程序无法使用。
新版本的程序简单重构了一下,可参考下面的2.0版本新代码,使用方法一样。
ps:因为下拉加载的形式对浏览器压力过大,于是新一代程序上线,下方传送门
b站动态评论+视频评论区 抽奖2合1 JS版本
旧前言
如有 动态评论区 抽奖需要,可以参考:JS实现b站动态抽奖“公平”方案——动态+转发
因为转发抽奖只支持小人数,如果人少,可以使用:JS实现b站动态转发抽奖(小人数)新方案讲解
B站动态转发抽奖脚本+教程
为了方便我已经对代码做了整理,传送门:码云 GitHub
视频讲解
B站“视频评论区”抽奖 讲解【JS】
传送门
正文
1.打开视频页面
2.鼠标右键打开“检查”工具 或 按F12
3.直接贴入代码-v3.1
代码如下,复制粘贴进入“console”,然后回车
console.log("程序开始运行");
console.log("定义集合存储数据");
let name_set = new Set();
let id_set = new Set();
console.log("开始载入数据");// 循环变量
var my_loop;
// 下滑延时 800毫秒 网速/加载速度较慢的朋友们最好放慢速度 提高准确性
var r_time = 800;// 评论数
var comment_num = 1;
if(document.getElementsByClassName("total-reply")[0].innerText.indexOf("万") != -1)
{comment_num = 10000 * (parseInt(document.getElementsByClassName("total-reply")[0].innerText) + 1);
}
else
{comment_num = parseInt(document.getElementsByClassName("total-reply")[0].innerText);
}// 下滑
function r()
{setTimeout(() => {window.scroll(0, 1);}, 1000);window.scroll(0, 1920*comment_num);// 没有评论后自动停止下滑 并 抽奖if(document.getElementsByClassName("reply-end")[0]){// 停止下滑循环stop_r();// 抽奖函数draw();}
}// 停止下滑循环
function stop_r()
{clearInterval(my_loop);
}// 抽奖函数
function draw()
{// 循环次数var len = document.getElementsByClassName("user-name").length;for(var i=0; i<len; i++){var name = document.getElementsByClassName("user-name")[i].innerText;var id = document.getElementsByClassName("user-name")[i].getAttributeNode("data-user-id").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(中奖数) 抽取中奖者
4.等待翻页到最底部后,运行 go(中奖人数)
例如 go(1)
就是抽一个人
ok 结束。
抽取多人版本
【已不兼容】1.2 同理 控制台贴入代码,页数加载完后 然后输入 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("list-item reply-wrap").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_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);
【已不兼容】1.1 同理 控制台贴入代码,页数加载完后 然后输入 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("list-item reply-wrap").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_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源码)相关推荐
- JS实现b站动态评论区抽奖(含去重)
目录 新前言 补充 视频演示 旧前言 教程 1.访问页面 2.打开"检查" 3.贴入代码 2.0版本多人抽取 3.0新版本单人抽取(适应b站动态改动) 3.1新版本多人抽取(适应b ...
- 【目标检测】基于matlab GUI背景差分算法视频运动物体跟踪【含Matlab源码 1915期】
一.背景差分法和帧间差分法的车辆运动目标检测简介 1 引言 运动目标检测是从图像序列中检测运动目标.通过运动目标检测可以得到图像中的运动目标,获取图像中的运动信息.运动目标检测在医学辅助诊断.航天航空 ...
- 【Matlab系列】视频图像数字水印系统设计【含Matlab源码】
Date: 2019.3.24 前言 数字水印技术一般用于版权认证.在实际使用中,嵌入水印的鲁棒性就显得非常重要.通常会采用各种方式进行攻击测试,比如加噪滤波,缩放.旋转.剪切.JPEG压缩等 ...
- python b站动态转发、动态评论区抽奖(已打包成exe,可以下载食用)
前言 更新日志 2022-5-28 由于发现b站api变更,更新新版本v3.6进行适配 2022-8-1 更新兼容视频动态版本v3.7 2022-9-20 基于ttk库优化UI,发布版本v3.8 简述 ...
- 爬取b站视频评论用户信息!这些评论的才是大神!
最近马保国老师在b站挺火的,关于他的视频播放量很高,b站视频评论区都是人才说话好听,写个爬虫爬取一下b站评论区用户信息和评论内容. 一.准备工作 1.工具 (1)Chrome 谷歌浏览器 安装地址:h ...
- python3网络爬虫--爬取b站视频评论用户信息(附源码)
文章目录 一.准备工作 1.工具 二.思路 1.整体思路 2.爬虫思路 三.分析网页 1.分析网页加载方式 2.分析数据接口 3.获取oid 四.撰写爬虫 五.存储数据 六.总结 你爱我,我爱你,蜜雪 ...
- B站评论区抽奖[python]
Bili-Luckdog B站评论区抽奖工具 by - ALKEYSHENG 2020.5.21 第三方库requests Blog: i.2017.work Github项目: Bili-Lucky ...
- 简单的爬取B站视频评论
2019年12月20日15:14:09补充: 这篇博客为刚学爬虫的一个简单实践,主要使用到的为selenium模拟点击 补充说明的主要原因是有小伙伴问我评论提取的相关问题,这里统一回复一下 最简单的办 ...
- python爬取b站评论_学习笔记(1):写了个python爬取B站视频评论的程序
学习笔记(1):写了个python爬取B站视频评论的程序 import requests import json import os table='fZodR9XQDSUm21yCkr6zBqiveY ...
最新文章
- echarts 自定义图表
- 996和被辞退,二选一
- java.nio.file.FileSystemException: xxx: Too many open files
- C++中函数模板template和函数参数为指针,且有返回值的结合使用
- 【centos7】添加开机启动服务/脚本
- JAVA入门[22]—thymeleaf
- 将速度加快到自己的个人代码生成器中
- BSD:Berkeley Software Distribution,伯克利软件套件
- mysql oldaltertable_MySQL5.6 ALTER TABLE 分析和测试
- 记录mysql in和not in 效率低下的问题
- 《三国演义》里到底描写了多少个人物,你知道吗?
- 各地大厂名单(一二线城市知名公司)
- 录屏 java_Java小程序—录屏小程序(上半场)
- python-控制键盘鼠标
- Oracle 工作语句记录
- 野火F1开发板STM32案例-USART使用
- java并发原理实战(8)-- lock接口使用和认识
- 最优投资组合构建问题,Python实现
- win7 ftp服务器修改读写权限,win7 ftp服务器文件夹权限修改
- 大商创如何重置或修改商家店铺登录密码?
热门文章
- (转)多媒体通话杂谈:SBC设备(边界会话控制器)全面剖析讲解
- 3.licheepi wifi
- ExternalInterface的call函数返回null的原因分析(AS2)
- 解决 clean-webpack-plugin www has been removed 问题
- 全球最强图标库:码农福利图标库Easyicon、Thenounproject、icons8、flaticons超值大礼包,你值得拥有……
- 企业IT架构转型之道:阿里巴巴中台战略思想与架构实战. 2.4 赋予业务快速创新和试错能力...
- ubuntu软件安装方法大全
- 称重软件-汽车衡称重防作弊系统整体解决方案
- Atlas(2):开源数据治理方案
- 单相逆变器第三课、系统结构分析梳理