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
注意:表單資料要以自己的為準
建議再多加一些延遲和隨機辦法,不然太招仇恨會被舉報的……哭