Py学习  »  Python

python实现B站UP主自动监控

Python绿色通道 • 4 年前 • 1098 次点击  

↑ 关注 + 星标 ,每天学Python新技能

后台回复【大礼包】送你Python自学大礼包


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

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

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

关注微信公众号"Charles的皮卡丘",公众号内回复"B站UP主监控"获取。

开发工具

Python版本:3.7.8

相关模块:

DecryptLogin模块;

videofetch模块;

以及一些python自带的模块。

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

1.确定小目标

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

2.模拟登录

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

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

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

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

3.自动关注

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

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

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

fid: 想要关注的UP主的ID;act: 固定值, 为1re_src: 固定值, 为11jsonp: 固定值, 为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

效果如下:


推荐阅读

  1. ”杀“疯了!有赞裁员:工牌堆满了一整大箱,半天时间一层楼人都空了!

  2. Python实现替换照片人物背景,精细到头发丝(附代码)

  3. 别再问我Python打包成exe了!(终极版)


您看此文用   分  秒,转发只需1秒

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/130064