鬥魚彈幕資料爬取

六奇發表於2018-12-08

鬥魚彈幕資料抓取

主要參考鬥魚的文件 dev-bbs.douyutv.com/forum.php?m…

鬥魚彈幕資料爬取

建立連線

通過socket與彈幕伺服器建立連線

第三方接入彈幕伺服器列表:
IP 地址: openbarrage.douyutv.com 埠: 8601
複製程式碼

傳送訊息

協議組成

鬥魚彈幕資料爬取

訊息長度: 4 位元組小端整數,表示整條訊息(包括自身)長度(位元組數)。訊息長度出現兩遍,二者相同

訊息型別: 2 位元組小端整數, 表示訊息型別。取值如下: 689 客戶端傳送給彈幕伺服器的文字格式資料 690 彈幕伺服器傳送給客戶端的文字格式資料

加密欄位: 暫時未用,預設為 0。 保留欄位: 暫時未用,預設為 0。

資料部分:鬥魚獨創序列化文字資料,結尾必須為‘\0’。

msg是要傳送的資料部分,實際是要加上長度4頭部4+4個位元組長度的,也就是12個但是實際發出去的時候會自動加4個,所以+8

msg = msg.encode()
code = 689 # 客戶端傳送給彈幕伺服器
msg_length = len(msg) + 8  # 加 8 就行 不行換12
head = struct.pack('i',msg_length) + struct.pack('i',msg_length) + struct.pack('i',code)
self.socket.sendall(head+msg)
複製程式碼

登入

登入彈幕伺服器,不需要輸入使用者名稱和密碼,應該是和遊客模式一樣

login = f"type@=loginreq/roomid@={self.room_id}/\x00"
複製程式碼

加入彈幕組

預設加入彈幕組-9999,海量彈幕組

joingroup = f"type@=joingroup/rid@={self.room_id}/gid@=-9999/\x00"
複製程式碼

心跳訊息

保持於彈幕伺服器的連線 每隔45秒傳送心跳資訊

msg = f"type@=keeplive/tick@={t}/\x00"
複製程式碼

解析訊息

正則匹配返回的內容,然後轉成Python物件,其中會存在不能轉為utf-8的表情符號UnicodeDecodeError: 'utf-8' codec can't decode byte 0xed in position 75: invalid continuation byte 忽略這個錯誤

content_obj = {}
# print(content)
content = content.decode(errors='replace').strip()
tmp_kv_list = content.split('/')
for kv in tmp_kv_list:
    kv = kv.strip()
    if len(kv) == 0:
        continue
    kv = kv.split("@=")
    content_obj[kv[0]]=kv[1]
return content_obj
    
複製程式碼

之後可能會做

暫時就是為了好玩,沒有做持久化處理,之後可能會做

程式碼地址

douyu

相關文章