哔哩哔哩自动批量删除抽奖动态解析篇(二)
通过前文我们已经获得账户下转发的动态列表,这一节我们要做的就是根据前一节获得的动态列表数据判断抽奖动态是否已开奖。
一、获取抽奖动态开奖状态信息
首先我们按F12健进入网页源代码,然后点开一条抽奖动态的按钮链接,找到API接口。流程请看下图
点击生成的iframe本质也是一个网页页面,不习惯的朋友也可以通过这个链接单独打开一个页面:抽奖页面,
https://www.bilibili.com/h5/lottery/result?business_type=1&business_id=975949657865715728&isWeb=1,然后对页面元素进行分析。这里的business_id就是每条动态的索引值,只要是使用官方抽奖工具的动态,可以随意替换该值进入对应的页面。
二、获取数据API接口
通过上面的操作,我们找到抽奖动态的数据信息是通过一个https://api.vc.bilibili.com/lottery_svr/v1/lottery_svr/lottery_notice接口返回数据,这接口仅传输数据,无法在网页直接打开,我们找到该接口参考前一小节里复制脚本生成python代码的操作到Convert curl commands to Python, JavaScript and more网站生成对应的python代码,运行脚本输出结果:
1、代码分析
从复制生成的代码中,cookie和header我们忽略,需要我们关注的是params里的参数
params = {'business_id': '975793999666216981','business_type': '1','csrf': '21de42957e8840dd09d8bdb2c08c3c2a','web_location': '333.1330',
}
- business_id是我们获取不同抽奖动态开奖状态的索引,我们通过变动该值获取不同动态状态
- csrf每隔一段时间会变化,我怀疑是一串验证码,每隔一段时间生成新的,带有旧的验证码的请求会被抛弃,因为下文删除动态需要cookie认证,届时获取的参数也有csrf值,我们此处先不做处理。
- bussiness_type和web_location是一些基本参数,不会变化,不用理睬
2、思路分析
通过上面的代码,我们发现主要修改bussiness_id我们就能获取不同抽奖动态的开奖状态,其中如果是官方抽奖工具动态,返回的数据会有lottery_time这个值,该值是我们判断是否开奖的重要依据,非官方抽奖工具或者普通转发的动态,将不包含该值,因此,代码思路如下
- 更改bussiness_id获取不同抽奖动态数据
- 判断服务器返回数据是否含有lottery_time这个值,若有为官方抽奖动态,若无,为第三方工具抽奖动态或为普通转发动态
- 使用datatime模块对lottery_time时间戳进行格式化
- 使用now函数获取当前时间
- 比较开奖时间和当前时间,如果已开奖,返回false,未开奖返回True
由于我们前文获取的动态列表包含非官方抽奖工具的动态,此部分动态没有lottery_time判断是否开奖,因此我们默认此类动态返回True。
3、代码实现
def isAlive(orig_id_str):params = {'business_id': orig_id_str,'business_type': '1','csrf': crsf,'web_location': '333.1330',}res = requests.get('https://api.vc.bilibili.com/lottery_svr/v1/lottery_svr/lottery_notice',params=params,cookies=cookies,headers=headers,).json()sleep_time = random.randint(1, 4)#随机生成1-4秒延迟,避免过快访问接口而被封杀time.sleep(sleep_time)data = res['data']timestamp =data.get('lottery_time')if timestamp:lefttime = datetime.datetime.fromtimestamp(timestamp)#格式化时间戳now = datetime.datetime.now()#获取当前时间lefts = lefttime - now#时间戳是一段int值,其实我们也可以获取现在的时间戳,两个数值相减效率可能更快,但是我想看具体开奖时间,所以用了格式化方式return lefts > datetime.timedelta(0)#比较时间差是否大于0return True#非官方抽奖工具动态默认返回True,避免删除
我们编写了一个isAlive函数,以便后续复用,传入的参数是原动态索引值,也就是我们前文获得的对象列表中的orig_id_str,到这一步我们判断官方抽奖动态是否开奖的步骤就完成了,下一步就是我们要做删除动态的操作了。
哔哩哔哩自动批量删除抽奖动态——使用篇
哔哩哔哩自动批量删除抽奖动态解析篇(一)
哔哩哔哩自动批量删除抽奖动态解析篇(二)
哔哩哔哩自动批量删除抽奖动态解析篇(三)
哔哩哔哩自动批量删除抽奖动态解析篇(四)