抓取斗鱼直播弹幕

主要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 用户信息表

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值