鬥魚彈幕資料抓取
主要參考鬥魚的文件 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
複製程式碼
之後可能會做
暫時就是為了好玩,沒有做持久化處理,之後可能會做