首頁 > 軟體

基於Python編寫一個B站全自動抽獎的小程式

2022-03-16 13:01:11

導語

應好友邀請,幫他寫了個小程式,功能類似於實時監控自己關注的UP主,如果關注的UP主中有人釋出了抽獎的動態,就自動參與這個抽獎。這樣就能不錯過任何一個可以暴富的機會了。寫完之後感覺這個想法還是挺有意思的,於是上來分享一波。

廢話不多說,讓我們愉快地開始吧~

開發工具

Python版本:3.7.8

相關模組:

DecryptLogin模組;

以及一些python自帶的模組。

環境搭建

安裝Python並新增到環境變數,pip安裝需要的相關模組即可。

原理簡介

我們主要用到的工具是公眾號前幾天剛釋出的DecryptLogin包

首先,我們需要用它來模擬登入B站,具體而言,需要先pip安裝一下:

pip install DecryptLogin

然後利用Client類來實現模擬登入,該類可以儲存當前的登入對談,在該對談沒過期之前再次執行程式是不需要重複傳送登入請求的,可以避免因為頻繁登入賬號而觸發網站的風控機制:

from DecryptLogin import login

client = login.Client()
bili = client.bilibili(reload_history=True)
infos_return, session = bili.login(self.username, '微信公眾號: Charles的皮卡丘', 'scanqr')

接著,我們來抓包看看抓取自己的關注列表要請求哪個API吧,具體而言,如下圖所示:

程式碼簡單實現如下:

'''獲得關注列表'''
def getfollowings(self, session, infos_return):
    url = 'https://api.bilibili.com/x/relation/followings'
    params = {
        'vmid': infos_return['data']['mid'],
        'pn': '1',
        'ps': '20',
        'order': 'desc',
        'order_type': 'attention',
        'jsonp': 'jsonp',
    }
    response = session.get(url, params=params, headers=self.headers)
    total = response.json()['data']['total']
    followings_ids, page = [], 1
    while True:
        for item in response.json()['data']['list']:
            followings_ids.append(item['mid'])
        if len(followings_ids) >= total: break
        page += 1
        params['pn'] = str(page)
        response = session.get(url, params=params, headers=self.headers)
    return followings_ids

類似地,我們可以獲得我們關注的UP主的當前所有動態的介面如下:

'''獲得UP主的動態'''
def getupdates(self, infos_return, host_uid, session):
    url = f'https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/space_history?visitor_uid={infos_return["data"]["mid"]}&host_uid={host_uid}&offset_dynamic_id=0&need_top=1&platform=web'
    response = session.get(url, headers=self.headers)
    response_json, updates = response.json(), {}
    for card in response_json['data']['cards']:
        dynamic_id = card['desc']['dynamic_id']
        desp = re.findall(r'"description":"(.*?)"', card['card'])[0]
        updates[dynamic_id] = desp
    return updates

轉發動態的介面如下:

'''轉發動態'''
def forwardupdate(self, session, infos_return, dynamic_id):
    url = 'http://api.vc.bilibili.com/dynamic_repost/v1/dynamic_repost/repost'
    data = {
        'uid': infos_return['data']['mid'],
        'dynamic_id': dynamic_id,
        'content' : random.choice(self.comments),
        'ctrl': '[{"data":"5581898","location":2,"length":4,"type":1},{"data":"10462362","location":7,"length":5,"type":1},{"data":"1577804","location":13,"length":4,"type":1}]',
        'csrf_token': session.cookies.get('bili_jct')
    }
    response = session.post(url, data=data, headers=self.headers)
    return response.json()

接下來要做的就是如何判斷這個動態是不是抽獎動態了,這裡我們設定利用關鍵詞作為判斷依據:

# 監控新的動態
self.logging('開始監控是否有新的抽獎資訊釋出')
while True:
    time.sleep(self.time_interval)
    self.logging('開始檢測是否有新的抽獎資訊釋出')
    for userid in tqdm(followings_ids):
        updates_old = followings_infos.pop(userid)
        updates_latest = self.getupdates(infos_return, userid, session)
        for dynamic_id in updates_latest.keys():
            if dynamic_id not in updates_old:
                desp = updates_latest[dynamic_id]
                if '#互動抽取#' in desp:
                    result = self.forwardupdate(session, infos_return, dynamic_id)
                    self.logging('檢測到有新的抽獎資訊釋出, 已經嘗試轉發, 返回的結果為{result}')
        followings_infos[userid] = updates_latest

即當動態中有#互動抽取#這四個字的時候,我們就認定這是一條抽獎用的動態,並對其進行轉發。至此,我們的小程式就完成啦,它可以實時監控我們關注的UP主是否有釋出新的抽獎資訊,如果有,則第一時間參與這個抽獎。我們需要做的就是多關注一些經常釋出抽獎資訊的UP主就行了,接下來能不能暴富就看運氣了。

最終程式碼的使用方式如下:

usage: bilibililottery.py [-h] [--username USERNAME]
                          [--time_interval TIME_INTERVAL]

B站監控關注的UP主並自動轉發抽獎

optional arguments:
  -h, --help            show this help message and exit
  --username USERNAME   用於儲存歷史cookies的唯一標識ID
  --time_interval TIME_INTERVAL
                        查詢UP主的動態的間隔時間

到此這篇關於基於Python編寫一個B站全自動抽獎的小程式的文章就介紹到這了,更多相關Python自動抽獎內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com