目錄
新前言
因為 b站升級原因,原來評論的頁數也變成了無限下拉加載的形式。導致舊版程序無法使用。
新版本的程序簡單重構了一下,可參考下面的2.0版本新代碼,使用方法一樣。
舊前言
如有 動態評論區 抽獎需要,可以參考:JS實現b站動態抽獎“公平”方案——動態+轉發
因為轉發抽獎只支持小人數,如果人少,可以使用:JS實現b站動態轉發抽獎(小人數)新方案講解
B站動態轉發抽獎腳本+教程
為了方便我已經對代碼做了整理,傳送門:碼雲 GitHub
視頻講解
[video(video-xkiJGol3-1596864652942)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=884157550)(image-https://ss.csdn.net/p?http://i0.hdslb.com/bfs/archive/633618e427e39cb56b577306b9d9cd18adcad19d.jpg)(title-B站“視頻評論區”抽獎 講解【JS】)]
傳送門
正文
1.打開視頻頁面
2.鼠標右鍵打開“檢查”工具 或 按F12
3.直接貼入代碼,直搗黃龍
代碼如下,復制粘貼進入“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()
{
// 循環次數
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 + "名用戶");
// 生成隨機數,直接打印中獎者信息
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 結束。
抽取多人版本
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(中獎數) 抽取中獎者