使用ELK来可视化微信群聊记录

自从有了itchat这个神器之后,一直在考虑能做些什么东西。
先后做了发送撤回消息的bot和推荐spotify音乐的bot,到头来,所有的聊天记录都静静地躺在我的redis里面,需要利用起来也十分麻烦。
于是最近,我突然想到,既然ELK能用来可视化log,那何尝不能用来可视化一下微信的聊天记录呢。

需要的东西

  1. ELK全家桶。

  2. Redis,用来通过在itchat中pub,在logstash中sub来获取微信聊天内容。

  3. Itchat。基于web微信的第三方SDK。

Step by Step

首先自然需要写个Itchat的脚本来获取群消息。例子看文档已经足够。

接下来假设我们获取到一个类似

1
message = {"msg_from": "gyorou", "msg_content": "fuck the world"}

的消息内容。我们需要把 message传递给logstash,再由logstash写入elasticsearch。

我想到的方法是使用Redis的pubsub方法。

先把message dump成 string的形式,交给redis publish出去。

1
2
3
4
5
6
7
8
import json
import redis
import itchat

# 省略
redis = redis.client(...)
message = json.dumps(message)
redis.publish('wechat_message', message)

为了接收publish的message,logstash应该有如下的输入配置。

1
2
3
4
5
6
7
input {
redis {
data_type => "channel"
codec => "json"
key => "wechat_message"
}
}

注意点是需要codec => "json"这一项,因为,我们publish的是一个string,我们要需要将其按照json的格式解析出来里面的内容。

接下来,配置logstash的输出。

1
2
3
4
5
6
output {
elasticsearch {
index => "from_my_wechat"
doucument_type => "chatlog"
}
}

以上两项分别对应elasticsearch的index和type。这样我们可以通过localhost:9200/from_my_wechat/chatlog的形式访问和操作被索引的聊天内容。

最后打开kibana,把我们的索引项目称from_my_wechat填进去就大功告成了。
随便点开图标一览,画两个图呗,比如统计一下谁特么发言最多这种。


To do

  • 对中文的field需要进行分词。
  • 对占用较大的无用field需要整理移除。

以上。