Python實現(xiàn)B站UP主自動監(jiān)控功能詳解
眾所周知,B站有很多有趣的UP主,可以教大家一些"實用"的知識:

但是他們一般都沒有固定的更新時間,那么如何才能第一時間知道自己又有新的飯點可以看的下飯素材呢?當然是用python來寫個腳本自動監(jiān)控UP是否更新了視頻,并自動下載啦~
廢話不多說,讓我們愉快地開始吧~
開發(fā)工具
Python版本:3.7.8
相關模塊:
DecryptLogin模塊;
videofetch模塊;
以及一些python自帶的模塊。
環(huán)境搭建
安裝Python并添加到環(huán)境變量,pip安裝需要的相關模塊即可。
原理簡介
1.確定小目標
首先,確定一下我們想實現(xiàn)的腳本的功能:給定一些UP主的ID,我們自動關注這些UP主,并開始監(jiān)控這些UP主是否有更新視頻,如果有則微信進行通知并自動下載這些視頻。
2.模擬登錄
既然要實現(xiàn)自動關注功能當然還是要先實現(xiàn)B站的模擬登錄啦,這里我們還是借助公眾號之前開源的DecryptLogin包,先安裝一下:
# 請確保自己使用的是最新版本的DecryptLogin pip install DecryptLogin --upgrade
然后簡單寫幾行代碼就ok啦:
from DecryptLogin import login lg = login.Login() infos_return, session = lg.bilibili(mode='scanqr')
3.自動關注
我們先來抓包看看關注UP主時需要請求的接口吧,簡單調試之后發(fā)現(xiàn)以下這個鏈接不管從名字還有從需要攜帶的參數(shù)看都很可疑:

于是,我們可以先寫個腳本測試一下我們的想法,可以看到請求這個接口需要攜帶的參數(shù)如下:

經(jīng)過測試,必須要攜帶的參數(shù)是這些:
fid: 想要關注的UP主的ID;
act: 固定值, 為1;
re_src: 固定值, 為11;
jsonp: 固定值, 為jsonp;
csrf: 從登錄的cookies中可以拿到。
代碼實現(xiàn)如下:
'''關注某個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', '')測試之后登錄客戶端看發(fā)現(xiàn)確實可以成功關注對應的UP主,于是這部分內(nèi)容也順利地完成啦~
4.實時監(jiān)控
實時監(jiān)控其實也很簡單,只需要先把目標UP主當前首頁的作品信息獲取到,然后每隔一段時間對比一次,看看有沒有新的作品出現(xiàn)就行啦。
具體而言,我們需要先獲取到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主監(jiān)控 optional arguments: -h, --help show this help message and exit --ids IDS 監(jiān)控的UP主ID, 例如"406756145,406756146" --key KEY Server醬的Key
例如:
python bilibiliupmonitor.py -ids 406756145
效果如下:視頻鏈接
到此這篇關于Python實現(xiàn)B站UP主自動監(jiān)控功能詳解的文章就介紹到這了,更多相關PythonB站監(jiān)控內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python異步編程之a(chǎn)syncio低階API的使用詳解
asyncio中低階API的種類很多,涉及到開發(fā)的5個方面,這篇文章主要為大家詳細介紹了這些低階API的具體使用,感興趣的小伙伴可以學習一下2024-01-01
python爬蟲項目設置一個中斷重連的程序的實現(xiàn)
這篇文章主要介紹了python爬蟲項目設置一個中斷重連的程序的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-07-07
網(wǎng)站滲透常用Python小腳本查詢同ip網(wǎng)站
這篇文章主要介紹了網(wǎng)站滲透常用Python小腳本查詢同ip網(wǎng)站,需要的朋友可以參考下2017-05-05
使用pytorch搭建AlexNet操作(微調預訓練模型及手動搭建)
今天小編就為大家分享一篇使用pytorch搭建AlexNet操作(微調預訓練模型及手動搭建),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01

