原文 偷懒省略了一些细节。有争议再解释讨论吧。
自从有了 itchat 这个神器之后,一直在考虑能做些什么东西。 先后做了发送撤回消息的 bot 和推荐 spotify 音乐的 bot,到头来,所有的聊天记录都静静地躺在我的 redis 里面,需要利用起来也十分麻烦。 于是最近,我突然想到,既然 ELK 能用来可视化 log,那何尝不能用来可视化一下微信的聊天记录呢。
需要的东西
-
ELK 全家桶。
-
Redis,用来通过在 itchat 中 pub,在 logstash 中 sub 来获取微信聊天内容。
-
Itchat。基于 web 微信的第三方 SDK。
Step by Step
首先自然需要写个 Itchat 的脚本来获取群消息。例子看文档已经足够。
接下来假设我们获取到一个类似
message = {"msg_from": "gyorou", "msg_content": "fuck the world"}
的消息内容。我们需要把 message 传递给 logstash,再由 logstash 写入 elasticsearch。
我想到的方法是使用 Redis 的 pubsub 方法。
先把 message dump 成 string 的形式,交给 redis publish 出去。
import json
import redis
import itchat
# 省略
redis = redis.client(...)
message = json.dumps(message)
redis.publish('wechat_message', message)
为了接收 publish 的 message,logstash 应该有如下的输入配置。
input {
redis {
data_type => "channel"
codec => "json"
key => "wechat_message"
}
}
注意点是需要codec => "json"这一项,因为,我们 publish 的是一个 string,我们要需要将其按照 json 的格式解析出来>里面的内容。
接下来,配置 logstash 的输出。
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 需要整理移除。
以上。