主要PYTHON代码
登录弹幕服务器,并发送TCP包和心跳包
class danmaku(object):
def __init__(self):
self.douyu_service_ip = ('117.148.167.219', 8601)
self.type_douyutoMe = 690
self.type_metoDouyu = 689
self.loginMsg_head = None
self.len = 0
self.head_len = 0
self.roomid = '3168536' #xdd
def login(self):
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.connect(self.douyu_service_ip)
print('Socket Connected to douyu_Danmaku')
content = 'type@=loginreq/username@=visitor4858/password@=12345678901/roomid@=' + self.roomid + '/\x00'
self.send_loginMSG(content)
try:
data = self.sock.recv(1024)
except socket.error:
print('login recv error')
print('recv data : ', data)
q = re.search(br'type@=(\w+)/', data)
print(q.group(1))
if q.group(1) == b'loginres':
print('登录成功')
content = 'type@=joingroup/rid@=' + self.roomid + '/gid@=-9999/\x00'
self.join_group(content)
print('建立弹幕链接')
threading.Thread(target=danmaku.keep_live, args=(self,)).start()
print('心跳机制启动')
def send_loginMSG(self, content):
content = content.encode('utf-8')
self.len = len(content) + 8
self.head_len = self.len
msg = self.len.to_bytes(4, byteorder='little') + self.head_len.to_bytes(4, byteorder='little') + self.type_metoDouyu.to_bytes(4, byteorder='little') + content
print('send login msg : ', msg)
try:
a = self.sock.sendall(msg)
if a is None:
print('send login msg success')
except socket.error:
print('field sen login msg : ', msg)
print('send fild')
exit(0)
def join_group(self, content):
content = content.encode('utf-8')
self.len = len(content) + 8
self.head_len = self.len
msg = self.len.to_bytes(4, byteorder='little') + self.head_len.to_bytes(4, byteorder='little') + self.type_metoDouyu.to_bytes(4, byteorder='little') + content
try:
print('join group msg : ', msg)
self.sock.sendall(msg)
print('send join group msg success')
except socket.error:
print(msg)
print('join fild')
exit(0)
def keep_live(self):
while True:
content = 'type@=keeplive/tick@=' + str(int(time.time())) + '/\x00'
content = content.encode('utf-8')
self.len = len(content) + 8
self.head_len = self.len
msg = self.len.to_bytes(4, byteorder='little') + self.head_len.to_bytes(4, byteorder='little') + self.type_douyutoMe.to_bytes(4, byteorder='little') + content
self.sock.sendall(msg)
print('心跳包发送成功')
time.sleep(40)
处理网络原因引起的粘包
class ReCheck(object):
def check_data(self, data):
return data if data is not None else '0'
def splite_data(self, data):
result = []
i = 0
total = len(data)
while len(data):
length = int.from_bytes(data[i:i+4], byteorder='little')
temp = data[i+4:length+4]
result.append(temp)
data = data[length+4:total]
return result
最终得到
chatmsg 弹幕评论信息表
gift 弹幕礼物表
spbc 全频道礼物表
user 用户信息表