亲宝软件园·资讯

展开

PythonB站监控

Charles的皮卡丘 人气:0

众所周知,B站有很多有趣的UP主,可以教大家一些"实用"的知识:

但是他们一般都没有固定的更新时间,那么如何才能第一时间知道自己又有新的饭点可以看的下饭素材呢?当然是用python来写个脚本自动监控UP是否更新了视频,并自动下载啦~

废话不多说,让我们愉快地开始吧~

开发工具

Python版本:3.7.8

相关模块:

DecryptLogin模块;

videofetch模块;

以及一些python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

原理简介

1.确定小目标

首先,确定一下我们想实现的脚本的功能:给定一些UP主的ID,我们自动关注这些UP主,并开始监控这些UP主是否有更新视频,如果有则微信进行通知并自动下载这些视频。

2.模拟登录

既然要实现自动关注功能当然还是要先实现B站的模拟登录啦,这里我们还是借助公众号之前开源的DecryptLogin包,先安装一下:

# 请确保自己使用的是最新版本的DecryptLogin
pip install DecryptLogin --upgrade

然后简单写几行代码就ok啦:

from DecryptLogin import login

lg = login.Login()
infos_return, session = lg.bilibili(mode='scanqr')

3.自动关注

我们先来抓包看看关注UP主时需要请求的接口吧,简单调试之后发现以下这个链接不管从名字还有从需要携带的参数看都很可疑:

于是,我们可以先写个脚本测试一下我们的想法,可以看到请求这个接口需要携带的参数如下:

经过测试,必须要携带的参数是这些:

fid: 想要关注的UP主的ID;

act: 固定值, 为1;

re_src: 固定值, 为11;

jsonp: 固定值, 为jsonp;

csrf: 从登录的cookies中可以拿到。

代码实现如下:

'''关注某个UP主'''
def follow(self, up_id):
    url = 'https://api.bilibili.com/x/relation/modify'
    data = {
        'fid': up_id,
        'act': 1,
        're_src': 11,
        'jsonp': 'jsonp',
        'csrf': self.session.cookies.get_dict(domain='.bilibili.com').get('bili_jct', ''),
    }
    headers = {
        'Host': 'api.bilibili.com',
        'Origin': 'https://space.bilibili.com',
        'Referer': f'https://space.bilibili.com/{up_id}/',
    }
    response = self.session.post(url, data=data, headers=headers)
    response_json = response.json()
    return response_json['code'], response_json.get('message', '')

测试之后登录客户端看发现确实可以成功关注对应的UP主,于是这部分内容也顺利地完成啦~

4.实时监控

实时监控其实也很简单,只需要先把目标UP主当前首页的作品信息获取到,然后每隔一段时间对比一次,看看有没有新的作品出现就行啦。

具体而言,我们需要先获取到UP主当前首页的作品信息:

'''获得UP主首页所有视频信息'''
def getupvids(self, up_id):
    up_vids, aids = [], []
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36'}
    params = {'keyword': '', 'mid': up_id, 'ps': 30, 'tid': 0, 'pn': 1, 'order': 'pubdate'}
    response = self.session.get('https://api.bilibili.com/x/space/arc/search', headers=headers, params=params)
    response_json = response.json()
    for item in response_json['data']['list']['vlist']:
        aids.append(item['aid'])
    for aid in aids:
        params = {'aid': aid}
        response = self.session.get('https://api.bilibili.com/x/web-interface/view', headers=headers, params=params)
        response_json = response.json()
        up_vids.append('https://www.bilibili.com/video/' + response_json['data']['bvid'])
    return up_vids

然后每隔一段时间对比一下就行:

for up_id in self.up_ids:
    self.logging(f'正在检查UP主{ups_recorder[up_id]["username"]}是否更新了视频...')
    vids = self.getupvids(up_id)
    ups_recorder[up_id]['updated_vids'] = []
    for vid in vids:
        if vid in ups_recorder[up_id]['vids']: continue
        ups_recorder[up_id]['updated_vids'].append(vid)
        ups_recorder[up_id]['vids'].append(vid)

最后把对比结果打印出来,有更新则进行微信消息推送即可

for up_id in self.up_ids:
    if len(ups_recorder[up_id]['updated_vids']) > 0:
        msg = f'你关注的UP主{ups_recorder[up_id]["username"]}更新啦...'
        self.pushwechat(msg)
        self.logging(msg)
        for vid in ups_recorder[up_id]['updated_vids']:
            os.system(f'videodl -i {vid} -s {ups_recorder[up_id]["username"]}')
    else:
        msg = f'你关注的UP主{ups_recorder[up_id]["username"]}暂时没有更新...'
        self.logging(msg)

大功告成啦,完整源代码详见相关文件~

效果展示

运行方式如下:

usage: bilibiliupmonitor.py [-h] [--ids IDS] [--key KEY]

B站UP主监控

optional arguments:
  -h, --help  show this help message and exit
  --ids IDS   监控的UP主ID, 例如"406756145,406756146"
  --key KEY   Server酱的Key

例如:

python bilibiliupmonitor.py -ids 406756145

效果如下:视频链接

加载全部内容

相关教程
猜你喜欢
用户评论