【JavaScript】dalao直播活动猫粮太多了?氪金用户拯救计划!一次性抽完猫粮教程! 学

继 2·29活动的那么多dalao小电视几百几百砸事件之后,小破站的矿佬们再次突破了我的想象,让我充分认识到了“除了我,大概真的实现小康了”的真实观念。
但是贫穷的我又开始忧国忧民起来了。
...
dalao们假如按100个小电视的程度来砸。
100 * 1314000 / 1000 / 100 = 131次。如果让我点131次百连抽奖,那我是肯的,但是dalao想法不一样啊,万一因为烦惹,就不想抽了,那不就浪费了吗(虽然也不关我事)。本着忧国忧民的心,如何实现一次性抽完呢,我开始了!

首先。把手机放下 打开电脑Chrome,进入 活动页面 然后 按下 F12。
然后在弹出来的 console 的 控制台分页下 输入以下代码:
let url = `https://api.live.bilibili.com/xlive/web-ucenter/v1/capsule/open_capsule_by_id`;
let csrf = /.*bili_jct=(.*?);.*/i.exec(document.cookie)[1];
let data = { id: 54, platform: 'web', _: (new Date).valueOf(), csrf_token: csrf , csrf };
let builder = count=>({ url, data:{...data, count}, method:"post", xhrFields:{withCredentials:true}});
async function 一次抽完(抽奖次数){
let count = Math.floor(抽奖次数 / 1000);
let result = [];
let hC = Math.floor(count / 100);
let tC = Math.floor((count % 100) / 10);
let oC = count % 10;
while(hC--) result = result.concat((await new Promise(complete=>$.ajax({...builder(100),complete }))).data.text);
while(tC--) result = result.concat((await new Promise(complete=>$.ajax({...builder(10),complete }))).data.text);
while(oC--) result = result.concat((await new Promise(complete=>$.ajax({...builder(1),complete }))).data.text);
console.log('您抽奖了'+count +'次获得了', ...result);
}
按回车,再按照你现在有的猫粮,以1000为例子,再在控制台输入并回车运行
一次抽完(1000)
就可以一次性抽完奖咯!

好的,让我们忘掉开头,从事件思路上引导我们走向拯救dalao的道路!
我们先用 Chrome 打开 活动地址 并打开Console控制台 (F12) 花费1000猫粮进行一次单抽
目的是为了获取样本请求:

果不其然。我们获得了一个标准的非洲样本....
仔细分析我们可以发现。请求是一个 POST 请求。
域名是 https://api.live.bilibili.com/ 所以我们需要注意在发起异步请求的时候需要主动带上 Cookies 信息。有 七个请求表单参数。
先简单揣摩一下含义:
id 应该是本次抽奖的id,不用做出修改。
count 应该标识的是请求是单抽的意思,那就是实现一次抽完的关键了(实际上却..)。
platform 标识出请求的设备是属于哪种类型的客户端。
_ 一看后面一串就知道是老时间戳了。
csrf_token & csrf 应该是身份令牌,注意,这个切记要保护好!不能告诉第二个人!
visit_id 姑且认为是访客id,经过测试,发现或许可以不传。
分析完参数,接下来就非常好办了,仔细分析可以发现,几乎只有 csrf 是我们无法直接得到的,于是我们要开始寻找Ta了!
最暴力的方法有时是最简单的,我们切换到控制台的 Sources 页,从左侧一个个展开,点开js文件进行 Ctrl + F 大法。这需要一些时间。(其实方法超多,但是其他方法写起来麻烦一些,咳)。

最后我们成功找到了相关的代码!附近看见了 cookie 这个单词....Cookie!
我们切换到 Application ,在左侧的 Storage 里面选中 Cookie,成功找到了和请求中一样的字符串!
至此,所有需要的都找到了! 最终拼成文章开头的代码,就完成了!
(然而,count 字段只支持 100 10 1三种数字。那只能以量补质了。)

emmmmmm 好的非洲人结果是这样的 ....