代码拉取完成,页面将自动刷新
同步操作将从 CaiLibra/Danmuku_Python 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
import socket
import struct
import random
import time
import threading
import util
class CommentClient(object):
def __init__(self):
self.__CID_INFO_URL = "http://live.bilibili.com/api/player?id=cid:"
self.__DEFAULT_COMMENT_HOST = "livecmt-1.bilibili.com"
self.__DEFAULT_COMMENT_PORT = 788
self.__PROTOCOL_VERSION = 1
self.__SOCKET_RECV_BUFFER_LENGTH = 1024
self.__connected = False
self.__beat_thread = None
self.__loop_count = -1
def __get_socket_server_url(self, roomid):
cid_info_xml = str(util.http_get(self.__CID_INFO_URL + roomid))
start = cid_info_xml.find("<server>") + len("<server>")
end = cid_info_xml.find("</server>", start)
if 0 < start < end:
socket_server_url = cid_info_xml[start:end]
return socket_server_url
else:
return None
@staticmethod
def __send_socket_data(sock, total_len, head_len, version, action, param5=1, data=b''):
send_data = struct.pack("!IHHII" + str(len(data)) + "s", total_len, head_len, version, action, param5, data)
try:
sock.send(send_data)
# response_data = sock.recv(self.__SOCKET_RECV_BUFFER_LENGTH)
return True
except socket.error:
return False
def __send_join_room_msg(self, sock, roomid):
userid = 100000000000000 + int(200000000000000 * random.random())
body = ('{"roomid": ' + roomid + ', "uid": ' + str(userid) + '}').encode("utf-8")
return self.__send_socket_data(sock, 16 + len(body), 16, self.__PROTOCOL_VERSION, 7, 1, body)
def __send_heart_beat_msg(self, sock):
while self.__connected:
time.sleep(1)
self.__loop_count += 1
if self.__loop_count > 20 or self.__loop_count == 0:
self.__send_socket_data(sock, 16, 16, self.__PROTOCOL_VERSION, 2)
self.__loop_count = 0
sock.close()
print("与服务器的连接已关闭")
def connect(self, roomid):
real_roomid = util.get_real_roomid(roomid)
socket_server_url = self.__get_socket_server_url(real_roomid)
if socket_server_url is None:
socket_server_url = self.__DEFAULT_COMMENT_HOST
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((socket_server_url, self.__DEFAULT_COMMENT_PORT))
if self.__send_join_room_msg(sock, real_roomid) is True:
self.__connected = True
self.__beat_thread = threading.Thread(target=self.__send_heart_beat_msg, args=(sock,))
self.__beat_thread.start()
print("连接服务器成功!")
return sock
except socket.error:
print("连接服务器失败!")
return None
def disconnect(self, sock):
self.__connected = False
# if self.__beat_thread is not None:
# self.__beat_thread.exit()
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。