使用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需要整理移除。

以上。

Javascript Kibana Laravel Logstash NAT Nginx Postfix Postgresql Progressive Rails Rails 微信小程序 Ruby Ruby Mastodon SNS Sidekiq Sqlite3 Swift Tmux Turbolinks Vim Vue Web Webpush awk bash zsh shell bitcoin curl docker encoding hexo html iptables irkit jq oauth2 php pushover strategy swift ufw vue watchos wechat 工具 微信 微信小程序 树莓派 生活 虚拟货币 面试 드라마