class DanmuClient

INFO 代表的是一些琐碎的操作 DEBUG

Constants

DANMU_PORT
DANMU_SERVER

Public Class Methods

new(room,auth_dst_ip,auth_dst_port) click to toggle source
# File lib/danmu/clients/danmu_client.rb, line 18
def initialize(room,auth_dst_ip,auth_dst_port)
  @room = room
  @room_id = room.room_id
  @auth_dst_ip = auth_dst_ip
  @auth_dst_port = auth_dst_port
  @dev_id = SecureRandom.uuid.to_s.gsub('-','').upcase 
end

Public Instance Methods

align_left_str(raw_str,max_length,filled_chr) click to toggle source
# File lib/danmu/clients/danmu_client.rb, line 204
def align_left_str(raw_str,max_length,filled_chr)
  my_length = 0
  for i in 0...raw_str.size
    if raw_str[i].ord > 127 || raw_str[i].ord <=0
      my_length += 1
    end
    my_length += 1
  end
  if (max_length - my_length) > 0
    raw_str + filled_chr * ( max_length - my_length )
  else
    raw_str
  end
end
do_keeplive() click to toggle source
# File lib/danmu/clients/danmu_client.rb, line 90
def do_keeplive
  Thread.new do
    loop do
      #puts "--> KeepAlive"
      send_keeplive_msg
      sleep 40
      @danmu_socket.write message("type@=keeplive/tick@=" + timestamp + "/")
    end
  end
end
do_login() click to toggle source
# File lib/danmu/clients/danmu_client.rb, line 45
def do_login
  @danmu_auth_socket = TCPSocket.new @auth_dst_ip,@auth_dst_port
  @danmu_socket = TCPSocket.new DANMU_SERVER,DANMU_PORT
  logger.info("初始化DAMMU_SOCKET和DANMU_AUTH_SOCKET")
  send_auth_loginreq_msg
  str = @danmu_auth_socket.recv(4000)
   #puts "<>1<><"+str
  if str.include? "live_stat@=0"
    @live_stat = "离线"
  elsif str.include? "live_stat@=1"
    @live_stat = "在线"
    @username= str[/\/username@=(.+)\/nickname/,1]
     #puts "----" + @username
    str = @danmu_auth_socket.recv(4000)
     #puts "<>2<><"+str
    @gid = str[/\/gid@=(\d+)\//,1]
    @weight = str[/\/weight@=(\d+)\//,1]
    @fans_count = str[/\/fans_count@=(\d+)\//,1]
    #puts "<->" + @live_stat.to_s + @weight.to_s + @fans_count.to_s
     #puts @gid + "----"
    send_qrl_msg
    str = @danmu_auth_socket.recv(4000)
     #puts "<>3<><"+str
    str = @danmu_auth_socket.recv(4000)
     #puts "<>4<><"+str
    send_keeplive_msg
    str = @danmu_auth_socket.recv(4000)
     #puts "<>5<><"+str
    data = "type@=loginreq/username@="+@username+"/password@=1234567890123456/roomid@=" + @room_id.to_s + "/"
    all_data = message(data)
    @danmu_socket.write all_data
    #puts all_data
    str = @danmu_socket.recv(4000)
     #puts str
    send_join_group_msg 
    logger.info("发送心跳包")
    do_keeplive
  end

end
do_main() click to toggle source
# File lib/danmu/clients/danmu_client.rb, line 30
def do_main
  logger.info("准备登陆认证")
  do_login
  print_room_status
  if @live_stat == "离线"
    logger.info("主播离线中,正在退出...")
    exit
  elsif
    logger.info("主播在线中,准备获取弹幕...")
    loop { get_danmu  }
  end

end
get_danmu() click to toggle source
# File lib/danmu/clients/danmu_client.rb, line 131
def get_danmu
  danmu_data = @danmu_socket.recv(4000).force_encoding("UTF-8")
  if not danmu_data.include? "type@="
    logger.info "非消息"
  elsif danmu_data.include? "type@=error"
    logger.info "弹幕认证超时"
  else
    #logger.info(danmu_data)
    #puts danmu_data
    type = danmu_data[danmu_data.index("type@=")..-3]
    str = type.gsub('@S','/').gsub('@A=',':').gsub('@=',':').encode("UTF-16be", :invalid=>:replace, :replace=>"?").encode('UTF-8')
    type = str[/type:(.+?)\//,1]
    #puts type
    if type == "chatmessage"
      type_zh = "弹幕"
      sender_id = str[/\/sender:(.+?)\//,1]
      nickname = str[/\/snick:(.+?)\//,1]
      content =  str[/\/content:(.+?)\//,1]
      strength = str[/\/strength:(.+?)\//,1]
      level = str[/\/level:(\d+?)\//,1]
      time  = Time.now.to_s
      puts "|" + type_zh + "| " + align_left_str(nickname,20," ") + align_left_str("<Lv:#{level}>",8," ") + align_left_str("(#{sender_id})",13," ") + align_left_str("[#{strength}]",10," ") + "@ #{time}: #{content} "
    elsif type == "userenter"
      type_zh = "入房"
      user_id = str[/\/:id:(.+?)\//,1]
      nickname = str[/\/nick:(.+?)\//,1]
      strength = str[/\/strength:(.+?)\//,1]
      time  = Time.now.to_s
      level = str[/\/level:(\d+)\//,1]
      puts "|" + type_zh + "| " + align_left_str(nickname,20," ") + align_left_str("<Lv:#{level}>",8," ") + align_left_str("(#{user_id})",13," ") + align_left_str("[#{strength}]",10," ") + "@ #{time}"
      #puts "|#{type_zh}| #{nickname}  <Lv:#{level}> (#{user_id}) [#{strength}] @ #{time}"
    elsif type == "dgn"
      type_zh = "未知"
      level = str[/\/level:(\d+?)\//,1]
      user_id = str[/\/sid:(.+?)\//,1]
      nickname = str[/\/src_ncnm:(.+?)\//,1]
      hits = str[/\/hits:(.+?)\//,1]
      time  = Time.now.to_s
      puts "|" + type_zh + "| " + align_left_str(nickname,20," ") + align_left_str("<Lv:#{level}>",8," ") + align_left_str("(#{user_id})",13," ") + align_left_str("[#{"Unknown"}]",10," ") + "@ #{time}: #{hits} hits "
      #puts "|#{type_zh}| #{nickname}  <Lv:#{level}> (#{user_id}) @ #{time}"
    end

  end
end
message(content) click to toggle source
# File lib/danmu/clients/danmu_client.rb, line 86
def message(content)
  Message.new(content).to_s
end
print_room_status() click to toggle source
recv() click to toggle source
# File lib/danmu/clients/danmu_client.rb, line 176
def recv
  @danmu_socket.recv(4000)
end
send_auth_loginreq_msg() click to toggle source
# File lib/danmu/clients/danmu_client.rb, line 106
def send_auth_loginreq_msg
    time = timestamp 
    vk = Digest::MD5.hexdigest(time + "7oE9nPEG9xXV69phU31FYCLUagKeYtsF" + @dev_id)
    data = "type@=loginreq/username@=/ct@=0/password@=/roomid@="+@room_id.to_s+"/devid@="+@dev_id + "/rt@="+timestamp+"/vk@="+vk+"/ver@=20150929/"
    msg = message(data)
    @danmu_auth_socket.write msg
end
send_join_group_msg() click to toggle source
# File lib/danmu/clients/danmu_client.rb, line 119
def send_join_group_msg
    data  = "type@=joingroup/rid@=" + @room_id.to_s + "/gid@="+@gid+"/"
    msg = message(data)
    @danmu_socket.write msg
end
send_keeplive_msg() click to toggle source
# File lib/danmu/clients/danmu_client.rb, line 101
def send_keeplive_msg
    data = "type@=keeplive/tick@=" + timestamp + "/vbw@=0/k@=19beba41da8ac2b4c7895a66cab81e23/"
    msg = message(data)
    @danmu_auth_socket.write msg
end
send_loginreq_msg() click to toggle source
# File lib/danmu/clients/danmu_client.rb, line 114
def send_loginreq_msg
    data = "type@=loginreq/username@="+@username+"/password@=1234567890123456/roomid@="+@room_id.to_s+"/"
    msg = message(data)
    @danmu_socket.write msg
end
send_qrl_msg() click to toggle source
# File lib/danmu/clients/danmu_client.rb, line 125
def send_qrl_msg
    data  = "type@=qrl/rid@=" + @room_id.to_s + "/"
    msg = message(data)
    @danmu_auth_socket.write msg
end
start() click to toggle source
# File lib/danmu/clients/danmu_client.rb, line 26
def start
  do_main
end
stop() click to toggle source
# File lib/danmu/clients/danmu_client.rb, line 180
def stop
  @danmu_socket.close
  @danmu_auth_socket.close
end
timestamp() click to toggle source
# File lib/danmu/clients/danmu_client.rb, line 185
def timestamp
  Time.now.to_i.to_s
end