b站动态评论+视频评论区 抽奖2合1 JS版本

Posted Love丶伊卡洛斯

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了b站动态评论+视频评论区 抽奖2合1 JS版本相关的知识,希望对你有一定的参考价值。

前言

由于过去的模拟人工下拉加载数据的形式在大数据的情况下会导致页面的卡顿和资源的大量占用,所以这期新版本提上了开发。
本次实现方式使用的b站api,构建get请求调用api获取评论信息,解析json数据存入集合,最后从集合获取中奖者信息。
相关API为

// 用于获取oid
"https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/get_dynamic_detail?dynamic_id=" + dynamic_id;
/*
    获取评论信息
    jquery就是请求后面跟随的数字(并不固定)
    first_time是请求的时间戳(毫秒级)
    i是页码(从0开始)ps:next后的i为0时不需要加1,详细见源码
    type是页码类型 自己发的动态是11,转发的动态是17,视频是1
    oid就是页码的oid,为固定值
    time就是实时的时间戳(毫秒级)
*/ 
"https://api.bilibili.com/x/v2/reply/main?callback=jQuery" + jquery + "_" + (first_time + i) + "&jsonp=jsonp&next=" + (i + 1)+ "&type=" + type + "&oid=" + oid + "&mode=3&plat=1&_=" + time;

另外请求之间有500毫秒的延时,请求过快可能会被封IP,所以不建议调的太短。
下面就开始实际使用教程。

b站动态/视频评论区抽奖二合一 JS版本使用和讲解

视频使用讲解传送门

代码下载

码云 github

使用说明

动图版

动态和视频评论的原理类似,都是查jQuery后的数字,请仔细阅读

1、打开动态页面,并开启开发者工具(F12)

选择“Network”,检索“JS”,然后F5或者Ctrl+R 刷新页面

2、刷新页面后我们下滑至评论区处,加载的JS

就是这个main打头的,我们鼠标左键点击它

3、复制请求中的jQuery后_前的一串数字(约21位)

4、复制代码至console(控制台)回车

5、使用get(刚才复制的jQuery后的数字)函数,获取评论数据等


然后回车

6、使用go(中奖人数)函数进行抽奖即可

代码

1.0版本

console.log("定义集合存储数据");
let name_set = new Set();
let id_set = new Set();

var oid = "";
var comment = "";

// 获取动态的oid
function get_oid(dynamic_id)
{
    var url = "https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/get_dynamic_detail?dynamic_id=" + dynamic_id;
    var xmlhttp;
    if(window.XMLHttpRequest)
    {
        //code for IE7+,Firefox,Chrome,Opera,Safari
        xmlhttp = new XMLHttpRequest();
    }
    else
    {
        //code for IE6,IE5
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }

    xmlhttp.onreadystatechange = function()
    {
        if(xmlhttp.readyState == 4)
        {
            if(xmlhttp.status == 200)
            {
                //将接收到的字符串存入str
                var str = xmlhttp.responseText;
                if(str.length == 0)
                {
                    return "";
                }

                //console.log(str);

                // 转为JSON对象
                var json = JSON.parse(str);
                console.log(json);

                // 解析json对象获取对应值
                oid = json["data"]["card"]["desc"]["rid"];
                console.log("oid=" + oid);
            }
            else
            {
                //alert(xmlhttp.status);
            }

        }
        else
        {
            //alert(xmlhttp.readyState);
        }
    }
    
    xmlhttp.open("GET", url, true);
    xmlhttp.send();
}

// 提前获取oid
function oid_init()
{
    var referer = window.location.href;
    // 动态页
    if("t" == referer.slice(8, 9))
    {
        var referer2 = referer.substr(0, referer.length - 2);
        var dynamic_id = referer2.replace(/[^0-9]/ig,"");
        // console.log(dynamic_id);
        oid = get_oid(dynamic_id);

        var temp = document.getElementsByClassName("text-offset")[1].innerText;

        if(temp.indexOf("万") != -1)
        {
            comment = 10000 * (parseFloat(temp.slice(1, temp.length - 2)) + 0.1);
        }
        else
        {
            comment = parseInt(temp);
        }
    }
    // 视频页
    else
    {
        oid = window.aid;
        console.log("oid=" + oid);
        comment = parseInt(document.getElementsByClassName("b-head")[0].getElementsByClassName("results")[0].innerText);
    }

    console.log("comment=" + comment);
}

oid_init();

// 睡眠多少毫秒
function sleep(ms)
{
    return new Promise(resolve => setTimeout(resolve, ms));
}

// 抽奖函数 例如:get(331030722370851298386)
async function get(jquery)
{
    var referer = window.location.href;
    var type = 11;

    if("t" == referer.slice(8, 9)) type = 11;
    else type = 1;

    if(0 == referer.length || 0 == jquery.length || 0 == comment.length)
    {
        alert("请填写完整信息!");
        return;
    }

    await sleep(1000);

    var first_time = Math.round(new Date());
    var time = 0;
    var url = "";
    for(var i = 0; i <= (comment-1)/20; i++)
    {
        if(0 == i)
        {
            url = "https://api.bilibili.com/x/v2/reply/main?callback=jQuery" + jquery + "_" +
            (first_time + i) + "&jsonp=jsonp&next=0&type=" + type + "&oid=" + oid + "&mode=3&plat=1&_=" + (first_time + 1);
        }
        else
        {
            time = Math.round(new Date());
            url = "https://api.bilibili.com/x/v2/reply/main?callback=jQuery" + jquery + "_" +
                (first_time + i) + "&jsonp=jsonp&next=" + (i + 1) + "&type=" + type + "&oid=" + oid + "&mode=3&plat=1&_=" + time;
        }

        // 结束标志位
        var end = 0;
        if(i == (comment-1)/20) end = 1;
        else end = 0;
        get_data(url, end);

        // 睡眠500毫秒 0.5秒
        await sleep(500);
    }

    console.log("数据获取完毕!可以调用go(中奖人数)进行抽奖。");
}

// 数据获取
function get_data(url, end)
{
    var xmlhttp;
    if(window.XMLHttpRequest)
    {
        //code for IE7+,Firefox,Chrome,Opera,Safari
        xmlhttp = new XMLHttpRequest();
    }
    else
    {
        //code for IE6,IE5
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }

    xmlhttp.onreadystatechange = function()
    {
        if(xmlhttp.readyState == 4)
        {
            if(xmlhttp.status == 200)
            {
                //将接收到的字符串存入str
                var str = xmlhttp.responseText;
                if(str.length == 0)
                {
                    return;
                }

                // console.log(str);

                var len = str.length;
                var str2 = str.slice(str.indexOf('(') + 1, len - 1);
                // console.log(str2);

                // 转为JSON对象
                var json = JSON.parse(str2);
                console.log(json);

                // 一组20个数据
                for(var i = 0; i < 20; i++)
                {
                    // 解析json对象获取对应值
                    var mid = json["data"].replies[i]["member"]["mid"];
                    var uname = json["data"].replies[i]["member"]["uname"];

                    // 插入集合
                    name_set.add(uname);
                    id_set.add(mid);
                }

                if(1 == end)
                {
                    console.log("数据获取完毕!可以调用go(中奖人数)进行抽奖。");
                }
            }
            else
            {
                //alert(xmlhttp.status);
            }

        }
        else
        {
            //alert(xmlhttp.readyState);
        }
    }
    
    xmlhttp.open("GET", url, true);
    xmlhttp.send();
}

// 获取幸运儿
function go(num)
{
	for(var i = 0; i < num; i++)
	{
		// 生成随机数,直接打印中奖者信息
		var lucky_num = parseInt(Math.random()*(name_set.size), 10);

        var id = Array.from(id_set)[lucky_num];
        var name = Array.from(name_set)[lucky_num];
		console.log(" ");
		console.log("中奖用户ID为:" + id);
		console.log("中奖用户名为:" + name);
		console.log(" ");

        id_set.delete(id);
        name_set.delete(name);
	}
}

console.log("贴入代码后,使用get(jQuery后到_前的约21位字符)函数,生成URL,发送GET请求获取数据");
console.log("数据获取完毕后,使用go(中奖人数)即可");

1.1版本 打印数据的组号和下标,方便其余信息查看


位置不一定刚好对上,不对就往后翻(因为重复数据被剔除了 导致数据错位)

console.log("定义集合存储数据");
let name_set = new Set();
let id_set = new Set();

var oid = "";
var comment = "";

// 获取动态的oid
function get_oid(dynamic_id)
{
    var url = "https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/get_dynamic_detail?dynamic_id=" + dynamic_id;
    var xmlhttp;
    if(window.XMLHttpRequest)
    {
        //code for IE7+,Firefox,Chrome,Opera,Safari
        xmlhttp = new XMLHttpRequest();
    }
    else
    {
        //code for IE6,IE5
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }

    xmlhttp.onreadystatechange = function()
    {
        if(xmlhttp.readyState == 4)
        {
            if(xmlhttp.status == 200)
            {
                //将接收到的字符串存入str
                var str = xmlhttp.responseText;
                if(str.length == 0)
                {
                    return "";
                }

                //console.log(str);

                // 转为JSON对象
                var json = JSON.parse(str);
                console.log(json);

                // 解析json对象获取对应值
                oid = json["data"]["card"]["desc"]["rid"];
                console.log("oid=" + oid);
            }
            else
            {
                //alert(xmlhttp.status);
            }

        }
        else
        {
            //alert(xmlhttp.readyState);
        }
    }
    
    xmlhttp.open("GET", url, true);
    xmlhttp.send();
}

// 提前获取oid
function oid_init()
{
    var referer = window.location.href;
    // 动态页
    if("t" == referer.slice(8, 9))
    {
        var referer2 = referer.substr(0, referer.length - 2);
        var dynamic_id = referer2.replace(/[^0-9]/ig,"");
        // console.log(dynamic_id);
        oid = get_oid(dynamic_id);

        var temp = document.getElementsByClassName("text-offset")[1].innerText;

        if(temp.indexOf("万") != -1)
        {
            comment = 10000 * (parseFloat(temp.slice(1, temp.length - 2)) + 0.1);
        }
        else
        {
            comment = parseInt(temp);
        }
    }
    // 视频页
    else
    {
        oid = window.aid;
        console.log("oid=" + oid);
        comment = parseInt(document.getElementsByClassName("b-head")[0].getElementsByClassName("results")[0].innerText);
    }

    console.log("comment=" + comment);
}

oid_init();

// 睡眠多少毫秒
function sleep(ms)
{
    return new Promise(resolve => setTimeout(resolve, ms));
}

// 抽奖函数 例如:get(331030722370851298386)
async function get(jquery)
{
    var referer = window.location.href;
    var type = 11;

    if("t" == referer.slice(8, 9)) type = 11;
    else type = 1;

    if(0 == referer.length || 0 == jquery.length || 0 == comment.length)
    {
        alert("请填写完整信息!")以上是关于b站动态评论+视频评论区 抽奖2合1 JS版本的主要内容,如果未能解决你的问题,请参考以下文章

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

b站评论怎么复制

评论区抽奖程序2.0

评论区抽奖程序2.0

评论区抽奖程序

评论区抽奖程序