脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - Python实现B站UP主自动监控功能详解

Python实现B站UP主自动监控功能详解

2022-10-29 12:14Charles的皮卡丘 Python

众所周知,B站有很多有趣的UP主,可以教大家一些"实用"的知识,但是他们一般都没有固定的更新时间。因此,本文将用Python编写一个脚本,自动监控UP是否更新了视频,感兴趣的可以了解一下

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

Python实现B站UP主自动监控功能详解

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

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

开发工具

Python版本:3.7.8

相关模块:

DecryptLogin模块;

videofetch模块;

以及一些python自带的模块。

环境搭建

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

原理简介

1.确定小目标

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

2.模拟登录

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

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

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

?
1
2
3
4
from DecryptLogin import login
 
lg = login.Login()
infos_return, session = lg.bilibili(mode='scanqr')

3.自动关注

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

Python实现B站UP主自动监控功能详解

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

Python实现B站UP主自动监控功能详解

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

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

act: 固定值, 为1;

re_src: 固定值, 为11;

jsonp: 固定值, 为jsonp;

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

代码实现如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
'''关注某个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主当前首页的作品信息:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'''获得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

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

?
1
2
3
4
5
6
7
8
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)

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

?
1
2
3
4
5
6
7
8
9
10
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)

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

效果展示

运行方式如下:

?
1
2
3
4
5
6
7
8
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

例如:

?
1
python bilibiliupmonitor.py -ids 406756145

效果如下:视频链接

到此这篇关于Python实现B站UP主自动监控功能详解的文章就介绍到这了,更多相关PythonB站监控内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://mp.weixin.qq.com/s/KjJLPcqHecK8T8LDVesxJQ

延伸 · 阅读

精彩推荐
  • Python定制FileField中的上传文件名称实例

    定制FileField中的上传文件名称实例

    下面小编就为大家带来一篇定制FileField中的上传文件名称实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    linxiyue3852020-12-03
  • Python什么是Keras

    什么是Keras

    今天开始读一本关于Keras的深度学习书籍,计划每天记录一些所得。直奔主题,既然要学Keras,那什么是Keras,Keras和其他机器学习、深度学习库有什么区别...

    qq_416299767452020-07-09
  • Pythonpython Pandas 读取txt表格的实例

    python Pandas 读取txt表格的实例

    下面小编就为大家分享一篇python Pandas 读取txt表格的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    bazingaedward11872021-02-07
  • Python利用python修改json文件的value方法

    利用python修改json文件的value方法

    今天小编就为大家分享一篇利用python修改json文件的value方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    cabinx16802021-05-10
  • Python一文带你了解Python列表生成式应用的八重境界

    一文带你了解Python列表生成式应用的八重境界

    在Python中有非常多且好用的技巧,其中使用最多的是列表生成式,往往可以将复杂的逻辑用简单的语言来实现,本文重点介绍列表生成式应用的八重境界...

    赵卓不凡10132022-09-02
  • Python多快好省地使用pandas分析大型数据集

    多快好省地使用pandas分析大型数据集

    本文就将以真实数据集和运存16G的普通笔记本电脑为例,演示如何运用一系列策略实现多快好省地用pandas分析大型数据集。...

    Python大数据分析3082020-11-02
  • Python解决Keras TensorFlow 混编中 trainable=False设置无效问题

    解决Keras TensorFlow 混编中 trainable=False设置无效问题

    这篇文章主要介绍了解决Keras TensorFlow 混编中 trainable=False设置无效问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 ...

    芥末的无奈4722020-06-29
  • PythonPandas 同元素多列去重的实例

    Pandas 同元素多列去重的实例

    今天小编就为大家分享一篇Pandas 同元素多列去重的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    迪小子9402021-03-12