ben7th / yuwan_counter

斗鱼直播间统计工具,用于数鱼丸和统计发言数
0 stars 0 forks source link

聊天记录存储的需求描述 #1

Open ben7th opened 9 years ago

ben7th commented 9 years ago

为了进一步对斗鱼直播的直播过程进行分析统计,需要对斗鱼直播的聊天信息进行持久化存储,并进行一定的分析统计。


斗鱼的聊天室对话,目前分为四种类型。分别如下:

  1. 普通对话信息。DOM结构如下

    <li class="jschartli chartli">
    <p class="text_cont">
     <span class="name">
       <a href="#" class="nick js_nick" rel="1320690">jeffery0523:</a>
     </span>
     <span class="text_cont">2cm是什么梗</span>
    </p>
    </li>

    针对普通对话信息,需要记录【发言者用户名】【发言内容】【发言时间】

  2. 到访欢迎信息。DOM结构如下

    <li class="jschartli">
    <p class="text_cont">
     <a style="color:#F00">系统提示</a>
     <a></a>
     :欢迎 
     <img src="http://staticlive.douyutv.com/common/douyu/images/classimg/user12.png">
     <a style="color:#F00" class="js_nick" rel="2425">兮诺</a>
     <a></a> 来到 <a style="color:#F00">炉石王师傅</a>的直播间
    </p>
    </li>

    针对到访欢迎信息,需要记录【到访人用户名】【到访人等级】【发言时间】

  3. 封禁广播信息。DOM结构如下

    <li class="jschartli">
    <p class="text_cont">
     <a style="color:#FF0000">系统广播: 群125200871丶180合击w9m5u被管理员禁言</a>
    </p>
    </li>
    <li class="jschartli"> 
    <p class="text_cont">
     <a style="color:#FF0000">系统广播: dengkenxie842被管理员珞晓沫禁言</a>
    </p>
    </li>

    针对封禁广播信息,需要记录【被封禁人用户名】【操作管理员用户名】【发言时间】

  4. 赠送鱼丸信息。DOM结构如下

    <li class="jschartli">
    <p class="text_cont">
     <img src="http://staticlive.douyutv.com/common/douyu/images/classimg/user4.png"> 
     <a href="#" class="nick js_nick" rel="3170929">HitMANooooo</a>
     赠送给主播<i>100</i>个鱼丸
     <img src="http://staticlive.douyutv.com/common/douyu/images/yw.png">
    </p>
    </li>

    针对赠送鱼丸信息,需要记录【赠送人用户名】【赠送人目前等级】【发言时间】,鱼丸数量目前只可能是100

以上所有信息,目前已经有很好的网页前端解析,设计持久化存储时,可以不必很照顾前端,按照更适合后台存储,更有利于后台程序编写和性能的方式去设计。


以下的粗体字部分是在分析需求,并设计实现方法时,需重点关注的点

目前采集斗鱼聊天室信息的方式是,开着网页并在网页中运行 js 脚本,js 脚本会对网页DOM做出分析,并提取对话内容。(这些目前都已经实现了)
现在需要设计一个持久化存储的服务,并给出调用方法,由 js 脚本调用,把对话信息按照规定的方式发给这个持久化存储的服务。

所以这个服务需要设计出持久化存储的方式,然后给出规定的调用方法(HTTP API)。由 js 脚本向其发送请求来记录斗鱼聊天室的聊天内容。

持久化记录聊天记录后,后续需要对其进行一定的分析统计。目前能想到的分析统计方式大概包含以下这些(需求分析时可以进一步补充)

设计持久化存储时,需要结合具体的统计形式进行考虑,以便于程序实现


其他发散:

目前要实现的聊天信息记录分析统计主要运用于斗鱼直播。如果能做到充分解耦的话,也可以设计出更为通用的针对更多来源的聊天记录的分析工具(如QQ群,微信群等)。因为所有的聊天记录分析统计是有一些共性的。

目前只是探讨这种可能性,暂时先不做过于多的通用性考虑。如果斗鱼这边做出来的统计形式效果好,我们再进一步尝试把它通用化。

fushang318 commented 9 years ago

模型设计

chat_lines
  room_id  # 房间号
  manager  # 管理员名字
  text     # 正文
  username # 发言者用户名
  userlevel# 发言者等级
  talk_time# 发言时间 DateTime 类型
  chat_type # chat | welcome | forbid | yuwan
welcome 类型需要的字段
  room_id  # 房间号
  username # 发言者用户名
  userlevel# 发言者等级
  talk_time# 发言时间 DateTime 类型
  chat_type # welcome

yuwan 类型需要的字段
  room_id  # 房间号
  username # 发言者用户名
  userlevel# 发言者等级
  talk_time# 发言时间 DateTime 类型
  chat_type # yuwan

forbid 类型需要的字段
  room_id  # 房间号
  manager  # 管理员名字
  username # 发言者用户名
  talk_time# 发言时间 DateTime 类型
  chat_type # forbid

chat 类型需要的字段
  room_id  # 房间号
  text     # 正文
  username # 发言者用户名
  talk_time# 发言时间 DateTime 类型
  chat_type # chat

创建聊天记录的 HTTP API

提交一个或多个聊天记录(四种类型)

url 
  /api/chat_lines
method
  post 
params
  params[:chat_lines] => {
    "0" => {
      room_id    => xxx,
      :manager   => xxx,
      :text      => xxx,
      :username  => xxx,
      :userlevel => xxx,
      :talk_time   => 1422951502123,# Time.at(1422951502123/1000) => 2015-02-03 16:18:22 +0800
      :chat_type   => "forbid"
    },
   "1" => {
     ....
   }
  }
ben7th commented 9 years ago

需要针对普通类型的聊天去索引其中的 text 字段,以便于进行全文搜索