在網上找到了乙份鬥魚彈幕伺服器第三方接入協議v1.6.2,有了第三方介面,做起來就容易多了。
鬥魚後台協議頭設計如下:
這裡的訊息長度是我們傳送的資料部分的長度和頭部的長度之和,兩個訊息長度是一樣。然後要注意的是該協議使用的是小端整數,所以我們要對資料進行處理後再傳送,這裡可以使用int.to_bytes()將整數轉變成小端整數的形式。示例如下:
int.to_bytes(12,4,'little') # b'\x0c\x00\x00\x00'然後訊息型別是689(689表示客戶端傳送給伺服器,690表示伺服器傳送給客戶端),加密欄位和保留字段都是預設為0。這裡由於訊息型別是兩個位元組的,加密欄位和保留字段都是乙個位元組,但是因為加密欄位和保留字段都是0,所以這四個位元組可以使用int.to_bytes(689,4,'little')來表示。最後該協議使用的是utf-8編碼,所以我們需要對整個資料進行編碼後再傳送。int.to_bytes(12,4,'big') # b'\x00\x00\x00\x0c'
第三方客戶端通過 tcp 協議連線到彈幕伺服器(依據指定的 ip 和埠),其中ip 位址為openbarrage.douyutv.com,埠為8601,
客戶端向彈幕伺服器傳送登入請求,登入彈幕伺服器,格式如下:client = socket.socket(socket.af_inet, socket.sock_stream)host = socket.gethostbyname("openbarrage.douyutv.com")
port = 8601
client.connect((host, port))
type@=loginreq/roomid@=房間號/客戶端收到登入成功訊息後傳送進入彈幕分組請求給彈幕伺服器,格式如下:
type@=joingroup/rid@=房間號/gid@=-9999/gid表示分組號,第三方平台建議選擇-9999即海量彈幕模式。
接收伺服器傳送的廣播訊息,包括使用者發的彈幕和送的禮物資訊,然後解析得到具體的內容。
但這些資料裡只有禮物的id而沒有具體的禮物名稱,然後我通過抓包找到了兩個鏈結,裡面包含了禮物id和名稱的對應關係,相關**如下:
1 gift_dict ={}客戶端每隔45秒給伺服器傳送一次心跳訊息,用於維護和伺服器後台間的聯絡,格式如下:2 headers =
5 url1 = "
"6 res1 = requests.get(url1, headers=headers)
7 js1 = json.loads(res1.text.lstrip('
dyconfigcallback(
').rstrip(');'
))8 gift_data1 = js1['
data
']['
flashconfig']
9 for i in
gift_data1.keys():
10 gift_dict[gift_data1[i]['
id']] = gift_data1[i]['
name']
1112 url2 = "
"13 res2 = requests.get(url2, headers=headers)
14 js2 = json.loads(res2.text.lstrip('
dyconfigcallback(
').rstrip(');'
))15 gift_data2 = js2['
data']
16for i in
gift_data2.keys():
17 gift_dict[int(i)] = gift_data2[i]['
name
']
在傳送資料的時候,有可能會出現一次無法傳送完的情況,所以就需要多傳送幾次,確保把資料都傳送出去:keep_msg = "type@=keeplive/tick@=十位時間戳" # 舊版心跳訊息keep_msg = "mrkl/" # 新版心跳訊息
1 msg = msg + '\0'執行截圖:#資料以'\0'結尾
2 msg = msg.encode('
utf-8
') #
使用utf-8編碼
3 length = len(msg) + 8 #
訊息長度
4 code = 689 #
訊息型別5#
訊息頭部:訊息長度+訊息長度+訊息型別+加密字段(預設為0)+保留字段(預設為0)
6 head = int.to_bytes(length, 4, '
little
') + int.to_bytes(length, 4, '
little
') + int.to_bytes(code, 4, '
little')
7#傳送頭部部分
8client.send(head)9#
傳送資料部分
10 sent =0
11while sent
12 n = client.send(msg[sent:]) #
返回已傳送的資料長度
13 sent = sent + n
進入資料庫檢視結果:
db.getcollection('douyu-6039226').find()結果如下:
結果如下:
完整**已上傳到github!
python 爬蟲 b站彈幕爬蟲
coding utf 8 獲取bilibili直播間彈幕 房間號從網頁源 中獲取 開啟直播畫面後,按ctrl u 開啟網頁源 按ctrl f 搜尋 room id 搜到的 room id 1016中,1016就是房間號 獲取不 間的彈幕 修改 第26行的roomid的值為對應的房間號 import ...
python3 爬蟲入門
這裡爬取貓眼電影 top100 榜的資訊,作為學習的第乙個demo。今天開始接觸的python,從爬蟲開始。語言相對來說比較簡單,環境配置到是花了不少時間。有個要注意的點是在引入beautifursoup庫的時候會報錯,因為3.x的庫需要引入的是beautifursoup4.到這一步環境配置基本上o...
python3爬蟲入門
pip install requests2 匯入requests import requests 3 requests方法 requests.get 獲取html網頁的主要方法,對應http的get4 獲取流程 url 使用get方法獲取資料,返回包含網頁資料的response響應,超時時間測試 r...