Сбор данных заграждения 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
может сделать позже
Пока просто по приколу, никакой настойчивости не делается, может позже