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

 更新时间:2022年03月10日 09:39:26   作者:Charles的皮卡丘  
众所周知,B站有很多有趣的UP主,可以教大家一些"实用"的知识,但是他们一般都没有固定的更新时间。因此,本文将用Python编写一个脚本,自动监控UP是否更新了视频,感兴趣的可以了解一下

众所周知,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

效果如下:视频链接

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

相关文章

  • python异步编程之asyncio低阶API的使用详解

    python异步编程之asyncio低阶API的使用详解

    asyncio中低阶API的种类很多,涉及到开发的5个方面,这篇文章主要为大家详细介绍了这些低阶API的具体使用,感兴趣的小伙伴可以学习一下
    2024-01-01
  • python爬虫项目设置一个中断重连的程序的实现

    python爬虫项目设置一个中断重连的程序的实现

    这篇文章主要介绍了python爬虫项目设置一个中断重连的程序的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • python leetcode 字符串相乘实例详解

    python leetcode 字符串相乘实例详解

    这篇文章主要介绍了python leetcode 字符串相乘的示例代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-09-09
  • Python中实现三目运算的方法

    Python中实现三目运算的方法

    这篇文章主要介绍了Python中实现三目运算的方法,本文用and/or 运算符模拟实现三目运算,需要的朋友可以参考下
    2015-06-06
  • python输入错误密码用户锁定实现方法

    python输入错误密码用户锁定实现方法

    这篇文章主要介绍了python输入错误密码用户锁定实现方法以及代码实现过程,一起参考一下。
    2017-11-11
  • 网站渗透常用Python小脚本查询同ip网站

    网站渗透常用Python小脚本查询同ip网站

    这篇文章主要介绍了网站渗透常用Python小脚本查询同ip网站,需要的朋友可以参考下
    2017-05-05
  • 分享6个好用到爆的Pycharm插件

    分享6个好用到爆的Pycharm插件

    这篇文章主要介绍了分享6个好用到爆的Pycharm插件,在安装上之后,我们的编程效率、工作效率都能够得到极大地提升,下面分享的内容,需要的小伙伴可以参考一下
    2022-02-02
  • Spring Cloud Feign高级应用实例详解

    Spring Cloud Feign高级应用实例详解

    这篇文章主要介绍了Spring Cloud Feign高级应用实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Python中NumPy数组的维度变换解析

    Python中NumPy数组的维度变换解析

    这篇文章主要介绍了Python中NumPy数组的维度变换解析,就像我们可以通过向 NumPy 提供列表列表来创建 2D 数组一样,我们可以通过创建列表的列表的列表来创建 3D 数组,需要的朋友可以参考下
    2023-09-09
  • 使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)

    使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)

    今天小编就为大家分享一篇使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01

最新评论