1. 程式人生 > >Python專案2:彈幕復讀機

Python專案2:彈幕復讀機

目錄

這個專案是我從B站的一個up主那學到的(原視訊號269525280),感覺很是有趣,就是很欠打哈哈

一、功能

功能很簡單,就是將B站直播間的每條彈幕重新發送一遍。

二、思路

先通過post請求獲取實時彈幕,再用post請求重新發送。

三、實現

1. 獲取彈幕

(1)因為實時彈幕是通過Ajax從伺服器獲取的,我們開啟右擊頁面選擇檢查,進入Network,經過一番尋找後找到了msg這個請求,檢視其中的關鍵部分,請求url地址和表單部分,url在請求頭中,表單部分類似下圖: 其中,roomid是房間號,csrf_token是post請求的安全驗證碼,還有一個visit_id是空值,這些都要根據自己的實際情況填寫。 (2)然後我們檢視響應資訊:

是一個json字串,經過比對後可以知道最新的一條彈幕儲存在res.json()['data']['room'][-1]['text']中(res是requests響應體)。 (3)然後我們就可以根據這些資料,使用requests模組獲取彈幕,程式碼如下

import requests

form_data = {
    'roomid': '90713',
    'csrf_token': 'c93526e213231f715424af182dfb0411',
    'visit_id': ''
}

res = requests.post("https://api.live.bilibili.com/ajax/msg" ,data=form_data)
text = res.json()['data']['room'][-1]['text']

2. 傳送彈幕

(1)為了找到傳送彈幕的介面,我們只需要手動傳送一條,在Network中就一眼看到了: 這次需要關注的部分除了url和post表單外,還有一個cookie,這個鍵用來伺服器識別我們的瀏覽器的,如果沒有的話,即使傳送到伺服器彈幕也不會顯示。 (2)彈幕是儲存在表單中的msg鍵中傳送給伺服器的 (3)然後根據這些資料向第一部獲取的url傳送表單,程式碼如下:

form_data_send = {
    'color': '16777215',
    'fontsize': '25',
    'mode': '1',
    'msg': '要傳送的彈幕',
    'rnd': '1539592977',
    'roomid': '90713',
    'csrf_token': 'c93526e213231f715424af182dfb0411'
}
cookie = {
    'Cookie':'l=v; finger=edc6ecda; LIVE_BUVID=AUTO7915376845749539; CURRENT_FNVAL=8; sid=9xsee80j; DedeUserID=23126221; DedeUserID__ckMd5=e597ce186461e9d8; SESSDATA=27b96e94%2C1540276589%2C664ff578; bili_jct=c93526e213231f715424af182dfb0411; fts=1537684594; UM_distinctid=1660524dd947fc-05bc81e71e64fb-8383268-144000-1660524dd95107; im_notify_type_23126221=0; stardustvideo=1; buvid3=AE818E5D-B2C1-44F2-8F09-989661B9F8846688infoc; rpdid=owkkqwkwmxdoskqiokoww; bp_t_offset_23126221=174970628267807201; CURRENT_QUALITY=64; _dfcaptcha=3d138714e8941fa5ecd47cea30ef1917; Hm_lvt_8a6e55dbd2870f0f5bc9194cddf32a02=1538406126,1539591329; Hm_lpvt_8a6e55dbd2870f0f5bc9194cddf32a02=1539593348'
}
res = requests.post('https://api.live.bilibili.com/msg/send', cookies= cookie, data=form_data_send)

這其中大部分資料要以自己的實際修改(在自己的瀏覽器上覆制)

3. 封裝呼叫

(1)將獲取彈幕封裝成一個方法,返回彈幕文字; (2)將傳送彈幕也封裝,接收方法1獲取的彈幕文字為引數; (3)去重,在彈幕未重新整理時,阻止多次傳送同一條彈幕。 所以最終程式碼如下:

import requests

form_data = {
    'roomid': '90713',
    'csrf_token': 'c93526e213231f715424af182dfb0411',
    'visit_id': ''
}

def get_message():
    res = requests.post("https://api.live.bilibili.com/ajax/msg" ,data=form_data)
    text = res.json()['data']['room'][-1]['text']
    return text


def send_message(msg):
    form_data_send = {
        'color': '16777215',
        'fontsize': '25',
        'mode': '1',
        'msg': msg,
        'rnd': '1539592977',
        'roomid': '90713',
        'csrf_token': 'c93526e213231f715424af182dfb0411'
    }
    cookie = {
        'Cookie':'l=v; finger=edc6ecda; LIVE_BUVID=AUTO7915376845749539; CURRENT_FNVAL=8; sid=9xsee80j; DedeUserID=23126221; DedeUserID__ckMd5=e597ce186461e9d8; SESSDATA=27b96e94%2C1540276589%2C664ff578; bili_jct=c93526e213231f715424af182dfb0411; fts=1537684594; UM_distinctid=1660524dd947fc-05bc81e71e64fb-8383268-144000-1660524dd95107; im_notify_type_23126221=0; stardustvideo=1; buvid3=AE818E5D-B2C1-44F2-8F09-989661B9F8846688infoc; rpdid=owkkqwkwmxdoskqiokoww; bp_t_offset_23126221=174970628267807201; CURRENT_QUALITY=64; _dfcaptcha=3d138714e8941fa5ecd47cea30ef1917; Hm_lvt_8a6e55dbd2870f0f5bc9194cddf32a02=1538406126,1539591329; Hm_lpvt_8a6e55dbd2870f0f5bc9194cddf32a02=1539593348'
    }
    res = requests.post('https://api.live.bilibili.com/msg/send', cookies= cookie, data=form_data_send)

s = ''

while True:
    msg = get_message()

    if s == msg:
        continue
    else:
        print('已傳送彈幕:', msg)
        send_message(msg)
        s = msg

注意:表單資料要以自己的為準

建議再多加一些延遲和隨機辦法,不然太招仇恨會被舉報的……哭