Python實現B站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站監控內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: