JS實現(xiàn)b站動態(tài)轉發(fā)抽獎(小人數(shù))新方案講解

前情
即 [B站動態(tài)轉發(fā)抽獎腳本+教程](https://blog.csdn.net/Ikaros_521/article/details/102815938) 之后。
因b站數(shù)據包地址生成做了改動,猜測通過某種方式進行了加密后減去某一數(shù)值的方式。

原抽獎腳本難以獲取全部轉發(fā)者信息。
ps:即使是手動翻頁記錄,也無法獲取所有轉發(fā)者信息。即:前面的信息已不被動態(tài)頁面記錄。
再次提供另一種方案,可以極大程度的提高抽獎的準確性和真實性(小人數(shù))。
教程
1、訪問頁面
PC端打開瀏覽器,訪問你的動態(tài)抽獎頁面。

2、打開“檢查”
鼠標**右鍵**,打開“檢查”,一般的快捷鍵都是F12

長這樣,我們需要在console(控制臺)下輸入代碼。

3、手動加載所有可加載數(shù)據
點擊“轉發(fā)”圖標,并一直滾動到沒有新數(shù)據刷新為止!


4、執(zhí)行代碼
獲取可加載轉發(fā)者的人數(shù)
在“檢查”的控制臺下輸入以下命令,獲取所有可加載轉發(fā)者的人數(shù)。
document.getElementsByClassName("user-name c-pointer").length

可以看到,2k多的轉發(fā),但是實際加載到570的時候就不能加載新數(shù)據了。
將轉發(fā)者信息存入集合(集合自帶去重)
在“檢查”的控制臺下輸入以下命令,定義一個集合,叫my_set。記得按回車?。。?!
let my_set = new Set();

循環(huán)將數(shù)據存入集合
for(var i=0; i<document.getElementsByClassName("user-name c-pointer").length; i++)
{
? ? my_set.add(document.getElementsByClassName("user-name c-pointer")[i].innerText);
}

可以看到得到的Set在下面已經打印了,我們點擊Set左側的小三角,展開。
可以看到,我們一共獲取到 249條數(shù)據,已經去重后的轉發(fā)者的昵稱??梢岳^續(xù)展開查看。

可以看到已經成功去重了。

5、抽取幸運兒
直接生成隨機數(shù)并打印幸運兒
在“檢查”的控制臺輸入以下代碼,my_set.size就是 Set的長度??梢愿某蓴?shù)字,例如:249。
這個代碼會生成 0到my_set.size-1 的整數(shù)。將這個整數(shù)做為Set轉Array后的下標,打印結果。
Array.from(my_set)[parseInt(Math.random()*(my_set.size),10)]

其他程序生成隨機數(shù)進行抽取
將Set的長度記錄下來,即 249名用戶。

抽獎方式很簡單,隨便百度個隨機數(shù)生成程序。例子:http://www.99cankao.com/numbers/random-number-generator.php

注意是從 0開始,到Set長度減1。
生成結果 203 后,我們繼續(xù)在“檢查”下的控制臺下執(zhí)行代碼,轉Set為Array,打印其值。
Array.from(my_set)[203]

或是直接翻開來找。

6、一步到位 單人中獎
console.log("程序開始運行");
console.log("定義集合存儲數(shù)據");
let my_set = new Set();
var offset = document.getElementsByClassName("text-bar selected")[0].getElementsByClassName("text-offset")[0].innerText;
if(offset/20 > 25)
{
offset = 500;
}
console.log("開始載入數(shù)據");
var my_loop;
function r()
{
window.scroll(0, 1920*100);
}
function stop_r()
{
clearInterval(my_loop);
}
function draw()
{
for(var i=0; i<document.getElementsByClassName("user-name c-pointer").length; i++)
{
my_set.add(document.getElementsByClassName("user-name c-pointer")[i].innerText);
}
console.log("全部數(shù)據加載完畢");
console.log("總共"+my_set.size+"名用戶");
console.log("中獎用戶為:"+Array.from(my_set)[parseInt(Math.random()*(my_set.size),10)]);
}
my_loop = setInterval(r, 3000);
setTimeout(stop_r, 3000 * (parseInt(offset)/10 + 5));
setTimeout(draw, 3000 * (parseInt(offset)/10 + 6));
7、一步到位 多人中獎
console.log("程序開始運行");
console.log("定義集合存儲數(shù)據");
let my_set = new Set();
var offset = document.getElementsByClassName("text-bar selected")[0].getElementsByClassName("text-offset")[0].innerText;
if(offset/20 > 25)
{
offset = 500;
}
console.log("開始載入數(shù)據");
var my_loop;
function r()
{
window.scroll(0, 1920*100);
}
function stop_r()
{
clearInterval(my_loop);
}
function draw()
{
// 修改num為你需要抽獎的人數(shù)
var num = 3;
for(var i=0; i<document.getElementsByClassName("user-name c-pointer").length; i++)
{
my_set.add(document.getElementsByClassName("user-name c-pointer")[i].innerText);
}
let num_set = new Set();
while(1)
{
if(num_set.size >= num)
break;
var lucky_num = parseInt(Math.random()*(my_set.size),10);
num_set.add(lucky_num);
}
for(var i=0; i<num; i++)
{
console.log("中獎用戶為:"+Array.from(my_set)[i]);
}
}
my_loop = setInterval(r, 3000);
setTimeout(stop_r, 3000 * (parseInt(offset)/10 + 5));
setTimeout(draw, 3000 * (parseInt(offset)/10 + 6));
8、多人數(shù)二步到位腳本
自動翻頁到底部時,再輸入 draw(中獎數(shù)) 回車即可
console.log("程序開始運行");
console.log("定義集合存儲數(shù)據");
let my_set = new Set();
console.log("開始載入數(shù)據");
var my_loop;
function r()
{
window.scroll(0, 1920*100);
}
function draw(num)
{
clearInterval(my_loop);
for(var i=0; i<document.getElementsByClassName("user-name c-pointer").length; i++)
{
my_set.add(document.getElementsByClassName("user-name c-pointer")[i].innerText);
}
console.log("全部數(shù)據加載完畢");
console.log("總共"+my_set.size+"名用戶");
let num_set = new Set();
while(1)
{
if(num_set.size >= num)
break;
var lucky_num = parseInt(Math.random()*(my_set.size),10);
num_set.add(lucky_num);
}
for(var i=0; i<num; i++)
{
console.log("中獎用戶為:"+Array.from(my_set)[i]);
}
}
my_loop = setInterval(r, 3000);
// 當頁面到底時, 輸入 draw(你要抽的人的數(shù)量) 即可