更换评论系统:从多说到网易云跟贴

多说将于2017/06/01关闭服务,Disqus仍不可用。今天试了下网易云跟贴,有很喜欢的地方,也有很不满意的地方。

1. 本站与多说

网站建站之初(2014年),那会Disqus已经被墙了,经过细致的比较,最后选择了多说,一用就是两年多,共产生686条评论(包括自己的回复)。

有一段时间,多说黄色广告垃圾评论特别多,加了关键词过滤,没有一点效果。那会萌生了更换评论系统的念头,但实在没找到好的替代品。尽管多说不支持Markdown,偶尔刷不出来(可能是因为在国外的原因),但总体上用着很舒服。

上周收到多说网邮件,说将于2017年6月1日关闭服务(详情见:重要通知: 多说即将关闭)。将多说插件停用,原生态的评论系统丑得不行,不得不找一个替代品。今天试了下网易云跟贴,有很喜欢的地方,也有很不满意的地方。

最后,感谢多说团队提供的便利。截图一张用于怀念。

duoshuo_example

2. 从多说到网易云跟贴

安装网易云跟贴很简单。安装插件,详情见:网易云跟贴帮助文档 - Wordpress插件安装;导出多说评论数据。进入多说管理后台,点击左侧工具,点击导出数据,勾选包含文章数据包含评论数据,导出评论;将评论数据导入网易云跟贴,详情见:网易云跟贴帮助文档 - 导入数据

用了一下午,说下体验。先说说优点:支持多说评论导入,无需自己转换格式;界面很简洁,评论盖楼嵌套很直观(移动端也做得很好),举例如下:

网易云跟贴示例

但是,缺点也很明显:

  • 评论数据不能备份到Wordpress本地数据库
  • 不支持匿名评论(输入昵称、电子邮件),必须登录(目前只有3种选择:网易、微博、QQ)才能评论
  • 怀疑评论没有全部导入(比如没有头像,有些评论缺失)
  • 无论是后台管理还是提交评论,响应都很慢(可能是因为在国外访问的原因)
  • 不支持Markdown(这点不能怪罪于云跟贴,貌似只有原生态评论和Disqus支持Markdown)
  • 没有回复通知,需要登录后台查看(多说那种有新评论,打开博客就能看到,很方便)

除此之外,还有一个很严重的问题。在云跟贴留言,前台刷新就看不到留言了(设置的是先发后审),后台要过很久(高达1个小时甚至更久,难道是系统批处理审核?)才能看到评论。我就想是不是因为开通了站长审核。然而,尽管我关闭了站长审核,提交评论还是显示“跟帖被审核”,进入后台,也看不到这个留言(还是要等很久)。这点体验相当不友好,访客会以为自己没成功提交留言,进而多次提交。

哦,对了,修改评论昵称和头像,需要在网易贴吧上改,不在云跟贴的管理后台。

3. 评论数据处理

多说和网易云跟贴存储评论的格式都是JSON,处理起来很方便。关于JSON,摘抄Wikipedia如下:

JSON (/ˈdʒeɪsən/) is an open-standard format that uses human-readable text to transmit data objects consisting of attribute–value pairs. It is the most common data format used for asynchronous browser/server communication, largely replacing XML, and is used by AJAX.

JSON is a language-independent data format. It was derived from JavaScript, but as of 2017 many programming languages include code to generate and parse JSON-format data. The official Internet media type for JSON is application/json. JSON filenames use the extension .json.

3.1 多说导出的格式

勾选了包含文章数据包含评论数据,导出的文件export.json包含threadsposts数据,详情见:多说导出的评论文件说明。这里,将其摘抄过来,方便日后分析评论。

threads文章记录,属性如下:

# threads: a list of dicts, each dict contains,
thread_id       多说文章ID
thread_key      文章在当前站点中的唯一表示符,例如文章ID。
title           文章的标题
url             文章链接
author_key      文章作者在本站的ID
author_id       文章作者的多说ID,如果为空,说明发表文章时没有登陆多说账号
likes           文章被点【赞】的次数
views           文章浏览数

# 一个实例
{   u'thread_key'   :   u'1609', 
    u'views'        :   0, 
    u'url'          :   u'http://sparkandshine.net/wordpress-load-google-open-sans-normally/',
    u'created_at'   :   u'-0001-11-30T08:00:00+08:00', 
    u'title'        :   u'WordPress\u6b63\u5e38\u52a0\u8f7d\u8c37\u6b4c\u5b57\u4f53Google Open Sans', 
    u'site_id'      :   u'1071326', 
    u'updated_at'   :   u'2015-12-11T06:45:20+08:00', 
    u'thread_id'    :   6226763126134539009, 
    u'likes'        :   0, 
    u'author_id'    :   u'5622282', 
    u'author_key'   :   u'1'}

posts是多说的评论,不包括微博、删除评论、垃圾评论;

# posts: a list of dicts, each dict contains,
post_id         多说评论ID
thread_id       这条评论对应的文章记录
message         评论内容
created_at      评论发表时间
author_id       作者在多说的id。空表示匿名用户
author_name     作者显示名。有可能为空
author_email    作者邮箱。有可能为空
author_url      作者填写的URL。有可能为空
ip              作者的IP地址

# 一个实例
{   u'post_key'     :   u'1177935394138750992', 
    u'thread_key'   :   u'290', 
    u'thread_id'    :   1177935394138751065, 
    u'author_email' :   u'', 
    u'ip'           :   u'113.251.219.43', 
    u'created_at'   :   u'2014-10-31T10:53:42+08:00', 
    u'site_id'      :   1071326, 
    u'updated_at'   :   u'1970-01-01T08:00:00+08:00', 
    u'author_name'  :   u'\u65e0\u4e3a\u4f55\u81f3', 
    u'post_id'      :   1177935394138750992, 
    u'parents'      :   [], 
    u'likes'        :   0, 
    u'message'      :   u'\u697c\u4e3b\u592a\u597d\u4e86\uff0c\u6574\u7406\u51fa\u8fd9\u4e9b\u6709\u7528\u7684\u4e1c\u897f\uff0c\u65b0\u624b\u521a\u63a5\u89e6\uff0c\u76fc\u671b\u80fd\u8ddf\u697c\u4e3b\u591a\u4ea4\u6d41\u5b66\u4e60\uff01\uff01\uff01', 
    u'author_key'   :   u'0', 
    u'author_id'    :   9493092, 
    u'author_url'   :   u'http://weibo.com/2560944840'}

有了这些之后,就可以处理评论数据了。比如我想筛选出所有评论者的用户名和邮箱,Python源代码如下:

from __future__ import unicode_literals

import json

with open('export.json') as data_file:    
    data = json.load(data_file)

# The total number of comments
print(len(data["posts"]))

author_emails = set([(d['author_name'], d['author_email']) 
                            for d in data["posts"] if d['author_email']])

#print(len(emails))

for author_name, author_email in author_emails:
    s = '{:<20s}\t{}'.format(author_name, author_email)
    print(s)

3.2 网易云跟贴

顺手把网易云跟贴导出的文件data.json也了解下,方便日后分析评论。其格式如下,详情见:网易云跟贴帮助文档 - 数据导出

# a list of dicts
[{
  "title"             :   "标题",
  "url"               :   "网址",
  "sourceId"          :   "文章标识",
  "ctime"             :   发贴时间,
  "comments":             //跟贴信息
    [{
      "cid"           :   "跟贴ID",
      "ctime"         :   发贴时间,
      "content"       :   "跟贴内容",
      "pid"           :   "盖楼父楼层ID",
      "ip"            :   "发贴IP",
      "port"          :   0,
      "sc"            :   "web",
      "vote"          :   顶数,
      "against"       :   踩数,
      "anonymous"     :   false,
      "user":             //用户信息 
        { "userId"    :   "用户ID",
          "nickname"  :   "用户昵称",
          "avatar"    :   "用户头像",
          "anonymous" :   是否匿名
        }
    }]
}]

# 一个实例
[
{  "title"                          :   "《圆桌派》片尾曲",
    "url"                           :   "sparkandshine.net/?p=2320",
    "sourceId"                      :   "2320",
    "ctime"                         :   1485895738000,
    "comments":[{"cid"              :   "55307728",
                "ctime"             :   1487630150000,
                "content"           :   "还是自己平台靠谱,视频中画面和音频同步。",
                "pid"               :   "0",
                "ip"                :   "79.143.143.146",
                "port"              :   0,
                "sc"                :   "",
                "vote"              :   0,
                "against"           :   0,
                "anonymous"         :   false,
                "user":{"userId"    :   "112120900",
                        "nickname"  :   "SparkandShin",
                        "avatar"    :   "http://img5.cache.netease.com/tie/images/yun/photo_default_62.png",
                        "anonymous" :   false}
                }]
}, ...
]
本文系Spark & Shine原创,转载需注明出处本文最近一次修改时间 2022-04-13 22:03

results matching ""

    No results matching ""