Сканирование данных Douyu Barrage

рептилия

Сбор данных заграждения Douyu

В основном обратитесь к документации DouyuDev - не совсем. Оба с TV.com/forum.PHP? Нет…

установить соединение

Установить соединение с сервером заграждения через сокет

第三方接入弹幕服务器列表:
IP 地址: openbarrage.douyutv.com 端口: 8601

отправлять сообщения

Состав протокола

длина сообщения: 4-байтовое целое число с прямым порядком байтов, указывающее длину (в байтах) всего сообщения (включая его самого). Длина сообщения появляется дважды, оба одинаковы

тип сообщения: 2-байтовое целое число с прямым порядком байтов, указывающее тип сообщения. Значения следующие: 689 Данные в текстовом формате, отправленные клиентом на сервер пули чата 690 Данные в текстовом формате, отправленные сервером пули чата клиенту

зашифрованное поле: Пока не используется, по умолчанию 0.зарезервированный текст: Пока не используется, по умолчанию 0.

часть данных: исходные сериализованные текстовые данные Douyu, конец должен быть '\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"

сердцебиение сообщение

Сохраняйте соединение с сервером Barrage и отправляйте информацию о сердцебиении каждые 45 секунд.

msg = f"type@=keeplive/tick@={t}/\x00"

Разобрать сообщение

Регулярно сопоставляет возвращаемый контент, а затем преобразует его в объект Python, в котором будут эмодзи, которые нельзя преобразовать в utf-8UnicodeDecodeError: '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