Python實(shí)現(xiàn)B站UP主自動(dòng)監(jiān)控功能詳解
眾所周知,B站有很多有趣的UP主,可以教大家一些"實(shí)用"的知識(shí):
但是他們一般都沒有固定的更新時(shí)間,那么如何才能第一時(shí)間知道自己又有新的飯點(diǎn)可以看的下飯素材呢?當(dāng)然是用python來(lái)寫個(gè)腳本自動(dòng)監(jiān)控UP是否更新了視頻,并自動(dòng)下載啦~
廢話不多說(shuō),讓我們愉快地開始吧~
開發(fā)工具
Python版本:3.7.8
相關(guān)模塊:
DecryptLogin模塊;
videofetch模塊;
以及一些python自帶的模塊。
環(huán)境搭建
安裝Python并添加到環(huán)境變量,pip安裝需要的相關(guān)模塊即可。
原理簡(jiǎn)介
1.確定小目標(biāo)
首先,確定一下我們想實(shí)現(xiàn)的腳本的功能:給定一些UP主的ID,我們自動(dòng)關(guān)注這些UP主,并開始監(jiān)控這些UP主是否有更新視頻,如果有則微信進(jìn)行通知并自動(dòng)下載這些視頻。
2.模擬登錄
既然要實(shí)現(xiàn)自動(dòng)關(guān)注功能當(dāng)然還是要先實(shí)現(xiàn)B站的模擬登錄啦,這里我們還是借助公眾號(hào)之前開源的DecryptLogin包,先安裝一下:
# 請(qǐng)確保自己使用的是最新版本的DecryptLogin pip install DecryptLogin --upgrade
然后簡(jiǎn)單寫幾行代碼就ok啦:
from DecryptLogin import login lg = login.Login() infos_return, session = lg.bilibili(mode='scanqr')
3.自動(dòng)關(guān)注
我們先來(lái)抓包看看關(guān)注UP主時(shí)需要請(qǐng)求的接口吧,簡(jiǎn)單調(diào)試之后發(fā)現(xiàn)以下這個(gè)鏈接不管從名字還有從需要攜帶的參數(shù)看都很可疑:
于是,我們可以先寫個(gè)腳本測(cè)試一下我們的想法,可以看到請(qǐng)求這個(gè)接口需要攜帶的參數(shù)如下:
經(jīng)過(guò)測(cè)試,必須要攜帶的參數(shù)是這些:
fid: 想要關(guān)注的UP主的ID;
act: 固定值, 為1;
re_src: 固定值, 為11;
jsonp: 固定值, 為jsonp;
csrf: 從登錄的cookies中可以拿到。
代碼實(shí)現(xiàn)如下:
'''關(guān)注某個(gè)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', '')
測(cè)試之后登錄客戶端看發(fā)現(xiàn)確實(shí)可以成功關(guān)注對(duì)應(yīng)的UP主,于是這部分內(nèi)容也順利地完成啦~
4.實(shí)時(shí)監(jiān)控
實(shí)時(shí)監(jiān)控其實(shí)也很簡(jiǎn)單,只需要先把目標(biāo)UP主當(dāng)前首頁(yè)的作品信息獲取到,然后每隔一段時(shí)間對(duì)比一次,看看有沒有新的作品出現(xiàn)就行啦。
具體而言,我們需要先獲取到UP主當(dāng)前首頁(yè)的作品信息:
'''獲得UP主首頁(yè)所有視頻信息''' 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
然后每隔一段時(shí)間對(duì)比一下就行:
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)
最后把對(duì)比結(jié)果打印出來(lái),有更新則進(jìn)行微信消息推送即可
for up_id in self.up_ids: if len(ups_recorder[up_id]['updated_vids']) > 0: msg = f'你關(guān)注的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'你關(guān)注的UP主{ups_recorder[up_id]["username"]}暫時(shí)沒有更新...' self.logging(msg)
大功告成啦,完整源代碼詳見相關(guān)文件~
效果展示
運(yùn)行方式如下:
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
效果如下:視頻鏈接
到此這篇關(guān)于Python實(shí)現(xiàn)B站UP主自動(dòng)監(jiān)控功能詳解的文章就介紹到這了,更多相關(guān)PythonB站監(jiān)控內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python異步編程之a(chǎn)syncio低階API的使用詳解
asyncio中低階API的種類很多,涉及到開發(fā)的5個(gè)方面,這篇文章主要為大家詳細(xì)介紹了這些低階API的具體使用,感興趣的小伙伴可以學(xué)習(xí)一下2024-01-01python爬蟲項(xiàng)目設(shè)置一個(gè)中斷重連的程序的實(shí)現(xiàn)
這篇文章主要介紹了python爬蟲項(xiàng)目設(shè)置一個(gè)中斷重連的程序的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07python leetcode 字符串相乘實(shí)例詳解
這篇文章主要介紹了python leetcode 字符串相乘的示例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09Python中實(shí)現(xiàn)三目運(yùn)算的方法
這篇文章主要介紹了Python中實(shí)現(xiàn)三目運(yùn)算的方法,本文用and/or 運(yùn)算符模擬實(shí)現(xiàn)三目運(yùn)算,需要的朋友可以參考下2015-06-06python輸入錯(cuò)誤密碼用戶鎖定實(shí)現(xiàn)方法
這篇文章主要介紹了python輸入錯(cuò)誤密碼用戶鎖定實(shí)現(xiàn)方法以及代碼實(shí)現(xiàn)過(guò)程,一起參考一下。2017-11-11網(wǎng)站滲透常用Python小腳本查詢同ip網(wǎng)站
這篇文章主要介紹了網(wǎng)站滲透常用Python小腳本查詢同ip網(wǎng)站,需要的朋友可以參考下2017-05-05Spring Cloud Feign高級(jí)應(yīng)用實(shí)例詳解
這篇文章主要介紹了Spring Cloud Feign高級(jí)應(yīng)用實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12使用pytorch搭建AlexNet操作(微調(diào)預(yù)訓(xùn)練模型及手動(dòng)搭建)
今天小編就為大家分享一篇使用pytorch搭建AlexNet操作(微調(diào)預(yù)訓(xùn)練模型及手動(dòng)搭建),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01